File: coverage.cmake

package info (click to toggle)
tcpflow 1.6.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,732 kB
  • sloc: cpp: 18,138; sh: 780; ansic: 347; makefile: 226; python: 55
file content (77 lines) | stat: -rw-r--r-- 3,973 bytes parent folder | download | duplicates (3)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Configuraion of the Coverage build
# Also adds targets to generate coverage repports

# Process this file only if BUILD_TYPE is "Coverage"
if( NOT CMAKE_BUILD_TYPE STREQUAL "Coverage" )
    return()
endif()

# This file support coverage only for GCC and Clang compilers
if( NOT CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
    message(WARNING "<coverage.cmake> Coverage not yet implemented for your compiler '${CMAKE_CXX_COMPILER_ID}' (only GNU and Clang)")
    return()
endif()

# The function assert() may introduce a bias in covered lines count
# To ignore lines about assert() => Disable assert()
add_definitions(-DNDEBUG)

# Compilers GCC and Clang need flag --coverage
# Flag --coverage is a synonym for -fprofile-arcs -ftest-coverage (when compiling) and -lgcov (when linking)
# See https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-g_t_0040command_007bgcov_007d-938
add_compile_options( --coverage )
link_libraries(      --coverage )

# Depending on presence of tools gcov/gcovr/lcov/genhtml => Add targets
# HTML report:
# - gcovr --root . --html --html-details --output coverage.html --exclude-unreachable-branches --print-summary
# - lcov + genhtml

find_program (gcov gcov)
if (NOT gcov)
    message(WARNING "<coverage.cmake> Cannot find gcov => Build may fail...")
endif()

find_program (gcovr gcovr)
if (gcovr)
    message (STATUS "<coverage.cmake> Found command 'gcovr' => Use target 'gcovr' to generate coverage report '${CMAKE_BINARY_DIR}/gcovr.html'")
    add_custom_target (gcovr
        COMMAND ${gcovr} --root             ${CMAKE_SOURCE_DIR}
                         --exclude          ${CMAKE_SOURCE_DIR}/3rdparty
                         --exclude          ${CMAKE_BINARY_DIR}
                         --object-directory ${CMAKE_BINARY_DIR}
                         --output           ${CMAKE_BINARY_DIR}/gcovr.html
                         --html
                         --html-details
                         --sort-uncovered
                         --print-summary
                         --exclude-unreachable-branches
        COMMAND echo "<coverage.cmake> To display coverage report: firefox ${CMAKE_BINARY_DIR}/gcovr.html"
    )
else()
    message(WARNING "<coverage.cmake> Cannot find command 'gcovr' => Please install package 'gcovr' to generate code coverage report (HTML)")
endif()

find_program (lcov    lcov   )
find_program (genhtml genhtml)
if (lcov AND genhtml)
    message (STATUS "<coverage.cmake> Found commands 'lcov' and 'genhtml' => Use target 'lcov' to generate coverage report '${CMAKE_BINARY_DIR}/lcov/index.html'")
    add_custom_target (lcov
        COMMAND ${lcov}    --capture     --directory     ${CMAKE_BINARY_DIR}
                           --no-external --output-file   ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-all.info
                           --no-checksum --base-directory ${CMAKE_SOURCE_DIR}
                           --rc    lcov_branch_coverage=1 --quiet
        COMMAND ${lcov}    --remove ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-all.info
                                            ${CMAKE_SOURCE_DIR}/*/test/*
                                            ${CMAKE_SOURCE_DIR}/*/*/test/*
                                            ${CMAKE_SOURCE_DIR}/*/*/*/test/*
                           --rc    lcov_branch_coverage=1
                           --output-file   ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.info
        COMMAND ${genhtml} --rc genhtml_branch_coverage=1 ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.info
                           --output-directory             ${CMAKE_BINARY_DIR}/lcov
                           --highlight --legend --quiet
        COMMAND echo "<coverage.cmake> To display coverage report: firefox ${CMAKE_BINARY_DIR}/lcov/index.html"
    )
else()
    message(WARNING "<coverage.cmake> Cannot find both commands 'lcov' and 'genhtml' => Please install package 'lcov' to generate code coverage report (HTML)")
endif()