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

2024-04-29 06:00:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在考虑用SCons做一个新项目。它看起来很不错,不过我发现VariantDir相当混乱。

我有一个简单的项目,在一个目录中有几个C源文件,我想在“normal”和“profile”模式下构建——gcc有两组不同的选项。我希望输出分别位于normal/和profile/目录中。

为了测试,我缩减到只有一个源文件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文件,以及它们之间的导入/导出变量。这似乎不太令人愉快。)


Tags: 文件项目目录releaseprofileprogramsconspg
3条回答

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

Note that when you're not using an SConscript file in the src subdirectory, you must actually specify that the program must be built from the build/hello.c file that SCons will duplicate in the build subdirectory.

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

是的,VariantDir在scons中很混乱。尽管没有很好地宣传,但是您可以将SConstruct和SConscript放在同一个目录中,使用当前目录作为源目录

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

以及

# SConscript
Program('main.c')

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

我可以使用此调用在生成目录中分离二进制文件:

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

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

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

基本上,提供src_dir参数作为从生成目录返回源目录的路径。

相关问题 更多 >