summaryrefslogtreecommitdiff
path: root/neozip/cmake/detect-coverage.cmake
blob: ff993cf9ffef7629168222f92e0935ee3ba9e467 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 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
    set(CMAKE_REQUIRED_LINK_OPTIONS -coverage)
    check_c_compiler_flag("--coverage" HAVE_COVERAGE)
    set(CMAKE_REQUIRED_LINK_OPTIONS)
    if(HAVE_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
        set(CMAKE_REQUIRED_LINK_OPTIONS -lgcov -fprofile-arcs)
        check_c_compiler_flag("-ftest-coverage -fprofile-arcs" HAVE_TEST_COVERAGE)
        set(CMAKE_REQUIRED_LINK_OPTIONS)

        if(HAVE_TEST_COVERAGE)
            add_link_options(-lgcov -fprofile-arcs)
            add_compile_options(-ftest-coverage -fprofile-arcs)
            message(STATUS "Code coverage enabled using: -ftest-coverage -fprofile-arcs")
        else()
            # 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()

    # 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 "${CMAKE_C_FLAGS} -O0")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
    endif()
endmacro()