如何强制Scons输出(exe,obj,lib& dll)到特定的构建目录?

时间:2010-09-15 17:28:02

标签: scons

我一直在尝试让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'])

4 个答案:

答案 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都相对较新 - 但我想我会分享它,以防其他人遇到同样令人沮丧的问题。