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

时间:2015-07-30 08:01:16

标签: c++ makefile g++ clang scons

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

  1. 使用最新的带有大量标记的g ++来查找所有可能的错误和警告
  2. 用clang按照上面的方式做并检查风格。
  3. g ++与3rdpart库兼容(没有更新版本,但整个产品基于库) 它的工作原理如下:如果任何目标文件应该重新编译:步骤1,如果成功则为2,如果成功,则执行3。它是用makefile完成的,但我打算用scons来做它。问题是在当前解决方案中,对象文件1和2保存在/ dev / null。
  4. 我尝试过这样的话: 同一目录中的3个文件:hello.cc,Sconstruct,Sconscript

    SConstruct

    #!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)
    

    SConscript

    #!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)
    

1 个答案:

答案 0 :(得分:1)

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'要铿锵的文件
  2. 您希望在clang对象之后构建buildObjects - 更改顺序
  3. 仍然 - 构建到/dev/null可能会破坏依赖树,你可能会考虑这样的事情:

    checkWithClang = env.Object(source = src, CC="clang", OBJPREFIX="clang-")
    

    这将使用clang构建所有.c文件并存储额外的.o文件,允许scons仅重建必要的内容