为什么SCons VariantDir()没有将输出放在给定目录中?

Ben*_*oyt 8 c python makefile scons

我正在考虑将SCons用于新项目.它看起来真的很好,虽然我发现VariantDir很混乱.

我有一个简单的项目,在一个目录中有一些C源文件,我想在"正常"和"配置文件"模式下构建 - 与gcc有两组不同的选项.我希望输出分别进入普通/和配置文件/目录.

为了进行测试,我已经减少了一个源文件tc,其中有一个main().我的SConstruct文件位于同一目录中,如下所示:

normal = DefaultEnvironment(tools=['mingw'], CCFLAGS = '-O2')
normal.VariantDir('release', '.', duplicate=0)
normal.Program('t', ['t.c'])

#profile = normal.Clone(CCFLAGS='-O2 -pg', LINKFLAGS = '-pg')
#profile.VariantDir('profile', '.', duplicate=0)
#profile.Program('t', ['t.c'])
Run Code Online (Sandbox Code Playgroud)

当我运行scons时,我希望它将to和t.exe放入release /,但它将它们放在当前目录中.并且我无法运行它,并且3个配置文件行未注释 - 如果我这样做,我会收到此错误:

scons:***为同一目标指定了两个具有不同操作的环境:to

基本上,我不确定为什么我的VariantDir()调用没有告诉scons将输出放在指定的输出目录中release.

(我在文档和新闻组中读了很多,但没有回答这个问题.我最接近的是这个页面,它描述了类似的东西,但它涉及一个单独的src /目录和两个独立的scons文件,以及在它们之间导入/导出变量.这看起来不太愉快.)

Dav*_*eau 8

是的,VariantDir在scons中令人困惑.虽然宣传不好,但您可以将SConstruct和SConscript放在同一目录中,使用当前目录作为源目录

# SConstruct
SConscript('SConscript', build_dir='build', src='.')
Run Code Online (Sandbox Code Playgroud)

# SConscript
Program('main.c')
Run Code Online (Sandbox Code Playgroud)

我从来没有找到一种方法来避免使用两个文件,同时保持我的理智试图理解变量目录:)


Vla*_*sev 8

我能够使用此调用在构建目录中分隔二进制文件:

# SConstruct
SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0)
Run Code Online (Sandbox Code Playgroud)

如果要将二进制文件放入以下两个级别的目录中,请执行以下操作:

# SConstruct
SConscript('SConscript', variant_dir='build/release', src_dir='../..', duplicate=0)
Run Code Online (Sandbox Code Playgroud)

基本上,将src_dir参数作为从构建目录返回到源目录的路径.


wcy*_*wcy 5

正如http://www.scons.org/wiki/VariantDir%28%29所说,

请注意,当您不使用 src 子目录中的 SConscript 文件时,您实际上必须指定必须从 build/hello.c 文件构建程序,SCons 将在 build 子目录中复制该文件。

VariantDir('release','.',duplicate=0)
env=Environment()
env.Program('release/t',['release/t.c'])
Run Code Online (Sandbox Code Playgroud)

当我在 Linux 上运行它时scons

scons -u . 
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: release
gcc -o release/t.o -c t.c
gcc -o release/t release/t.o
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)

我想它也可以在 Win32 上运行