我正在尝试尽可能方便地配置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”也可以正常工作。知道发生了什么吗?

最佳答案

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

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

注意路径中的'#'字符。在SCons中,这意味着相对于SConstruct文件所在的目录。 Glob() documentationSConstruct relative path documentation.

另外,您可以配置SConstruct文件中的所有内容,然后使用SConscript()函数在src目录中加载SConscript文件,这将导入在SConstruct中创建的env并只需指定要编译的文件和必要的目标即可。这将是更可靠的方法,使添加更多源目录(每个目录都有自己的SConscript文件)变得更加容易。这称为SCons Hierarchical Builds

关于c++ - 连续运行两次后的scons行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10626891/

10-10 08:28