我有有时可能会使用clang的cmake项目,有时可能会使用GCC,有时可能会使用MSVC。Cmake是否提供了一些通用方法来启用覆盖范围,或者如果我自己剩下的话,我需要做(GCC和Clang的编译器标志不同,而MSVC没有覆盖范围)?
没有中央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>)