# detect-coverage.cmake -- Detect supported compiler coverage flags # Licensed under the Zlib license, see LICENSE.md for details macro(add_code_coverage) # Check for -coverage flag support for Clang/GCC if(CMAKE_VERSION VERSION_LESS 3.14) set(CMAKE_REQUIRED_LIBRARIES -lgcov) else() set(CMAKE_REQUIRED_LINK_OPTIONS -coverage) endif() check_c_compiler_flag(-coverage HAVE_COVERAGE) set(CMAKE_REQUIRED_LIBRARIES) set(CMAKE_REQUIRED_LINK_OPTIONS) if(HAVE_COVERAGE) add_compile_options(-coverage) add_link_options(-coverage) message(STATUS "Code coverage enabled using: -coverage") else() # Some versions of GCC don't support -coverage shorthand if(CMAKE_VERSION VERSION_LESS 3.14) set(CMAKE_REQUIRED_LIBRARIES -lgcov) else() set(CMAKE_REQUIRED_LINK_OPTIONS -lgcov -fprofile-arcs) endif() check_c_compiler_flag("-ftest-coverage -fprofile-arcs -fprofile-values" HAVE_TEST_COVERAGE) set(CMAKE_REQUIRED_LIBRARIES) 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") else() message(WARNING "Compiler does not support code coverage") set(WITH_CODE_COVERAGE OFF) endif() endif() # Set optimization level to zero for code coverage builds if (WITH_CODE_COVERAGE) # Use CMake compiler flag variables due to add_compile_options failure on Windows GCC set(CMAKE_C_FLAGS "-O0 ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-O0 ${CMAKE_CXX_FLAGS}") endif() endmacro()