10

我正在考虑将SCons用于一个新项目。它看起来真的很好,虽然我觉得VariantDir很混乱。

我有一个简单的项目,在一个目录中有几个 C 源文件,我想在“正常”和“配置文件”模式下构建——有两组不同的 gcc 选项。我希望输出分别进入 normal/ 和 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 文件, 以及在它们之间导入/导出变量。这似乎并不令人愉快。)

4

3 回答 3

9

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

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

# SConscript
Program('main.c')

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

于 2009-07-02T14:10:23.257 回答
8

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

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

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

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

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

于 2009-07-25T04:39:19.287 回答
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'])

当我scons在 Linux 上运行它时。

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

于 2014-07-01T08:36:15.707 回答