Enable source code based coverage analysis
This commit is contained in:
parent
2174dc516a
commit
6807d899d2
|
@ -236,4 +236,14 @@ if(NOT TARGET check)
|
|||
)
|
||||
endif()
|
||||
|
||||
# enable source code based coverage analysis using clang
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||
set(CLANG_SOURCE_BASED_COVERAGE_ENABLED YES)
|
||||
set(CLANG_SOURCE_BASED_COVERAGE_FLAGS -fprofile-instr-generate -fcoverage-mapping)
|
||||
list(APPEND META_PRIVATE_SHARED_LIB_COMPILE_OPTIONS ${CLANG_SOURCE_BASED_COVERAGE_FLAGS})
|
||||
list(APPEND META_PRIVATE_STATIC_LIB_COMPILE_OPTIONS ${CLANG_SOURCE_BASED_COVERAGE_FLAGS})
|
||||
list(APPEND META_ADDITIONAL_SHARED_LINK_FLAGS ${CLANG_SOURCE_BASED_COVERAGE_FLAGS})
|
||||
list(APPEND META_ADDITIONAL_STATIC_LINK_FLAGS ${CLANG_SOURCE_BASED_COVERAGE_FLAGS})
|
||||
endif()
|
||||
|
||||
set(BASIC_PROJECT_CONFIG_DONE YES)
|
||||
|
|
|
@ -124,6 +124,8 @@ if(CPP_UNIT_LIB OR META_NO_CPP_UNIT)
|
|||
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE}
|
||||
LINK_SEARCH_END_STATIC ${STATIC_LINKAGE}
|
||||
)
|
||||
|
||||
# make a test recognized by ctest
|
||||
add_test(NAME ${META_PROJECT_NAME}_run_tests COMMAND
|
||||
${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests
|
||||
-p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles"
|
||||
|
@ -131,6 +133,71 @@ if(CPP_UNIT_LIB OR META_NO_CPP_UNIT)
|
|||
${APPLICATION_PATH}
|
||||
)
|
||||
|
||||
# enable source code based coverage analysis using clang
|
||||
if(CLANG_SOURCE_BASED_COVERAGE_ENABLED)
|
||||
# specify where to store raw clang profiling data via environment variable
|
||||
set_tests_properties(${META_PROJECT_NAME}_run_tests
|
||||
PROPERTIES
|
||||
ENVIRONMENT "LLVM_PROFILE_FILE=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw"
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-E env "LLVM_PROFILE_FILE=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw"
|
||||
$<TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests>
|
||||
-p "${CMAKE_CURRENT_SOURCE_DIR}/testfiles"
|
||||
-w "${CMAKE_CURRENT_BINARY_DIR}/testworkingdir"
|
||||
${APPLICATION_PATH}
|
||||
COMMENT "Executing ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests to generate raw profiling data for source-based coverage report"
|
||||
DEPENDS ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests
|
||||
)
|
||||
find_program(LLVM_PROFDATA_BIN llvm-profdata)
|
||||
find_program(LLVM_COV_BIN llvm-cov)
|
||||
if(LLVM_PROFDATA_BIN AND LLVM_COV_BIN)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
COMMAND "${LLVM_PROFDATA_BIN}" merge
|
||||
-sparse "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw"
|
||||
-o "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
COMMENT "Generating profiling data for source-based coverage report"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profraw"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.txt"
|
||||
COMMAND "${LLVM_COV_BIN}" report
|
||||
-instr-profile "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
-format=text
|
||||
$<TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}>
|
||||
> "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.txt"
|
||||
COMMENT "Generating HTML coverage report"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
)
|
||||
add_custom_target("${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_summary"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.txt"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.html"
|
||||
COMMAND "${LLVM_COV_BIN}" show
|
||||
-project-title="${META_APP_NAME}"
|
||||
-instr-profile "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
-format=html
|
||||
$<TARGET_FILE:${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}>
|
||||
> "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.html"
|
||||
COMMENT "Generating HTML coverage report"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests.profdata"
|
||||
)
|
||||
add_custom_target("${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage_html"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.html"
|
||||
)
|
||||
add_custom_target("${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.txt"
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests_coverage.html"
|
||||
)
|
||||
else()
|
||||
message(WARNING "Unable to generate target for coverage report because llvm-profdata and llvm-cov are not available.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# add the test executable to the dependencies of the check target
|
||||
add_dependencies(check ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests)
|
||||
|
||||
|
|
Loading…
Reference in New Issue