Skip to content

Commit 9bd1ce4

Browse files
authored
Fix code coverage error (#5765)
* Fix the issue where COVERAGE_CXX_COMPILER_FLAGS is never used
1 parent f69ad4e commit 9bd1ce4

File tree

3 files changed

+62
-58
lines changed

3 files changed

+62
-58
lines changed

cmake/CodeCoverage.cmake

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@
104104
# 2025-08-28, Bronek Kozicki
105105
# - fix "At least one COMMAND must be given" CMake warning from policy CMP0175
106106
#
107+
# 2025-09-03, Jingchen Wu
108+
# - remove the unused function append_coverage_compiler_flags and append_coverage_compiler_flags_to_target
109+
# - add a new function add_code_coverage_to_target
110+
# - remove some unused code
111+
#
107112
# USAGE:
108113
#
109114
# 1. Copy this file into your cmake modules path.
@@ -112,10 +117,8 @@
112117
# using a CMake option() to enable it just optionally):
113118
# include(CodeCoverage)
114119
#
115-
# 3. Append necessary compiler flags for all supported source files:
116-
# append_coverage_compiler_flags()
117-
# Or for specific target:
118-
# append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME)
120+
# 3. Append necessary compiler flags and linker flags for all supported source files:
121+
# add_code_coverage_to_target(<target> <PRIVATE|PUBLIC|INTERFACE>)
119122
#
120123
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og
121124
#
@@ -204,67 +207,69 @@ endforeach()
204207

205208
set(COVERAGE_COMPILER_FLAGS "-g --coverage"
206209
CACHE INTERNAL "")
210+
211+
set(COVERAGE_CXX_COMPILER_FLAGS "")
212+
set(COVERAGE_C_COMPILER_FLAGS "")
213+
set(COVERAGE_CXX_LINKER_FLAGS "")
214+
set(COVERAGE_C_LINKER_FLAGS "")
215+
207216
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
208217
include(CheckCXXCompilerFlag)
209218
include(CheckCCompilerFlag)
219+
include(CheckLinkerFlag)
220+
221+
set(COVERAGE_CXX_COMPILER_FLAGS ${COVERAGE_COMPILER_FLAGS})
222+
set(COVERAGE_C_COMPILER_FLAGS ${COVERAGE_COMPILER_FLAGS})
223+
set(COVERAGE_CXX_LINKER_FLAGS ${COVERAGE_COMPILER_FLAGS})
224+
set(COVERAGE_C_LINKER_FLAGS ${COVERAGE_COMPILER_FLAGS})
210225

211226
check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path)
212227
if(HAVE_cxx_fprofile_abs_path)
213-
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
228+
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_CXX_COMPILER_FLAGS} -fprofile-abs-path")
214229
endif()
215230

216231
check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path)
217232
if(HAVE_c_fprofile_abs_path)
218-
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
233+
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_C_COMPILER_FLAGS} -fprofile-abs-path")
234+
endif()
235+
236+
check_linker_flag(CXX -fprofile-abs-path HAVE_cxx_linker_fprofile_abs_path)
237+
if(HAVE_cxx_linker_fprofile_abs_path)
238+
set(COVERAGE_CXX_LINKER_FLAGS "${COVERAGE_CXX_LINKER_FLAGS} -fprofile-abs-path")
239+
endif()
240+
241+
check_linker_flag(C -fprofile-abs-path HAVE_c_linker_fprofile_abs_path)
242+
if(HAVE_c_linker_fprofile_abs_path)
243+
set(COVERAGE_C_LINKER_FLAGS "${COVERAGE_C_LINKER_FLAGS} -fprofile-abs-path")
219244
endif()
220245

221246
check_cxx_compiler_flag(-fprofile-update=atomic HAVE_cxx_fprofile_update)
222247
if(HAVE_cxx_fprofile_update)
223-
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
248+
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_CXX_COMPILER_FLAGS} -fprofile-update=atomic")
224249
endif()
225250

226251
check_c_compiler_flag(-fprofile-update=atomic HAVE_c_fprofile_update)
227252
if(HAVE_c_fprofile_update)
228-
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
253+
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_C_COMPILER_FLAGS} -fprofile-update=atomic")
254+
endif()
255+
256+
check_linker_flag(CXX -fprofile-update=atomic HAVE_cxx_linker_fprofile_update)
257+
if(HAVE_cxx_linker_fprofile_update)
258+
set(COVERAGE_CXX_LINKER_FLAGS "${COVERAGE_CXX_LINKER_FLAGS} -fprofile-update=atomic")
229259
endif()
230-
endif()
231260

