diff --git a/.gitignore b/.gitignore index 807ec8228..c47e0d3cb 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,7 @@ nbproject/ .idea cmake-build-debug/* cmake-build-debug-coverage/* +coverage-report/ # # Eclipse diff --git a/CMakeLists.txt b/CMakeLists.txt index 40ead37e8..9c5696ff8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,12 +140,17 @@ add_subdirectory(src) CU_RUN_HOOK("AFTER_SRC_LOAD") if( UNIT_TESTS ) - # we use this to get code coverage - if(CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang) - message("Unit tests code coverage: enabling -fprofile-arcs -ftest-coverage") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") + # we use these flags to get code coverage + set(UNIT_TEST_CXX_FLAGS "-fprofile-arcs -ftest-coverage -fno-inline") + + # enable additional flags for GCC. + if ( CMAKE_CXX_COMPILER_ID MATCHES GNU ) + set(UNIT_TEST_CXX_FLAGS "${UNIT_TEST_CXX_FLAGS} -fno-inline-small-functions -fno-default-inline") endif() + message("Unit tests code coverage: enabling ${UNIT_TEST_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${UNIT_TEST_CXX_FLAGS}") + include(src/cmake/googletest.cmake) fetch_googletest( ${PROJECT_SOURCE_DIR}/src/cmake @@ -154,4 +159,16 @@ if( UNIT_TESTS ) enable_testing() add_subdirectory(src/test) + + add_custom_target(coverage DEPENDS coverage_command) + + add_custom_command(OUTPUT coverage_command + # Run unit tests. + COMMAND ctest + # Run the graphical front-end for code coverage. + COMMAND lcov --directory src --capture --output-file coverage.info + COMMAND lcov --remove coverage.info '/usr/*' '${CMAKE_BINARY_DIR}/googletest/*' '${CMAKE_CURRENT_SOURCE_DIR}/src/test/*' --output-file coverage.info + COMMAND genhtml -o ${CMAKE_CURRENT_SOURCE_DIR}/coverage-report coverage.info + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + ) endif() diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 48948f098..9c30984a0 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -19,5 +19,5 @@ add_test( NAME unit COMMAND - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/unit_tests + ${CMAKE_BINARY_DIR}/src/test/unit_tests )