Skip to content
Snippets Groups Projects
Verified Commit e5eb7eaf authored by Lars Bilke's avatar Lars Bilke
Browse files

[cmake] Refactored coverage.

- uses gcovr only
- implementation based on Prof. CMake 16th Edition by Craig Scott
parent b6cbb101
No related branches found
No related tags found
No related merge requests found
...@@ -97,9 +97,7 @@ if(OGS_USE_CONAN AND OGS_USE_NETCDF) ...@@ -97,9 +97,7 @@ if(OGS_USE_CONAN AND OGS_USE_NETCDF)
endif() endif()
include(DocumentationSetup) include(DocumentationSetup)
include(test/Test) include(test/Test)
if(OGS_COVERAGE AND NOT _IS_SUBPROJECT) include(Coverage)
include(Coverage)
endif()
include(CppCheck) include(CppCheck)
# ---- More Options ---- # ---- More Options ----
......
...@@ -168,7 +168,6 @@ ...@@ -168,7 +168,6 @@
"debug" "debug"
], ],
"cacheVariables": { "cacheVariables": {
"CODE_COVERAGE_VERBOSE": "ON",
"OGS_COVERAGE": "ON", "OGS_COVERAGE": "ON",
"OGS_CTEST_MAX_RUNTIME": "5", "OGS_CTEST_MAX_RUNTIME": "5",
"OGS_USE_MFRONT": "ON" "OGS_USE_MFRONT": "ON"
......
...@@ -2,39 +2,28 @@ code coverage: ...@@ -2,39 +2,28 @@ code coverage:
stage: check stage: check
extends: extends:
- .template-build-linux - .template-build-linux
tags: [shell, envinf] tags: [shell, envinf23]
needs: [meta] needs: [meta]
variables: variables:
CMAKE_PRESET: coverage CMAKE_PRESET: coverage
TARGETS: "testrunner_coverage ctest_coverage" TARGETS: "tests ctest"
# default python on arch is 3.10; there are no vtk wheels for it (VTUInterface)
CMAKE_ARGS: >- CMAKE_ARGS: >-
-DOGS_USE_PIP=ON -DOGS_USE_PIP=ON
-DBUILD_SHARED_LIBS=ON -DBUILD_SHARED_LIBS=ON
after_script: after_script:
- cd ../build/coverage - cmake --build --preset $CMAKE_PRESET -t process_coverage
- source .venv/bin/activate coverage: '/lines: \d+\.\d+/'
- fastcov --branch-coverage -C testrunner_coverage.info ctest_coverage.info --lcov -o coverage.info
- fastcov --branch-coverage -C testrunner_coverage.info ctest_coverage.info -o coverage.json
- genhtml --branch-coverage --demangle-cpp -o coverage_report coverage.info
- wget https://raw.github.com/eriwen/lcov-to-cobertura-xml/master/lcov_cobertura/lcov_cobertura.py
- python lcov_cobertura.py coverage.info --base-dir $CI_PROJECT_DIR
- ./generate_coverage_vis_data.py
coverage: '/lines......: \d+\.\d+/'
artifacts: artifacts:
when: always when: always
paths: paths:
- Coverage.html - build/coverage/coverage/html
- build/coverage/coverage_report - build/coverage/coverage/coverage.xml
- build/coverage/coverage.json
- build/coverage/coverage.xml
- build/coverage/coverage_reports/*.json
- build/coverage/logs/*.txt - build/coverage/logs/*.txt
expire_in: 1 week expire_in: 1 week
reports: reports:
coverage_report: coverage_report:
coverage_format: cobertura coverage_format: cobertura
path: build/coverage/coverage.xml path: build/coverage/coverage/cobertura.xml
environment: environment:
name: code coverage $CI_MERGE_REQUEST_IID name: code coverage $CI_MERGE_REQUEST_IID
url: ${ARTIFACTS_PAGES_URL}/build/coverage/coverage_report/index.html url: ${ARTIFACTS_PAGES_URL}/build/coverage/coverage/html/index.html
find_program(FASTCOV_PATH NAMES fastcov fastcov.py) if(NOT (OGS_COVERAGE AND PROJECT_IS_TOP_LEVEL))
if(NOT FASTCOV_PATH AND NOT OGS_USE_PIP) return()
message( endif()
FATAL_ERROR "Code coverage requires either fastcov or OGS_USE_PIP=ON."
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Og --coverage")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
string(APPEND CMAKE_CXX_FLAGS_DEBUG " -fprofile-abs-path")
endif()
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "--coverage")
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "--coverage")
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "--coverage")
else()
message(FATAL_ERROR "OGS_COVERAGE requires clang or gcc compiler!")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
execute_process(
COMMAND xcrun --find gcov OUTPUT_VARIABLE GCOV_EXECUTABLE
OUTPUT_STRIP_TRAILING_WHITESPACE
) )
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
find_program(LLVM_COV_EXECUTABLE llvm-cov REQUIRED)
file(CREATE_LINK ${LLVM_COV_EXECUTABLE} ${CMAKE_BINARY_DIR}/gcov SYMBOLIC)
set(GCOV_EXECUTABLE "${LLVM_COV_EXECUTABLE} gcov")
else() # Assuming gcc for this example
find_program(GCOV_EXECUTABLE gcov REQUIRED)
endif() endif()
configure_file(scripts/cmake/gcovr.cfg.in gcovr.cfg @ONLY)
# cmake-lint: disable=E1126 find_program(GCOVR_EXECUTABLE NAMES gcovr)
if(NOT GCOVR_EXECUTABLE)
# https://github.com/linux-test-project/lcov/pull/125 list(APPEND OGS_PYTHON_PACKAGES "gcovr==6.0")
if(APPLE) set(GCOVR_EXECUTABLE ${LOCAL_VIRTUALENV_BIN_DIR}/gcovr CACHE PATH "" FORCE)
set(GENHTML_PATH ${PROJECT_BINARY_DIR}/bin/genhtml)
file(
DOWNLOAD
https://raw.githubusercontent.com/linux-test-project/lcov/41d8655951d6898511f98be2a2dbcfbe662f0b17/bin/genhtml
${GENHTML_PATH}
)
file(
DOWNLOAD
https://raw.githubusercontent.com/linux-test-project/lcov/41d8655951d6898511f98be2a2dbcfbe662f0b17/bin/get_version.sh
${PROJECT_BINARY_DIR}/bin/get_version.sh
)
file(
CHMOD
${GENHTML_PATH}
${PROJECT_BINARY_DIR}/bin/get_version.sh
FILE_PERMISSIONS
OWNER_READ
OWNER_WRITE
OWNER_EXECUTE
)
endif()
include(CodeCoverage)
append_coverage_compiler_flags()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og")
# cmake-lint: disable=C0103
if(NOT FASTCOV_PATH)
list(APPEND OGS_PYTHON_PACKAGES "fastcov==1.14")
set(FASTCOV_PATH ${LOCAL_VIRTUALENV_BIN_DIR}/fastcov CACHE INTERNAL "")
endif() endif()
if(DEFINED ENV{CI}) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/coverage/html)
set(COVERAGE_ADDITIONAL_ARGS SKIP_HTML)
endif()
if(APPLE) add_custom_target(
# System gcov does not work: process_coverage
# https://github.com/RPGillespie6/fastcov/issues/36. Search for Homebrew WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
# installed gcov (included in gcc package). COMMENT "Running gcovr to process coverage results"
find_program( COMMAND ${GCOVR_EXECUTABLE} --config gcovr.cfg .
GCOV_PATH NAMES gcov-12 gcov-11 gcov-10 HINTS $ENV{HOMEBREW_PREFIX}/bin )
REQUIRED
)
endif()
if(OGS_BUILD_TESTING)
setup_target_for_coverage_fastcov(
NAME
testrunner_coverage
BASE_DIRECTORY
${PROJECT_BINARY_DIR}
EXECUTABLE
$<TARGET_FILE:testrunner>
-l
warn
--gtest_filter=-GeoLib.SearchNearestPointsInDenseGrid
DEPENDENCIES
testrunner
FASTCOV_ARGS
--branch-coverage
--include
${PROJECT_SOURCE_DIR}
${COVERAGE_ADDITIONAL_ARGS}
EXCLUDE
Applications/CLI/
ProcessLib/
)
endif()
if(OGS_BUILD_CLI)
setup_target_for_coverage_fastcov(
NAME
ctest_coverage
BASE_DIRECTORY
${PROJECT_BINARY_DIR}
EXECUTABLE
ctest
DEPENDENCIES
all
FASTCOV_ARGS
--branch-coverage
--include
${PROJECT_SOURCE_DIR}
${COVERAGE_ADDITIONAL_ARGS}
EXCLUDE
Applications/CLI/
POST_CMD
perl
-i
-pe
s!${PROJECT_SOURCE_DIR}/!!g
ctest_coverage.json
NO_DEMANGLE
)
endif()
if(UNIX) if(UNIX)
add_custom_target(clean_coverage find . -name '*.gcda' -delete) add_custom_target(clean_coverage find . -name '*.gcda' -delete)
endif() endif()
configure_file(
${PROJECT_SOURCE_DIR}/scripts/test/generate_coverage_vis_data.in.py
${PROJECT_BINARY_DIR}/generate_coverage_vis_data.py @ONLY
)
root = @CMAKE_SOURCE_DIR@
cobertura = @CMAKE_BINARY_DIR@/coverage/cobertura.xml
# html-nested shows wrong paths: build/coverage/[DIR]
html-details = @CMAKE_BINARY_DIR@/coverage/html/index.html
gcov-executable = @GCOV_EXECUTABLE@
gcov-parallel = yes
print-summary = yes
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment