Skip to content

Commit 957c6fe

Browse files
committed
Add targets to generate test coverage report
1 parent 7875b35 commit 957c6fe

File tree

8 files changed

+210
-3
lines changed

8 files changed

+210
-3
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,5 @@ before_script:
5959
script:
6060
- cmake --build $BUILD_DIR
6161
- cmake --build $BUILD_DIR --target test
62+
- cmake --build $BUILD_DIR --target coverage
6263

CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ endif()
3434
include(cmake/GetGitRevisionDescription.cmake)
3535
include(cmake/HealthCheck.cmake)
3636
include(cmake/GenerateTemplateExportHeader.cmake)
37+
include(cmake/Coverage.cmake)
3738

3839

3940
#
@@ -112,8 +113,9 @@ include(cmake/CompileOptions.cmake)
112113
add_check_template_target(${META_CMAKE_INIT_SHA})
113114

114115
# Configure health check tools
115-
enable_cppcheck(On)
116-
enable_clang_tidy(On)
116+
enable_cppcheck(ON)
117+
enable_clang_tidy(ON)
118+
enable_coverage(ON)
117119

118120

119121
#

cmake/Coverage.cmake

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
include(${CMAKE_CURRENT_LIST_DIR}/Gcov.cmake)
3+
4+
set(OPTION_COVERAGE_ENABLED OFF)
5+
6+
set(EXCLUDE_COVERAGE
7+
"\"*/googletest/*\""
8+
"\"*v1*\""
9+
)
10+
11+
# Function to register a target for enabled coverage report
12+
function(generate_coverage_report target)
13+
if(NOT TARGET coverage)
14+
add_custom_target(coverage)
15+
16+
set_target_properties(coverage
17+
PROPERTIES
18+
FOLDER "Maintenance"
19+
EXCLUDE_FROM_DEFAULT_BUILD 1
20+
)
21+
endif()
22+
23+
if (OPTION_COVERAGE_ENABLED)
24+
generate_lcov_report(coverage-${target} ${target} ${ARGN})
25+
endif()
26+
endfunction()
27+
28+
# Enable or disable coverage
29+
function(enable_coverage status)
30+
if(NOT ${status})
31+
set(OPTION_COVERAGE_ENABLED ${status} PARENT_SCOPE)
32+
message(STATUS "Coverage report skipped: Manually disabled")
33+
34+
return()
35+
endif()
36+
37+
find_package(lcov)
38+
39+
if(NOT lcov_FOUND)
40+
set(OPTION_COVERAGE_ENABLED OFF PARENT_SCOPE)
41+
message(STATUS "Coverage report skipped: lcov not found")
42+
43+
return()
44+
endif()
45+
46+
set(OPTION_COVERAGE_ENABLED ${status} PARENT_SCOPE)
47+
message(STATUS "Coverage report enabled")
48+
endfunction()

cmake/FindGcov.cmake

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
# FindGcov results:
3+
# GCOV_FOUND
4+
# GCOV_EXECUTABLE
5+
6+
include(FindPackageHandleStandardArgs)
7+
8+
# work around CMP0053, see http://public.kitware.com/pipermail/cmake/2014-November/059117.html
9+
set(PROGRAMFILES_x86_ENV "PROGRAMFILES(x86)")
10+
11+
find_program(GCOV_EXECUTABLE
12+
NAMES
13+
gcov
14+
PATHS
15+
"${GCOV_DIR}"
16+
"$ENV{GCOV_DIR}"
17+
"$ENV{PROGRAMFILES}/gcov"
18+
"$ENV{${PROGRAMFILES_x86_ENV}}/gcov"
19+
)
20+
21+
find_package_handle_standard_args(Gcov
22+
FOUND_VAR
23+
Gcov_FOUND
24+
REQUIRED_VARS
25+
GCOV_EXECUTABLE
26+
)
27+
28+
mark_as_advanced(GCOV_EXECUTABLE)

cmake/Findlcov.cmake

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
# FindGcovr results:
3+
# lcov_FOUND
4+
# lcov_EXECUTABLE
5+
6+
include(FindPackageHandleStandardArgs)
7+
8+
# work around CMP0053, see http://public.kitware.com/pipermail/cmake/2014-November/059117.html
9+
set(PROGRAMFILES_x86_ENV "PROGRAMFILES(x86)")
10+
11+
find_program(lcov_EXECUTABLE
12+
NAMES
13+
lcov
14+
PATHS
15+
"${LCOV_DIR}"
16+
"$ENV{LCOV_DIR}"
17+
"$ENV{PROGRAMFILES}/lcov"
18+
"$ENV{${PROGRAMFILES_x86_ENV}}/lcov"
19+
)
20+
21+
find_program(genhtml_EXECUTABLE
22+
NAMES
23+
genhtml
24+
PATHS
25+
"${LCOV_DIR}"
26+
"$ENV{LCOV_DIR}"
27+
"$ENV{PROGRAMFILES}/lcov"
28+
"$ENV{${PROGRAMFILES_x86_ENV}}/lcov"
29+
)
30+
31+
find_package_handle_standard_args(lcov
32+
FOUND_VAR
33+
lcov_FOUND
34+
REQUIRED_VARS
35+
lcov_EXECUTABLE
36+
genhtml_EXECUTABLE
37+
)
38+
39+
mark_as_advanced(lcov_EXECUTABLE
40+
genhtml_EXECUTABLE
41+
)

