我一直在尝试让scons将exe,obj,lib和dll文件输出到特定的构建目录。
我的文件结构如下:
/projectdir
/build
/bin
/obj
/source
/subdirs
/..
SConstruct
基本上,我现在得到的是我的源目录被obj文件污染了。我宁愿把它放在一个地方。
SConstruct文件如下所示:
env.VariantDir('build', 'source', duplicate = 0)
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp'])
答案 0 :(得分:10)
我发现最简单的方法是使用2个文件,一个SConstruct文件和一个单独的SConscript。
在SConstruct中,您只需调用另一个文件并指定构建输出的目录:
# content SConstruct
SConscript('main.scons', variant_dir='build', duplicate=0)
然后在'main.scons'中你做你构建的肉。您可以忘记此文件中的变体目录。
# content of main.scons
env = Environment()
env.Program('Hierarchy',
source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp'])
答案 1 :(得分:8)
使用一个SConstruct文件(对于一个小项目)使VariantDir工作并不困难,但由于单文件和双文件用例的配置不同,因此非常令人困惑
只有SConstruct:
env = Environment()
env.VariantDir('build', 'src', duplicate=0)
files = Glob('build\*.c')
env.Program("build\program", files)
请注意源文件在.\src
中的位置,但.\build
被指定为位置。输出也必须与.\build
“加前缀”,否则编译的程序将驻留在SConstruct文件的目录中。
执行脚本时,SCons将从*.c
编译.\src
个文件,并将生成的对象放到.\build
。
难怪他们将BuildDir重命名为VariantDir以避免混淆(没有太大成功)。
答案 2 :(得分:3)
VariantDir
(也在user guide中描述)告诉scons将生成的文件放在一个单独的目录中。在旧版本的scons中,此函数名为BuildDir
。
您可能还想阅读避免重复源目录(在用户指南和维基上都有描述)。
答案 3 :(得分:1)
我使用的是像richq的答案这样的双文件方法,但是虽然最终的构建产品(libs,program)进入了正确的变体目录,但目标文件仍然会进入源目录。 / p>
解决方案原来是通过相对路径而不是绝对路径来源文件。我不明白为什么。
我的第二个scons文件最初看起来像这样。注意通过绝对路径进行通配 - 当我第一次写这篇文章时,我没有意识到路径会自动相对于scons文件。
import os, inspect
env = Environment()
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True)
env.Program('Foo', source = src)
这导致* .obj结束于src /和我的变种dir下的程序。当我将其更改为以下内容时,目标文件也转到了变量目录:
env = Environment()
src = Glob("src/*/*.c*", strings=True, source=True)
env.Program('Foo', source = src)
使用绝对路径可能是一个noob错误 - 我对scons和Python都相对较新 - 但我想我会分享它,以防其他人遇到同样令人沮丧的问题。