为什么SCons的VariantDir()不把输出给定目录?
题
我在考虑使用 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到发布/,但是却让他们在当前目录。我不能运行它与3条轮廓线注释掉在所有 - 如果我这样做,我得到这个错误:
<强> scons的:***两种环境具有不同的行动是对同一目标指定:T.O 强>
基本上,我不能确定为什么我的VariantDir()调用没有告诉scons的把输出在指定的输出目录,release
。
(我读过的文档和新闻组公平一点,但没有什么回答了这个问题。我来最接近的是的此页面,它描述了类似的事情,但它涉及到一个单独的src /目录和两个独立的scons的文件,并导入/导出它们之间的变量。这似乎不愉快。)
解决方案
是,VariantDir在scons的混淆。尽管没有很好地通告,就可以把两个SConstruct和SConscript在相同的目录中,使用当前目录作为源目录
# SConstruct
SConscript('SConscript', build_dir='build', src='.')
和
# SConscript
Program('main.c')
我从来没有找到一种方法来避免使用两个文件,同时保持我的理智试图了解变种DIR:)
其他提示
我是能够使用该呼叫在一个构建目录以分离二进制文件:
# 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文件,你必须实际指定的程序必须从构建/ hello.c的文件,该文件将使用SCons在构建子目录复制建造。
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工作