CMake的C ++覆盖设置

时间:2019-03-05 07:18:44

标签: c++ cmake

我有CMake项目,有时可能使用clang,有时可能使用gcc,有时可能使用MSVC。 CMake是否提供某种通用方法来启用覆盖范围生成,或者我是否需要自己做(gcc和clang的编译器标志不同,而MSVC没有覆盖范围)?

1 个答案:

答案 0 :(得分:1)

没有中央cmake选项来处理这种情况,但是一些解决方案可能是:

  • 什么都不做。使用kcov收集覆盖率统计信息,不需要特殊的编译器标志。
  • 在常规的DebugRelWithDebugInfo等旁边添加构建配置。然后,仅在有意义时,即在使用clanggcc进行编译时,才选择此构建配置。像这样:

    set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
        "Build options: None Debug Release RelWithDebInfo MinSizeRel Coverage." FORCE)
    
    # Use generator expression to enable flags for the Coverage profile
    target_compile_options(yourExec
        $<$<CONFIG:COVERAGE>:--coverage>)
    
    # Don't forget that the linker needs a flag, too:
    target_link_libraries(yourExec
        PRIVATE $<$<CONFIG:COVERAGE>:--coverage>)
    

    当需要进一步分配编译器类型时,也可以使用生成器表达式。

    $<$<OR:$<CXX_COMPILER_ID:AppleClang>,
        $<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:-someOtherFlag>
    

    但是据我所知,clanggcc之间在覆盖标志方面并没有真正的区别。

  • 不要添加其他构建配置,只需为要用于覆盖率报告的构建配置定义上述标志,可能是Debug。然后,显然有必要排除MSVC

    target_compile_options(yourExec
        $<$<AND:$<CONFIG:DEBUG>,$<NOT:CXX_COMPILER_ID:MSVC>>:--coverage>)
    
    target_link_libraries(yourExec
        PRIVATE $<$<AND:$<CONFIG:DEBUG>,$<NOT:CXX_COMPILER_ID:MSVC>>:--coverage>)