【问题标题】:scons behavior after running twice in a row连续运行两次后的 scons 行为
【发布时间】:2012-05-16 21:20:03
【问题描述】:

我正在尝试尽可能方便地配置 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 默认执行您所描述的操作(在一个简单的“hello world”类型的应用程序上试试看)。因此,您所看到的原因与您的 SConstruct 文件的具体内容有关。您能否提供一个显示相同行为的简化示例?
  • SCons 是我用过的最智能的系统,它只构建它需要的东西。你在某个地方遇到了一些奇怪的问题。 :)
  • ^ 我完全同意到目前为止我印象非常深刻。这就是我感到困惑的原因。
  • 嘿,我尝试了一个像您建议的更简单的示例,并在上面发布了两个文件。它可能与项目结构(目录)或包含或库有关吗?
  • 考虑使用Glob函数。

标签: c++ build environment scons


【解决方案1】:

在 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 中创建的环境并简单地指定要编译的文件和必要的目标。这将是更多的未来证明,可以更容易地添加更多的源目录,每个目录都有自己的 SConscript 文件。这称为SCons Hierarchical Builds

【讨论】:

  • @user48998,很高兴为您提供帮助。我在对相应文档的回答中添加了 3 个不同的链接。
【解决方案2】:

啊哈,找到问题了。在此行以下:

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

我应该加的

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2021-03-15
    • 1970-01-01
    • 2013-02-08
    • 2018-08-13
    相关资源
    最近更新 更多