Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,4 @@ before_script:
script:
- cmake --build $BUILD_DIR
- cmake --build $BUILD_DIR --target test
- cmake --build $BUILD_DIR --target coverage
33 changes: 18 additions & 15 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ if (${CMAKE_VERSION} VERSION_GREATER "3.2")
endif()

# Include custom cmake modules
include(cmake/Coverage.cmake)
include(cmake/GenerateTemplateExportHeader.cmake)
include(cmake/GetGitRevisionDescription.cmake)
include(cmake/HealthCheck.cmake)
include(cmake/GenerateTemplateExportHeader.cmake)


#
Expand Down Expand Up @@ -70,11 +71,12 @@ string(TOUPPER ${META_PROJECT_ID} META_PROJECT_ID)
#

# Project options
option(BUILD_SHARED_LIBS "Build shared instead of static libraries." ON)
option(OPTION_SELF_CONTAINED "Create a self-contained install with all dependencies." OFF)
option(OPTION_BUILD_TESTS "Build tests." ON)
option(OPTION_BUILD_DOCS "Build documentation." OFF)
option(OPTION_BUILD_EXAMPLES "Build examples." OFF)
option(BUILD_SHARED_LIBS "Build shared instead of static libraries." ON)
option(OPTION_SELF_CONTAINED "Create a self-contained install with all dependencies." OFF)
option(OPTION_BUILD_TESTS "Build tests." ON)
option(OPTION_BUILD_DOCS "Build documentation." OFF)
option(OPTION_BUILD_EXAMPLES "Build examples." OFF)
option(OPTION_ENABLE_COVERAGE "Add coverage information." OFF)


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


#
# Compiler settings and options
#

include(cmake/CompileOptions.cmake)


#
# Project Health Check Setup
#
Expand All @@ -112,8 +107,16 @@ include(cmake/CompileOptions.cmake)
add_check_template_target(${META_CMAKE_INIT_SHA})

# Configure health check tools
enable_cppcheck(On)
enable_clang_tidy(On)
enable_cppcheck(ON)
enable_clang_tidy(ON)
enable_coverage(${OPTION_ENABLE_COVERAGE})


#
# Compiler settings and options
#

include(cmake/CompileOptions.cmake)


#
Expand Down
14 changes: 14 additions & 0 deletions cmake/CompileOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCH
$<$<VERSION_LESS:${CMAKE_VERSION},3.1>:
-std=c++11
>

$<$<BOOL:${OPTION_COVERAGE_ENABLED}>:
-fprofile-arcs
-ftest-coverage
>
)
endif ()

Expand All @@ -144,6 +149,15 @@ set(DEFAULT_LINKER_OPTIONS)
# Use pthreads on mingw and linux
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
set(DEFAULT_LINKER_OPTIONS
${DEFAULT_LINKER_OPTIONS}
-pthread
)

if (${OPTION_COVERAGE_ENABLED})
set(DEFAULT_LINKER_OPTIONS
${DEFAULT_LINKER_OPTIONS}
-fprofile-arcs
-ftest-coverage
)
endif ()
endif()
51 changes: 51 additions & 0 deletions cmake/Coverage.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

include(${CMAKE_CURRENT_LIST_DIR}/Gcov.cmake)

set(OPTION_COVERAGE_ENABLED OFF)

set(LCOV_EXCLUDE_COVERAGE
${LCOV_EXCLUDE_COVERAGE}
"\"*/googletest/*\""
"\"*v1*\""
"\"/usr/*\""
)

# Function to register a target for enabled coverage report
function(generate_coverage_report target)
if(NOT TARGET coverage)
add_custom_target(coverage)

set_target_properties(coverage
PROPERTIES
FOLDER "Maintenance"
EXCLUDE_FROM_DEFAULT_BUILD 1
)
endif()

if (${OPTION_COVERAGE_ENABLED})
generate_lcov_report(coverage-${target} ${target} ${ARGN})
add_dependencies(coverage coverage-${target})
endif()
endfunction()

# Enable or disable coverage
function(enable_coverage status)
if(NOT ${status})
set(OPTION_COVERAGE_ENABLED ${status} PARENT_SCOPE)
message(STATUS "Coverage lcov skipped: Manually disabled")

return()
endif()

find_package(lcov)

if(NOT lcov_FOUND)
set(OPTION_COVERAGE_ENABLED OFF PARENT_SCOPE)
message(STATUS "Coverage lcov skipped: lcov not found")

return()
endif()

set(OPTION_COVERAGE_ENABLED ${status} PARENT_SCOPE)
message(STATUS "Coverage report enabled")
endfunction()
28 changes: 28 additions & 0 deletions cmake/Findgcov.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

# Findgcov results:
# gcov_FOUND
# gcov_EXECUTABLE

include(FindPackageHandleStandardArgs)

# work around CMP0053, see http://public.kitware.com/pipermail/cmake/2014-November/059117.html
set(PROGRAMFILES_x86_ENV "PROGRAMFILES(x86)")

find_program(gcov_EXECUTABLE
NAMES
gcov
PATHS
"${GCOV_DIR}"
"$ENV{GCOV_DIR}"
"$ENV{PROGRAMFILES}/gcov"
"$ENV{${PROGRAMFILES_x86_ENV}}/gcov"
)

