Skip to content

Commit f3db449

Browse files
authored
Merge pull request #91 from osechet/feature/integrate-gcov
Manage test coverage
2 parents 2ebaebc + 50872d0 commit f3db449

File tree

9 files changed

+264
-16
lines changed

9 files changed

+264
-16
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,4 @@ before_script:
7171
script:
7272
- cmake --build $BUILD_DIR
7373
- cmake --build $BUILD_DIR --target test
74+
- cmake --build $BUILD_DIR --target coverage

CMakeLists.txt

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ if (${CMAKE_VERSION} VERSION_GREATER "3.2")
3131
endif()
3232

3333
# Include custom cmake modules
34+
include(cmake/Coverage.cmake)
35+
include(cmake/GenerateTemplateExportHeader.cmake)
3436
include(cmake/GetGitRevisionDescription.cmake)
3537
include(cmake/HealthCheck.cmake)
36-
include(cmake/GenerateTemplateExportHeader.cmake)
3738

3839

3940
#
@@ -70,11 +71,12 @@ string(TOUPPER ${META_PROJECT_ID} META_PROJECT_ID)
7071
#
7172

7273
# Project options
73-
option(BUILD_SHARED_LIBS "Build shared instead of static libraries." ON)
74-
option(OPTION_SELF_CONTAINED "Create a self-contained install with all dependencies." OFF)
75-
option(OPTION_BUILD_TESTS "Build tests." ON)
76-
option(OPTION_BUILD_DOCS "Build documentation." OFF)
77-
option(OPTION_BUILD_EXAMPLES "Build examples." OFF)
74+
option(BUILD_SHARED_LIBS "Build shared instead of static libraries." ON)
75+
option(OPTION_SELF_CONTAINED "Create a self-contained install with all dependencies." OFF)
76+
option(OPTION_BUILD_TESTS "Build tests." ON)
77+
option(OPTION_BUILD_DOCS "Build documentation." OFF)
78+
option(OPTION_BUILD_EXAMPLES "Build examples." OFF)
79+
option(OPTION_ENABLE_COVERAGE "Add coverage information." OFF)
7880

7981

8082
#
@@ -97,13 +99,6 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
9799
file(WRITE "${PROJECT_BINARY_DIR}/VERSION" "${META_NAME_VERSION}")
98100

99101

100-
#
101-
# Compiler settings and options
102-
#
103-
104-
include(cmake/CompileOptions.cmake)
105-
106-
107102
#
108103
# Project Health Check Setup
109104
#
@@ -112,8 +107,16 @@ include(cmake/CompileOptions.cmake)
112107
add_check_template_target(${META_CMAKE_INIT_SHA})
113108

114109
# Configure health check tools
115-
enable_cppcheck(On)
116-
enable_clang_tidy(On)
110+
enable_cppcheck(ON)
111+
enable_clang_tidy(ON)
112+
enable_coverage(${OPTION_ENABLE_COVERAGE})
113+
114+
115+
#
116+
# Compiler settings and options
117+
#
118+
119+
include(cmake/CompileOptions.cmake)
117120

118121

119122
#

cmake/CompileOptions.cmake

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCH
131131
$<$<VERSION_LESS:${CMAKE_VERSION},3.1>:
132132
-std=c++11
133133
>
134+
135+
$<$<BOOL:${OPTION_COVERAGE_ENABLED}>:
136+
-fprofile-arcs
137+
-ftest-coverage
138+
>
134139
)
135140
endif ()
136141

@@ -144,6 +149,15 @@ set(DEFAULT_LINKER_OPTIONS)
144149
# Use pthreads on mingw and linux
145150
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
146151
set(DEFAULT_LINKER_OPTIONS
152+
${DEFAULT_LINKER_OPTIONS}
147153
-pthread
148154
)
155+
156+
if (${OPTION_COVERAGE_ENABLED})
157+
set(DEFAULT_LINKER_OPTIONS
158+
${DEFAULT_LINKER_OPTIONS}
159+
-fprofile-arcs
160+
-ftest-coverage
161+
)
162+
endif ()
149163
endif()

