c++ - Scons:如何在编译前使用不产生任何输出文件的命令检查文件?

标签 c++ makefile g++ clang scons

我处理的项目中每个目标文件都被构建了 3 次:

  1. 使用带有大量标志的最新 g++ 来查找所有可能的错误和警告
  2. 使用 clang 以执行上述操作并检查样式。
  3. 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)
  1. buildobjects 代表 '.o' 文件,所以你应该把 '.c' 文件放到 clang 中
  2. 您希望在 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/

相关文章:

c++ - 在 C++ : prevent warning printout 中使用 libtiff 读取 tiff 文件

linux - 在多核或分布式系统上编译程序

C++ 和对 XML_Parser 的 undefined reference

c++ - Visual Studio : Variable is being used without being initialized

c++ - 错误 C2664 : cannot convert argument 1 from 'NvPhysicalGpuHandle'

makefile - automake环境变量条件

linux - 当我尝试安装 yuvmotionfps 时,无法识别的命令行选项 '-march'

c++ - 为什么默认情况下初始化局部变量?

c++ - 用方括号 [] 初始化 std::vector<int> ;怎么了?

c++ - 为什么数组不打印第一个元素?