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

时间:2009-07-02 12:26:41

标签: python c makefile scons

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

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

为了测试,我已经减少了一个源文件t.c,其中包含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.o和t.exe放入release /,但它会将它们放在当前目录中。并且我无法在没有注释3个配置文件的情况下运行它 - 如果我这样做,我会收到此错误:

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

# SConscript
Program('main.c')

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

答案 1 :(得分:8)

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

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

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

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

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

答案 2 :(得分:3)

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

  

请注意,当您未在src子目录中使用SConscript文件时,必须实际指定必须从SCons将在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/t.o -c t.c
gcc -o release/t release/t.o
scons: done building targets.

我想它也适用于Win32