cmake/Gcov.cmake

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
#mkdir build/coverage
3+
#lcov -d build/source/tests/fiblib-test/CMakeFiles/fiblib-test.dir -c -o build/coverage/fiblib-test.info
4+
#genhtml -o build/coverage/html build/coverage/fiblib-test.info
5+
6+
7+
# Function to register a target for coverage
8+
function(generate_lcov_report coverage_target target)
9+
if(NOT TARGET coverage-init)
10+
add_custom_target(
11+
coverage-init
12+
COMMAND
13+
${lcov_EXECUTABLE}
14+
--directory ${CMAKE_CURRENT_BINARY_DIR}
15+
--zerocounters
16+
-q
17+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
18+
)
19+
20+
add_custom_target(
21+
coverage-info
22+
COMMAND
23+
${lcov_EXECUTABLE}
24+
--directory ${CMAKE_CURRENT_BINARY_DIR}
25+
--capture
26+
--output-file ${CMAKE_CURRENT_BINARY_DIR}/coverage.info
27+
-q
28+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
29+
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/coverage.info
30+
)
31+
32+
add_custom_target(
33+
coverage-clean
34+
COMMAND
35+
${lcov_EXECUTABLE}
36+
--directory ${CMAKE_CURRENT_BINARY_DIR}
37+
--remove ${CMAKE_CURRENT_BINARY_DIR}/coverage.info
38+
${EXCLUDE_COVERAGE}
39+
--output-file ${CMAKE_CURRENT_BINARY_DIR}/coverage-clean.info
40+
-q
41+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
42+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/coverage.info
43+
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/coverage-clean.info
44+
)
45+
46+
add_custom_target(
47+
coverage-report
48+
COMMAND
49+
${genhtml_EXECUTABLE}
50+
--output-directory ${CMAKE_CURRENT_BINARY_DIR}/coverage
51+
--title "cmake-init test coverage"
52+
--num-spaces 4
53+
${CMAKE_CURRENT_BINARY_DIR}/coverage-clean.info
54+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
55+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/coverage-clean.info
56+
)
57+
58+
add_dependencies(coverage coverage-report)
59+
endif()
60+
61+
add_custom_target(${coverage_target}
62+
COMMAND $<TARGET_FILE:${target}> --gtest_output=xml:gtests-${target}.xml
63+
DEPENDS ${target}
64+
)
65+
add_dependencies(${coverage_target} coverage-init)
66+
add_dependencies(coverage-info ${coverage_target})
67+
68+
endfunction()

source/tests/CMakeLists.txt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ function(add_test_without_ctest target)
4040

4141
add_dependencies(test ${target})
4242
add_custom_command(TARGET test POST_BUILD
43-
COMMAND $<TARGET_FILE:${target}> --gtest_output=xml:gtests-${target}.xml)
43+
COMMAND $<TARGET_FILE:${target}> --gtest_output=xml:gtests-${target}.xml
44+
)
45+
46+
generate_coverage_report(${target})
4447
endfunction()
4548

4649
# Build gmock
@@ -67,6 +70,20 @@ target_link_libraries(gmock-dev
6770
gmock
6871
)
6972

73+
set(DEFAULT_COMPILE_TEST_OPTIONS)
74+
set(DEFAULT_LINKER_TEST_OPTIONS)
75+
76+
if(OPTION_COVERAGE_ENABLED)
77+
set(DEFAULT_COMPILE_TEST_OPTIONS ${DEFAULT_COMPILE_TEST_OPTIONS}
78+
-fprofile-arcs
79+
-ftest-coverage
80+
)
81+
set(DEFAULT_LINKER_TEST_OPTIONS
82+
-fprofile-arcs
83+
-ftest-coverage
84+
)
85+
endif()
86+
7087

7188
#
7289
# Target 'test'

source/tests/fiblib-test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ target_compile_definitions(${target}
8888
target_compile_options(${target}
8989
PRIVATE
9090
${DEFAULT_COMPILE_OPTIONS}
91+
${DEFAULT_COMPILE_TEST_OPTIONS}
9192
)
9293

9394

@@ -98,4 +99,5 @@ target_compile_options(${target}
9899
target_link_libraries(${target}
99100
PRIVATE
100101
${DEFAULT_LINKER_OPTIONS}
102+
${DEFAULT_LINKER_TEST_OPTIONS}
101103
)

0 commit comments

Comments
 (0)