Skip to content

Commit d2931d6

Browse files
committed
[cmake] Coverage move to llvm only support.
1 parent 1de0cf3 commit d2931d6

3 files changed

Lines changed: 55 additions & 122 deletions

File tree

CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ option(
4747
"Enable examples app build. To install examples, build explicitly the target Install_RadiumExamples."
4848
OFF
4949
)
50-
option(RADIUM_ENABLE_COVERAGE "Enable coverage, gcc only. Experimental, sets ENABLE_TESTING ON" OFF)
50+
option(RADIUM_ENABLE_COVERAGE "Enable coverage, llvm only. sets ENABLE_TESTING ON" OFF)
5151
option(RADIUM_ENABLE_PCH "Enable precompiled headers." OFF)
5252
option(RADIUM_USE_DOUBLE "Use double precision for Scalar." OFF)
5353
option(RADIUM_GENERATE_LIB_CORE "Include Radium::Core in CMake project." ON)
@@ -161,6 +161,11 @@ else()
161161
endif()
162162

163163
if(RADIUM_ENABLE_COVERAGE)
164+
if(NOT (CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES
165+
"(Apple)?[Cc]lang")
166+
)
167+
message(FATAL_ERROR "coverage only supported with clang")
168+
endif()
164169
set(RADIUM_ENABLE_TESTING "ON")
165170
include(RadiumCoverage)
166171
endif(RADIUM_ENABLE_COVERAGE)

cmake/RadiumCoverage.cmake

Lines changed: 47 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,63 @@
1-
if(CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES
2-
"(Apple)?[Cc]lang"
3-
)
4-
set(LLVM_COVERAGE ON)
5-
else()
6-
set(GCOV_COVERAGE ON)
1+
find_program(LLVM_PROFDATA_PATH llvm-profdata)
2+
find_program(LLVM_COV_PATH llvm-cov)
3+
if(NOT LLVM_COV_PATH)
4+
message(FATAL_ERROR "llvm-cov not found! Aborting.")
75
endif()
8-
9-
if(DEFINED LLVM_COVERAGE)
10-
find_program(LLVM_PROFDATA_PATH llvm-profdata)
11-
find_program(LLVM_COV_PATH llvm-cov)
12-
if(NOT LLVM_COV_PATH)
13-
message(FATAL_ERROR "llvm-cov not found! Aborting.")
14-
endif()
15-
if(NOT LLVM_PROFDATA_PATH)
16-
message(FATAL_ERROR "llvm-profdata not found! Aborting.")
17-
endif()
18-
set(PROF_DIR ${CMAKE_BINARY_DIR}/llvm-cov/prof)
19-
set(REPORT_DIR ${CMAKE_BINARY_DIR}/llvm-cov/report)
20-
set(TEST_ENV_VAR "LLVM_PROFILE_FILE=${PROF_DIR}/coverage-%m-%p.profraw")
21-
set(TEST_ENV_VAR ${TEST_ENV_VAR} PARENT_SCOPE)
22-
else()
23-
include(CodeCoverage)
6+
if(NOT LLVM_PROFDATA_PATH)
7+
message(FATAL_ERROR "llvm-profdata not found! Aborting.")
248
endif()
259

