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

10

我在考虑为一个新项目使用SCons。它看起来非常好,但我发现VariantDir相当令人困惑。

我有一个简单的项目,在一个目录中有几个C源文件,并且我想以“正常”和“配置文件”模式构建 - 使用两组不同的选项来gcc。我希望输出分别进入normal/和profile/目录。

为了测试,我只剩下一个源文件t.c,其中有一个main()函数。我的文件位于同一个目录中,看起来像这样:

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个回答

9

是的,在scons中,VariantDir很容易让人感到困惑。虽然没有得到很好的宣传,但您可以将SConstruct和SConscript都放在同一个目录中,使用当前目录作为源目录。

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

并且

# SConscript
Program('main.c')

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


(注:variant dir 是指在 SCons 中,一个指定源代码和生成文件路径的参数)

8
我可以通过以下调用将二进制文件从构建目录中分离出来:
```bash ```
# SConstruct
SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0)

如果你想将二进制文件放在比当前目录深两级的目录中,请按照以下步骤操作:

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

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

5
正如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上工作。


是的,仅当未使用SConscript时,这才是唯一相关的点。 - zonksoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接