@@ -15,6 +15,7 @@ enable_testing()
1515
1616set (CTEST_OUTPUT_ON_FAILURE ON )
1717set (NO_STATIC_ANALYSIS OFF CACHE BOOL "disable udpard static analysis" )
18+ set (ENABLE_COVERAGE OFF CACHE BOOL "enable code coverage measurement" )
1819
1920set (library_dir "${CMAKE_SOURCE_DIR} /libudpard" )
2021set (unity_root "${CMAKE_SOURCE_DIR} /submodules/unity" )
@@ -53,6 +54,13 @@ function(gen_test name files compile_definitions compile_flags link_flags c_stan
5354 target_include_directories (${name} PUBLIC ${library_dir} )
5455 target_compile_definitions (${name} PUBLIC ${compile_definitions} )
5556 target_link_libraries (${name} "${name} _unity" )
57+
58+ # Apply coverage flags if coverage is enabled
59+ if (ENABLE_COVERAGE)
60+ target_compile_options (${name} PRIVATE --coverage)
61+ target_link_options (${name} PRIVATE --coverage)
62+ endif ()
63+
5664 set_target_properties (
5765 ${name}
5866 PROPERTIES
@@ -82,3 +90,31 @@ gen_test_matrix(test_intrusive_header "src/test_intrusive_header.c")
8290gen_test_matrix(test_intrusive_misc "src/test_intrusive_misc.c" )
8391gen_test_matrix(test_intrusive_tx "src/test_intrusive_tx.c" )
8492gen_test_matrix(test_intrusive_rx "src/test_intrusive_rx.c" )
93+
94+ # Coverage targets. Usage:
95+ # cmake -DENABLE_COVERAGE=ON ..
96+ # make -j16
97+ # make test # Run the tests
98+ # make coverage # Generate coverage reports
99+ # xdg-open coverage-html/index.html
100+ if (ENABLE_COVERAGE)
101+ find_program (LCOV_PATH lcov REQUIRED)
102+ find_program (GENHTML_PATH genhtml REQUIRED)
103+
104+ # Target to reset coverage counters
105+ add_custom_target (coverage-reset
106+ COMMAND ${LCOV_PATH} --zerocounters --directory .
107+ COMMAND ${LCOV_PATH} --capture --initial --directory . --output -file coverage-base.info
108+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
109+ COMMENT "Resetting coverage counters"
110+ )
111+
112+ # Target to generate coverage report
113+ add_custom_target (coverage
114+ COMMAND ${LCOV_PATH} --capture --directory . --output -file coverage-total.info
115+ COMMAND ${LCOV_PATH} --extract coverage-total.info '*/libudpard/udpard.c' --output -file coverage-udpard.info
116+ COMMAND ${GENHTML_PATH} coverage-udpard.info --output -directory coverage-html --title "libudpard Coverage" --legend --demangle-cpp
117+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
118+ COMMENT "Generating coverage HTML report in coverage-html/"
119+ )
120+ endif ()
0 commit comments