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

我正在考虑将SCons用于新项目。 它看起来非常好,虽然我发现VariantDir非常混乱。

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

为了测试,我已经减少了一个源文件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']) 

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

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

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

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

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

 # SConstruct SConscript('SConscript', build_dir='build', src='.') 

 # SConscript Program('main.c') 

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

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

 # SConstruct SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0) 

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

 # SConstruct SConscript('SConscript', variant_dir='build/release', src_dir='../..', duplicate=0) 

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

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

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

 VariantDir('release','.',duplicate=0) env=Environment() env.Program('release/t',['release/t.c']) 

当我在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/to -c tc gcc -o release/t release/to scons: done building targets. 

我想它也适用于Win32