find_package_handle_standard_args(gcov
FOUND_VAR
gcov_FOUND
REQUIRED_VARS
gcov_EXECUTABLE
)

mark_as_advanced(gcov_EXECUTABLE)
42 changes: 42 additions & 0 deletions cmake/Findlcov.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@

# Findlcov results:
# lcov_FOUND
# lcov_EXECUTABLE

include(FindPackageHandleStandardArgs)

# work around CMP0053, see http://public.kitware.com/pipermail/cmake/2014-November/059117.html
set(PROGRAMFILES_x86_ENV "PROGRAMFILES(x86)")

find_program(lcov_EXECUTABLE
NAMES
lcov
PATHS
"${LCOV_DIR}"
"$ENV{LCOV_DIR}"
"$ENV{PROGRAMFILES}/lcov"
"$ENV{${PROGRAMFILES_x86_ENV}}/lcov"
)

find_program(genhtml_EXECUTABLE
NAMES
genhtml
PATHS
"${LCOV_DIR}"
"$ENV{LCOV_DIR}"
"$ENV{PROGRAMFILES}/lcov"
"$ENV{${PROGRAMFILES_x86_ENV}}/lcov"
)

find_package_handle_standard_args(lcov
FOUND_VAR
lcov_FOUND
REQUIRED_VARS
lcov_EXECUTABLE
genhtml_EXECUTABLE
)

mark_as_advanced(
lcov_EXECUTABLE
genhtml_EXECUTABLE
)
104 changes: 104 additions & 0 deletions cmake/Gcov.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@

#mkdir build/coverage
#lcov -d build/source/tests/fiblib-test/CMakeFiles/fiblib-test.dir -c -o build/coverage/fiblib-test.info
#genhtml -o build/coverage/html build/coverage/fiblib-test.info

set(LCOV_EXCLUDE_COVERAGE)

# Function to register a target for coverage
function(generate_lcov_report coverage_target target)
if(NOT TARGET coverage-init)
add_custom_target(
coverage-zero
COMMAND
${lcov_EXECUTABLE}
--zerocounters
--base-directory ${CMAKE_BINARY_DIR}
--directory ${CMAKE_SOURCE_DIR}
-q
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

add_custom_target(
coverage-init
COMMAND
${lcov_EXECUTABLE}
--no-external
--capture
--initial
--base-directory ${CMAKE_BINARY_DIR}
--directory ${CMAKE_SOURCE_DIR}
--output-file ${CMAKE_BINARY_DIR}/coverage-base.info
-q
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-base.info
)

add_custom_target(
coverage-info
COMMAND
${lcov_EXECUTABLE}
--capture
--no-external
--base-directory ${CMAKE_BINARY_DIR}
--directory ${CMAKE_SOURCE_DIR}
--output-file ${CMAKE_BINARY_DIR}/coverage-captured.info
-q
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-captured.info
)

add_custom_target(
coverage-merge
COMMAND
${lcov_EXECUTABLE}
--add-tracefile ${CMAKE_BINARY_DIR}/coverage-base.info
--add-tracefile ${CMAKE_BINARY_DIR}/coverage-captured.info
--output-file ${CMAKE_BINARY_DIR}/coverage-merged.info
-q
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-merged.info
)

add_custom_target(
coverage-filter
COMMAND
${lcov_EXECUTABLE}
--base-directory ${CMAKE_BINARY_DIR}
--directory ${CMAKE_SOURCE_DIR}
--remove ${CMAKE_BINARY_DIR}/coverage-merged.info
${LCOV_EXCLUDE_COVERAGE}
--output-file ${CMAKE_BINARY_DIR}/coverage-filtered.info
-q
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
BYPRODUCTS ${CMAKE_BINARY_DIR}/coverage-filtered.info
)

add_custom_target(
coverage-report
COMMAND
${genhtml_EXECUTABLE}
--output-directory ${CMAKE_BINARY_DIR}/coverage
--title "${META_PROJECT_NAME} Test Coverage"
--num-spaces 4
${CMAKE_BINARY_DIR}/coverage-filtered.info
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS ${CMAKE_BINARY_DIR}/coverage-filtered.info
)

add_dependencies(coverage-init coverage-zero)
#add_dependencies(coverage-info coverage-init)
add_dependencies(coverage-merge coverage-info)
add_dependencies(coverage-filter coverage-merge)
add_dependencies(coverage-report coverage-filter)
add_dependencies(coverage coverage-report)
endif()

add_custom_target(${coverage_target}
COMMAND $<TARGET_FILE:${target}>
)

add_dependencies(coverage-info ${coverage_target})
add_dependencies(${coverage_target} coverage-init)

endfunction()
2 changes: 2 additions & 0 deletions source/examples/fibcmd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ perform_health_checks(
${sources}
)

generate_coverage_report(${target})


#
# Deployment
Expand Down
5 changes: 4 additions & 1 deletion source/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ function(add_test_without_ctest target)

add_dependencies(test ${target})
add_custom_command(TARGET test POST_BUILD
COMMAND $<TARGET_FILE:${target}> --gtest_output=xml:gtests-${target}.xml)
COMMAND $<TARGET_FILE:${target}> --gtest_output=xml:gtests-${target}.xml
)

generate_coverage_report(${target})
endfunction()

# Build gmock
Expand Down