# detect-coverage.cmake -- Detect supported compiler coverage flags
# Licensed under the Zlib license, see LICENSE.md for details
+# Attempt to enable gcov-style code coverage
macro(add_code_coverage)
- # Check for -coverage flag support for Clang/GCC
+ # Check for --coverage flag support
set(CMAKE_REQUIRED_LINK_OPTIONS -coverage)
- check_c_compiler_flag(-coverage HAVE_COVERAGE)
+ check_c_compiler_flag("--coverage" HAVE_COVERAGE)
set(CMAKE_REQUIRED_LINK_OPTIONS)
-
if(HAVE_COVERAGE)
- add_compile_options(-coverage)
- add_link_options(-coverage)
- message(STATUS "Code coverage enabled using: -coverage")
+ # Check for --coverage -fcondition-coverage flag support
+ set(CMAKE_REQUIRED_LINK_OPTIONS -coverage -fcondition-coverage)
+ check_c_compiler_flag("--coverage -fcondition-coverage -Wno-coverage-too-many-conditions" HAVE_CONDITION_COVERAGE)
+ set(CMAKE_REQUIRED_LINK_OPTIONS)
+
+ if(HAVE_CONDITION_COVERAGE)
+ # Both --coverage and -fcondition-coverage supported
+ add_link_options(-coverage -fcondition-coverage)
+ add_compile_options(--coverage -fcondition-coverage -Wno-coverage-too-many-conditions)
+ message(STATUS "Code coverage enabled using: --coverage -fcondition-coverage")
+ else()
+ # Only --coverage supported.
+ add_link_options(-coverage)
+ add_compile_options(--coverage)
+ message(STATUS "Code coverage enabled using: --coverage")
+ endif()
else()
- # Some versions of GCC don't support -coverage shorthand
+ # Some versions of GCC don't support --coverage shorthand
set(CMAKE_REQUIRED_LINK_OPTIONS -lgcov -fprofile-arcs)
- check_c_compiler_flag("-ftest-coverage -fprofile-arcs -fprofile-values" HAVE_TEST_COVERAGE)
+ check_c_compiler_flag("-ftest-coverage -fprofile-arcs" HAVE_TEST_COVERAGE)
set(CMAKE_REQUIRED_LINK_OPTIONS)
if(HAVE_TEST_COVERAGE)
- add_compile_options(-ftest-coverage -fprofile-arcs -fprofile-values)
add_link_options(-lgcov -fprofile-arcs)
- message(STATUS "Code coverage enabled using: -ftest-coverage")
+ add_compile_options(-ftest-coverage -fprofile-arcs)
+ message(STATUS "Code coverage enabled using: -ftest-coverage -fprofile-arcs")
else()
- message(WARNING "Compiler does not support code coverage")
+ # Failed to enable coverage, this is fatal to avoid silent failures in CI
+ message(FATAL_ERROR "WITH_CODE_COVERAGE requested, but unable to turn on code coverage with compiler/linker")
set(WITH_CODE_COVERAGE OFF)
endif()
endif()