我处理的项目中每个目标文件都被构建了 3 次:
- 使用带有大量标志的最新 g++ 来查找所有可能的错误和警告
- 使用 clang 以执行上述操作并检查样式。
- g++ 与 3rdpart 库兼容(没有更新版本,但整个产品都基于库) 它是这样工作的:如果应该重新编译任何目标文件:步骤 1,如果成功则执行 2,如果成功则执行 3。它是用 makefile 完成的,但我打算使用 scons 来完成它。问题是在当前解决方案中,来自 1 和 2 的目标文件被保存到/dev/null。
我试过这样的东西: 同一目录下3个文件:hello.cc、Sconstruct、Sconscript
构造
#!python
warningFlags = ' -Wall -Wextra -Werror' # and many more
env = Environment(CXX = 'g++-4.8', parse_flags = warningFlags, CPPPATH = '.')
builtObjects = env.SConscript('SConscript', variant_dir='built', duplicate=0, exports='env')
env.Program(target = 'hello', source = builtObjects)
征兵
#!python
Import('env')
builtObjects = env.Object(source = 'hello.cc')
checkWithClang = env.Command('/dev/null', builtObjects, 'clang -o $TARGET -Wall -Werror')
env.Depends(checkWithClang, builtObjects)
Return('builtObjects')
scons 的输出是:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: built
g++-4.8 -o built/hello.o -c -Wall -Wextra -Werror -Ibuilt -I. hello.cc
g++-4.8 -o hello built/hello.o
scons: done building targets.
编辑: 是否有可能以某种方式检查 scons: 是否应该重建目标文件? 伪代码:
src = 'hello.cc'
if shouldObjectFileBeRebuilt(src):
checkWithClang = env.Command('/dev/null', builtObjects, 'clang -o $TARGET -Wall -Werror')
builtObjects = env.Object(source = src)
env.Depends(checkWithClang, builtObjects)
最佳答案
尝试
src = "hello.cc"
builtObjects = env.Object(source = src)
checkWithClang = env.Command('/dev/null', src, 'clang -o $TARGET -Wall -Werror')
env.Depends(builtObjects, checkWithClang)
- buildobjects 代表 '.o' 文件,所以你应该把 '.c' 文件放到 clang 中
- 您希望在 clang 对象之后构建 buildObjects - 更改顺序
仍然 - 构建到 /dev/null
中可能会破坏依赖树,您可能会考虑这样的事情:
checkWithClang = env.Object(source = src, CC="clang", OBJPREFIX="clang-")
这将使用 clang 构建所有 .c 文件并存储额外的 .o 文件,允许 scons 仅重建必要的内容
关于c++ - Scons:如何在编译前使用不产生任何输出文件的命令检查文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31718236/