cmake/Coverage.cmake

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

cmake/Gcov.cmake

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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+
set(LCOV_EXCLUDE_COVERAGE)
7+
8+
# Function to register a target for coverage
9+
function(generate_lcov_report coverage_target target)
10+
if(NOT TARGET coverage-init)
11+
add_custom_target(
12+
coverage-zero
13+
COMMAND
14+
${lcov_EXECUTABLE}
15+
--zerocounters
16+
--base-directory ${CMAKE_BINARY_DIR}
17+
--directory ${CMAKE_SOURCE_DIR}
18+
-q
19+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
20+
)
21+
22+
add_custom_target(
23+
coverage-init
24+
COMMAND
25+
${lcov_EXECUTABLE}
26+
--no-external
27+
--capture
28+
--initial
29+
--base-directory ${CMAKE_BINARY_DIR}
30+
--directory ${CMAKE_SOURCE_DIR}
31+
--output-file ${CMAKE_BINARY_DIR}/coverage-base.info
32+
-q
33+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
34+
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-base.info
35+
)
36+
37+
add_custom_target(
38+
coverage-info
39+
COMMAND
40+
${lcov_EXECUTABLE}
41+
--capture
42+
--no-external
43+
--base-directory ${CMAKE_BINARY_DIR}
44+
--directory ${CMAKE_SOURCE_DIR}
45+
--output-file ${CMAKE_BINARY_DIR}/coverage-captured.info
46+
-q
47+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
48+
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-captured.info
49+
)
50+
51+
add_custom_target(
52+
coverage-merge
53+
COMMAND
54+
${lcov_EXECUTABLE}
55+
--add-tracefile ${CMAKE_BINARY_DIR}/coverage-base.info
56+
--add-tracefile ${CMAKE_BINARY_DIR}/coverage-captured.info
57+
--output-file ${CMAKE_BINARY_DIR}/coverage-merged.info
58+
-q
59+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
60+
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-merged.info
61+
)
62+
63+
add_custom_target(
64+
coverage-filter
65+
COMMAND
66+
${lcov_EXECUTABLE}
67+
--base-directory ${CMAKE_BINARY_DIR}
68+
--directory ${CMAKE_SOURCE_DIR}
69+
--remove ${CMAKE_BINARY_DIR}/coverage-merged.info
70+
${LCOV_EXCLUDE_COVERAGE}
71+
--output-file ${CMAKE_BINARY_DIR}/coverage-filtered.info
72+
-q
73+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
74+
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-filtered.info
75+
)
76+
77+
add_custom_target(
78+
coverage-report
79+
COMMAND
80+
${genhtml_EXECUTABLE}
81+
--output-directory ${CMAKE_BINARY_DIR}/coverage
82+
--title "${META_PROJECT_NAME} Test Coverage"
83+
--num-spaces 4
84+
${CMAKE_BINARY_DIR}/coverage-filtered.info
85+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
86+
DEPENDS ${CMAKE_BINARY_DIR}/coverage-filtered.info
87+
)
88+
89+
add_dependencies(coverage-init coverage-zero)
90+
#add_dependencies(coverage-info coverage-init)
91+
add_dependencies(coverage-merge coverage-info)
92+
add_dependencies(coverage-filter coverage-merge)
93+
add_dependencies(coverage-report coverage-filter)
94+
add_dependencies(coverage coverage-report)
95+
endif()
96+
97+
add_custom_target(${coverage_target}
98+
COMMAND $<TARGET_FILE:${target}>
99+
)
100+
101+
add_dependencies(coverage-info ${coverage_target})
102+
add_dependencies(${coverage_target} coverage-init)
103+
104+
endfunction()

source/examples/fibcmd/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ perform_health_checks(
113113
${sources}
114114
)
115115

116+
generate_coverage_report(${target})
117+
116118

117119
#
118120
# Deployment

source/tests/CMakeLists.txt

Lines changed: 4 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

0 commit comments

Comments
 (0)