我有CMake项目,有时可能使用clang,有时可能使用gcc,有时可能使用MSVC。 CMake是否提供某种通用方法来启用覆盖范围生成,或者我是否需要自己做(gcc和clang的编译器标志不同,而MSVC没有覆盖范围)?
答案 0 :(得分:1)
没有中央cmake
选项来处理这种情况,但是一些解决方案可能是:
kcov
收集覆盖率统计信息,不需要特殊的编译器标志。在常规的Debug
,RelWithDebugInfo
等旁边添加构建配置。然后,仅在有意义时,即在使用clang
或gcc
进行编译时,才选择此构建配置。像这样:
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>
但是据我所知,clang
和gcc
之间在覆盖标志方面并没有真正的区别。
不要添加其他构建配置,只需为要用于覆盖率报告的构建配置定义上述标志,可能是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>)