3

我正在尝试尽可能方便地配置 scons。我的构建脚本工作正常,但我仍然遇到一件事。

使用 make,如果我连续运行两次“make”,第二次将什么也不做,因为它会检测到目标是最新的(因为我刚刚构建了它)。

如何确保 scons 的行为相同?现在,如果我第二次运行 scons ,它认为需要再次构建目标,此外,由于所有剩余 .o 文件的依赖关系冲突(因为没有首先调用 clean ),它无法构建。

我怎样才能让 scons 自己处理这个问题,即检测目标是否过时,如果是,则相应地重建?

另外,我注意到如果我打电话

scons
scons -q

构建然后直接提问,退出状态仍然始终为 1。如果我理解正确,它应该是 0,因为目标是最新的。

任何帮助表示赞赏!

编辑:

这是我的 SConstruct 文件。如果我做错了什么,请提请我注意:

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = list('./src/' + x for x in os.listdir("./src"))

pathList = ['./include',
            'C:/boost',
            'C:/frameworks/SFML/include',
            'C:/Python27/include']

libPathList = ['C:/boost/stage/lib', 'C:/frameworks/SFML/lib', 'C:/Python27/libs']
libList = ['boost_thread-mgw45-mt-1_46_1',
           'boost_python-mgw45-mt-1_46_1', 
           'sfml-system',
           'sfml-window',
           'sfml-graphics',
           'python27']

env.Append(CPPPATH=pathList)
env.Append(LIBPATH=libPathList)
env.Append(LIBS=libList)

t = env.Program(target='./bin/build_result.exe', source=sourceList)
Default(t)

是的,我知道我应该添加适当的调试选项,但我可以稍后改进文件。但是,我不知道是否有任何与我遇到的问题有关的问题。此外,此文件完全适用于较小的测试项目:

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = os.listdir('.')
sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

t = env.Program(target='./result.exe', source=sourceList)
Default(t)

“scons -q”也按预期工作。知道发生了什么吗?

4

2 回答 2

2

在 SCons 中指定要编译的源文件的一种更常见的方法如下:

sourceList = Glob('#/src/*.cpp')
t = env.Program(target='#/bin/build_result.exe', source=sourceList)

注意'#'路径中的字符。在 SCons 中,这意味着相对于 SConstruct 文件所在的目录。Glob() 文档S构造相对路径文档。

此外,您可以在 SConstruct 文件中配置所有内容,然后使用 SConscript() 函数在srcdir 中加载 SConscript 文件,这将导入在 SConstruct 中创建的 env 并简单地指定要编译的文件和必要的目标。这将是更多的未来证明,可以更容易地添加更多的源目录,每个目录都有自己的 SConscript 文件。这称为SCons 分层构建

于 2012-05-17T06:52:22.717 回答
1

啊哈,发现问题了。在此行下方:

sourceList = list('./src/' + x for x in os.listdir("./src"))

我应该添加

sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

第一个构建,.o 文件是在 ./src 目录中生成的,所以第二次它选择目标文件作为源。问题解决了。

于 2012-05-16T22:04:35.270 回答