232-
set(CMAKE_Fortran_FLAGS_COVERAGE
233-
${COVERAGE_COMPILER_FLAGS}
234-
CACHE STRING "Flags used by the Fortran compiler during coverage builds."
235-
FORCE )
236-
set(CMAKE_CXX_FLAGS_COVERAGE
237-
${COVERAGE_COMPILER_FLAGS}
238-
CACHE STRING "Flags used by the C++ compiler during coverage builds."
239-
FORCE )
240-
set(CMAKE_C_FLAGS_COVERAGE
241-
${COVERAGE_COMPILER_FLAGS}
242-
CACHE STRING "Flags used by the C compiler during coverage builds."
243-
FORCE )
244-
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
245-
""
246-
CACHE STRING "Flags used for linking binaries during coverage builds."
247-
FORCE )
248-
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
249-
""
250-
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
251-
FORCE )
252-
mark_as_advanced(
253-
CMAKE_Fortran_FLAGS_COVERAGE
254-
CMAKE_CXX_FLAGS_COVERAGE
255-
CMAKE_C_FLAGS_COVERAGE
256-
CMAKE_EXE_LINKER_FLAGS_COVERAGE
257-
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
261+
check_linker_flag(C -fprofile-update=atomic HAVE_c_linker_fprofile_update)
262+
if(HAVE_c_linker_fprofile_update)
263+
set(COVERAGE_C_LINKER_FLAGS "${COVERAGE_C_LINKER_FLAGS} -fprofile-update=atomic")
264+
endif()
265+
266+
endif()
258267

259268
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
260269
if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG))
261270
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
262271
endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)
263272

264-
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
265-
link_libraries(gcov)
266-
endif()
267-
268273
# Defines a target for running and collection code coverage information
269274
# Builds dependencies, runs the given executable and outputs reports.
270275
# NOTE! The executable should always have a ZERO as exit code otherwise
@@ -454,18 +459,19 @@ function(setup_target_for_coverage_gcovr)
454459
)
455460
endfunction() # setup_target_for_coverage_gcovr
456461

457-
function(append_coverage_compiler_flags)
458-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
459-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
460-
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
461-
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
462-
endfunction() # append_coverage_compiler_flags
463-
464-
# Setup coverage for specific library
465-
function(append_coverage_compiler_flags_to_target name)
466-
separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}")
467-
target_compile_options(${name} PRIVATE ${_flag_list})
468-
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
469-
target_link_libraries(${name} PRIVATE gcov)
470-
endif()
471-
endfunction()
462+
function(add_code_coverage_to_target name scope)
463+
separate_arguments(COVERAGE_CXX_COMPILER_FLAGS NATIVE_COMMAND "${COVERAGE_CXX_COMPILER_FLAGS}")
464+
separate_arguments(COVERAGE_C_COMPILER_FLAGS NATIVE_COMMAND "${COVERAGE_C_COMPILER_FLAGS}")
465+
separate_arguments(COVERAGE_CXX_LINKER_FLAGS NATIVE_COMMAND "${COVERAGE_CXX_LINKER_FLAGS}")
466+
separate_arguments(COVERAGE_C_LINKER_FLAGS NATIVE_COMMAND "${COVERAGE_C_LINKER_FLAGS}")
467+
468+
# Add compiler options to the target
469+
target_compile_options(${name} ${scope}
470+
$<$<COMPILE_LANGUAGE:CXX>:${COVERAGE_CXX_COMPILER_FLAGS}>
471+
$<$<COMPILE_LANGUAGE:C>:${COVERAGE_C_COMPILER_FLAGS}>)
472+
473+
target_link_libraries (${name} ${scope}
474+
$<$<LINK_LANGUAGE:CXX>:${COVERAGE_CXX_LINKER_FLAGS} gcov>
475+
$<$<LINK_LANGUAGE:C>:${COVERAGE_C_LINKER_FLAGS} gcov>
476+
)
477+
endfunction() # add_code_coverage_to_target

cmake/RippledCov.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@ setup_target_for_coverage_gcovr(
3636
EXCLUDE "src/test" "include/xrpl/beast/test" "include/xrpl/beast/unit_test" "${CMAKE_BINARY_DIR}/pb-xrpl.libpb"
3737
DEPENDENCIES rippled
3838
)
39+
40+
add_code_coverage_to_target(opts INTERFACE)

cmake/RippledInterface.cmake

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,11 @@ target_compile_options (opts
2828
$<$<AND:$<BOOL:${is_gcc}>,$<COMPILE_LANGUAGE:CXX>>:-Wsuggest-override>
2929
$<$<BOOL:${is_gcc}>:-Wno-maybe-uninitialized>
3030
$<$<BOOL:${perf}>:-fno-omit-frame-pointer>
31-
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${coverage}>>:-g --coverage -fprofile-abs-path>
32-
$<$<AND:$<BOOL:${is_clang}>,$<BOOL:${coverage}>>:-g --coverage>
3331
$<$<BOOL:${profile}>:-pg>
3432
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
3533

3634
target_link_libraries (opts
3735
INTERFACE
38-
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${coverage}>>:-g --coverage -fprofile-abs-path>
39-
$<$<AND:$<BOOL:${is_clang}>,$<BOOL:${coverage}>>:-g --coverage>
4036
$<$<BOOL:${profile}>:-pg>
4137
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
4238

0 commit comments

Comments
 (0)