diff --git a/CMakeLists.txt b/CMakeLists.txt index ddf9c2c37c873c059c7813d39de206b00a1e42af..33ecfa4f649b57a23b0b5a4423a08331b3a88244 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,33 +335,60 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "Coverage") message(FATAL_ERROR "Cannot find a proper gcov tool, cannot perform coverage.") endif() - add_custom_target(coverage - ALL # in coverage mode we do coverage! - # Cleanup previously generated profiling data - COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --zerocounters - # Initialize profiling data with zero coverage for every instrumented line of the project - # This way the percentage of total lines covered will always be correct, even when not all source code files were loaded during the test(s) - COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --initial --output-file coverage_base.info - # Run tests - COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT} - # Collect data from executions - COMMAND ${LCOV} --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --output-file coverage_ctest.info - # Combine base and ctest results - COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --add-tracefile coverage_base.info --add-tracefile coverage_ctest.info --output-file coverage_full.info - # Extract only project data (--no-capture or --remove options may be used to select collected data) - COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --extract coverage_full.info "'${PUGS_SOURCE_DIR}/src/*'" --output-file coverage_extract.info - - # Remove unwanted stuff - COMMAND ${LCOV} --gcov "${GCOV_BIN}" --remove coverage_extract.info --output-file coverage.info - '${PUGS_SOURCE_DIR}/src/main.cpp' - '${PUGS_SOURCE_DIR}/utils/BacktraceManager.*' - - COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info - - DEPENDS unit_tests mpi_unit_tests - COMMENT "Running test coverage." - WORKING_DIRECTORY "${PUGS_BINARY_DIR}" - ) + find_program(FASTCOV fastcov fastcov.py) + + if (FASTCOV AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "9")) + + add_custom_target(coverage + ALL # in coverage mode we do coverage! + + # Run tests + COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT} + + COMMAND ${FASTCOV} -q --gcov "${GCOV_BIN}" + --include "${PUGS_SOURCE_DIR}/src" + --exclude "${PUGS_SOURCE_DIR}/src/main.cpp" + --exclude "${PUGS_SOURCE_DIR}/src/utils/BacktraceManager.*" + --lcov -o coverage.info -n + + COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info + + DEPENDS unit_tests mpi_unit_tests + COMMENT "Running test coverage." + WORKING_DIRECTORY "${PUGS_BINARY_DIR}" + ) + + else() + + add_custom_target(coverage + ALL # in coverage mode we do coverage! + # Cleanup previously generated profiling data + COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --zerocounters + # Initialize profiling data with zero coverage for every instrumented line of the project + # This way the percentage of total lines covered will always be correct, even when not all source code files were loaded during the test(s) + COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --initial --output-file coverage_base.info + # Run tests + COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT} + # Collect data from executions + COMMAND ${LCOV} --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --output-file coverage_ctest.info + # Combine base and ctest results + COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --add-tracefile coverage_base.info --add-tracefile coverage_ctest.info --output-file coverage_full.info + # Extract only project data (--no-capture or --remove options may be used to select collected data) + COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --extract coverage_full.info "'${PUGS_SOURCE_DIR}/src/*'" --output-file coverage_extract.info + + # Remove unwanted stuff + COMMAND ${LCOV} --gcov "${GCOV_BIN}" --remove coverage_extract.info --output-file coverage.info + '${PUGS_SOURCE_DIR}/src/main.cpp' + '${PUGS_SOURCE_DIR}/src/utils/BacktraceManager.*' + + COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info + + DEPENDS unit_tests mpi_unit_tests + COMMENT "Running test coverage." + WORKING_DIRECTORY "${PUGS_BINARY_DIR}" + ) + endif() + find_program(GENHTML genhtml) if(NOT GENHTML)