10+
set(PROF_DIR ${CMAKE_BINARY_DIR}/llvm-cov/prof)
11+
set(REPORT_DIR ${CMAKE_BINARY_DIR}/llvm-cov/report)
12+
set(TEST_ENV_VAR "LLVM_PROFILE_FILE=${PROF_DIR}/unittests/coverage-%Nm-%p.profraw")
13+
2614
function(radium_setup_coverage_targets)
27-
if(DEFINED LLVM_COVERAGE)
28-
add_custom_target(
29-
llvm_coverage
30-
COMMAND find ${PROF_DIR} -name \"*.profraw\" -delete
31-
COMMAND rm -rf ${REPORT_DIR}
32-
COMMAND ${CMAKE_CTEST_COMMAND} -L unittests
33-
COMMAND ${LLVM_PROFDATA_PATH} merge -sparse -o ${PROF_DIR}/unittests.profdata `find
34-
${PROF_DIR} -name \"*.profraw\"`
35-
)
36-
endif()
15+
add_custom_target(
16+
llvm_coverage
17+
COMMAND find ${PROF_DIR} -name \"*.profraw\" -delete
18+
COMMAND rm -rf ${REPORT_DIR}
19+
COMMAND ${CMAKE_CTEST_COMMAND}
20+
COMMAND ${LLVM_PROFDATA_PATH} merge -sparse -o ${PROF_DIR}/coverage.profdata `find
21+
${PROF_DIR} -name \"*.profraw\"`
22+
)
23+
3724
# prevent flags on catch2 and examples, add to specific targets
3825
include(ListTargets)
3926
get_all_targets(TARGETS)
4027
foreach(TARGET ${TARGETS})
4128
if(NOT ${TARGET} MATCHES ".*stream.*")
4229
message(STATUS "add coverage flags to ${TARGET}")
43-
if(DEFINED LLVM_COVERAGE)
44-
target_compile_options(
45-
${TARGET} PRIVATE -fprofile-instr-generate -fcoverage-mapping
30+
target_compile_options(
31+
${TARGET} PRIVATE -fprofile-instr-generate -fcoverage-mapping -O0 -g
32+
)
33+
target_link_options(${TARGET} PRIVATE -fprofile-instr-generate -fcoverage-mapping)
34+
if(NOT ${TARGET} MATCHES "unittests")
35+
list(APPEND LLVM_OBJS "--object"
36+
"$<PATH:RELATIVE_PATH,$<TARGET_FILE:${TARGET}>,${CMAKE_BINARY_DIR}>"
4637
)
47-
target_link_options(${TARGET} PRIVATE -fprofile-instr-generate -fcoverage-mapping)
48-
if(NOT ${TARGET} MATCHES "unittests")
49-
list(APPEND LLVM_OBJS "--object"
50-
"$<PATH:RELATIVE_PATH,$<TARGET_FILE:${TARGET}>,${CMAKE_BINARY_DIR}>"
51-
)
52-
endif()
53-
54-
add_dependencies(llvm_coverage ${TARGET})
55-
else()
56-
append_coverage_compiler_flags_to_target(${TARGET})
5738
endif()
39+
40+
add_dependencies(llvm_coverage ${TARGET})
41+
5842
endif()
5943
endforeach()
60-
#
61-
if(DEFINED LLVM_COVERAGE)
62-
set(LLVM_COV
63-
${LLVM_COV_PATH}
64-
show
65-
$<TARGET_FILE:unittests>
66-
${LLVM_OBJS}
67-
-instr-profile=${PROF_DIR}/unittests.profdata
68-
-format=html
69-
-output-dir=${REPORT_DIR}
70-
-show-line-counts-or-regions
71-
-show-directory-coverage
72-
-Xdemangler
73-
c++filt
74-
-Xdemangler
75-
-n
76-
${CMAKE_CURRENT_SOURCE_DIR}
77-
)
78-
add_custom_command(TARGET llvm_coverage POST_BUILD COMMAND ${LLVM_COV})
79-
else()
80-
# fix error on github's lcov
81-
foreach(LABEL unittests integration)
82-
setup_target_for_coverage_lcov(
83-
NAME
84-
lcov_${LABEL}
85-
EXECUTABLE
86-
${CMAKE_CTEST_COMMAND}
87-
-L
88-
${LABEL}
89-
--output-on-failure
90-
-C
91-
${CMAKE_BUILD_TYPE}
92-
-j
93-
$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
94-
BASE_DIRECTORY
95-
"/"
96-
DEPENDENCIES
97-
RadiumLibs
98-
${LABEL}
99-
EXCLUDE
100-
"${CMAKE_BINARY_DIR}/_deps/*"
101-
"${CMAKE_BINARY_DIR}/*_autogen/*"
102-
"/*external*/"
103-
"/usr/*"
104-
)
10544
106-
# Fastcov is not supported with gcov llvm: disabling for MacOS Source:
107-
# https://github.com/RPGillespie6/fastcov/issues/36
108-
if(UNIX AND NOT APPLE AND FASTCOV_PATH)
109-
setup_target_for_coverage_fastcov(
110-
NAME
111-
fastcov_${LABEL}
112-
EXECUTABLE
113-
${CMAKE_CTEST_COMMAND}
114-
-L
115-
${LABEL}
116-
--output-on-failure
117-
-C
118-
${CMAKE_BUILD_TYPE}
119-
-j
120-
$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
121-
DEPENDENCIES
122-
RadiumLibs
123-
${LABEL}
124-
BASE_DIRECTORY
125-
"/"
126-
EXCLUDE
127-
"_deps"
128-
"_autogen"
129-
"external"
130-
"/usr"
131-
)
132-
endif()
133-
endforeach()
134-
endif()
45+
set(LLVM_COV
46+
${LLVM_COV_PATH}
47+
show
48+
$<TARGET_FILE:unittests>
49+
${LLVM_OBJS}
50+
-instr-profile=${PROF_DIR}/coverage.profdata
51+
-format=html
52+
-output-dir=${REPORT_DIR}
53+
-show-line-counts-or-regions
54+
-show-directory-coverage
55+
-Xdemangler
56+
c++filt
57+
-Xdemangler
58+
-n
59+
${CMAKE_CURRENT_SOURCE_DIR}
60+
)
61+
add_custom_command(TARGET llvm_coverage POST_BUILD COMMAND ${LLVM_COV})
62+
13563
endfunction()

tests/integration/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ add_test(
3333
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${INTEGRATION_TEST}/
3434
COMMAND
3535
bash -c
36-
"$<TARGET_FILE:integration_${INTEGRATION_TEST}> 2>&1 | cut -f4- -d: | grep -v \"Loading Time\" > ${CMAKE_CURRENT_BINARY_DIR}/output.txt"
36+
"${TEST_ENV_VAR} $<TARGET_FILE:integration_${INTEGRATION_TEST}> 2>&1 | cut -f4- -d: | grep -v \"Loading Time\" > ${CMAKE_CURRENT_BINARY_DIR}/output.txt"
3737
)
3838

3939
set_property(TEST integration_${INTEGRATION_TEST}_save_output PROPERTY LABELS "integration")
@@ -88,7 +88,7 @@ if(LIBXML2_XMLLINT_EXECUTABLE AND SED_EXECUTABLE)
8888
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${INTEGRATION_TEST}/
8989
COMMAND
9090
bash -c
91-
"$<TARGET_FILE:integration_${INTEGRATION_TEST}> ${CMAKE_CURRENT_BINARY_DIR} &&\
91+
"${TEST_ENV_VAR} $<TARGET_FILE:integration_${INTEGRATION_TEST}> ${CMAKE_CURRENT_BINARY_DIR} &&\
9292
\"${LIBXML2_XMLLINT_EXECUTABLE}\" --c14n11 ${CMAKE_CURRENT_BINARY_DIR}/keymapping-valid.xml > ${CMAKE_CURRENT_BINARY_DIR}/keymapping-valid-out-lint.xml &&\
9393
\"${LIBXML2_XMLLINT_EXECUTABLE}\" --c14n11 ${CMAKE_CURRENT_SOURCE_DIR}/data/inputs/keymapping-valid.xml > ${CMAKE_CURRENT_BINARY_DIR}/keymapping-valid-in-lint.xml &&\
9494
\"${SED_EXECUTABLE}\" -i.orig '/<!--.*-->/d' ${CMAKE_CURRENT_BINARY_DIR}/keymapping-valid-in-lint.xml &&\

0 commit comments

Comments
 (0)