Skip to content

Commit dd115d4

Browse files
committed
Rework LLVM-based code coverage
Removed the `ccov-processing-TARGET` target, and replaced with the use of custom commands and chained by dependency files instead.
1 parent 7fd0941 commit dd115d4

File tree

1 file changed

+46
-36
lines changed

1 file changed

+46
-36
lines changed

code-coverage.cmake

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,18 @@ function(target_code_coverage TARGET_NAME)
333333
if(target_type STREQUAL "SHARED_LIBRARY" AND target_code_coverage_ALL)
334334
if(CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang"
335335
OR CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?[Cc]lang")
336-
add_custom_target(
337-
ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME}
336+
add_custom_command(
337+
OUTPUT
338+
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/${target_code_coverage_COVERAGE_TARGET_NAME}
338339
COMMAND
339340
${CMAKE_COMMAND} -E echo "-object=$<TARGET_FILE:${TARGET_NAME}>" >
340341
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/${target_code_coverage_COVERAGE_TARGET_NAME}
341342
DEPENDS ${TARGET_NAME})
343+
add_custom_target(
344+
ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME}
345+
DEPENDS
346+
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/${target_code_coverage_COVERAGE_TARGET_NAME}
347+
)
342348

343349
if(NOT TARGET ccov-libs)
344350
message(
@@ -374,8 +380,8 @@ function(target_code_coverage TARGET_NAME)
374380
# Run the executable, generating raw profile data Make the run data
375381
# available for further processing. Separated to allow Windows to run this
376382
# target serially.
377-
add_custom_target(
378-
ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME}
383+
add_custom_command(
384+
OUTPUT ${target_code_coverage_COVERAGE_TARGET_NAME}.profraw
379385
COMMAND
380386
${CMAKE_COMMAND} -E env ${CMAKE_CROSSCOMPILING_EMULATOR}
381387
${target_code_coverage_PRE_ARGS}
@@ -384,22 +390,27 @@ function(target_code_coverage TARGET_NAME)
384390
COMMAND
385391
${CMAKE_COMMAND} -E echo "-object=$<TARGET_FILE:${TARGET_NAME}>"
386392
${LINKED_OBJECTS} >
387-
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/$${target_code_coverage_COVERAGE_TARGET_NAME}
393+
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/${target_code_coverage_COVERAGE_TARGET_NAME}
388394
COMMAND
389395
${CMAKE_COMMAND} -E echo
390396
"${CMAKE_CURRENT_BINARY_DIR}/${target_code_coverage_COVERAGE_TARGET_NAME}.profraw"
391397
>
392398
${CMAKE_COVERAGE_DATA_DIRECTORY}/profraw/${target_code_coverage_COVERAGE_TARGET_NAME}
399+
COMMAND ${CMAKE_COMMAND} -E rm -f
400+
${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
393401
DEPENDS ccov-libs ${TARGET_NAME})
402+
add_custom_target(
403+
ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME}
404+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profraw)
394405

395406
# Merge the generated profile data so llvm-cov can process it
396-
add_custom_target(
397-
ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME}
407+
add_custom_command(
408+
OUTPUT ${target_code_coverage_COVERAGE_TARGET_NAME}.profdata
398409
COMMAND
399410
${LLVM_PROFDATA_PATH} merge -sparse
400411
${target_code_coverage_COVERAGE_TARGET_NAME}.profraw -o
401412
${target_code_coverage_COVERAGE_TARGET_NAME}.profdata
402-
DEPENDS)
413+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profraw)
403414

404415
# Ignore regex only works on LLVM >= 7
405416
if(LLVM_COV_VERSION VERSION_GREATER_EQUAL "7.0.0")
@@ -416,7 +427,7 @@ function(target_code_coverage TARGET_NAME)
416427
${LLVM_COV_PATH} show $<TARGET_FILE:${TARGET_NAME}>
417428
-instr-profile=${target_code_coverage_COVERAGE_TARGET_NAME}.profdata
418429
-show-line-counts-or-regions ${LINKED_OBJECTS} ${EXCLUDE_REGEX}
419-
DEPENDS ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME})
430+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profdata)
420431

421432
# Print out a summary of the coverage information to the command line
422433
add_custom_target(
@@ -425,7 +436,7 @@ function(target_code_coverage TARGET_NAME)
425436
${LLVM_COV_PATH} report $<TARGET_FILE:${TARGET_NAME}>
426437
-instr-profile=${target_code_coverage_COVERAGE_TARGET_NAME}.profdata
427438
${LINKED_OBJECTS} ${EXCLUDE_REGEX}
428-
DEPENDS ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME})
439+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profdata)
429440

430441
# Export coverage information so continuous integration tools (e.g.
431442
# Jenkins) can consume it
@@ -436,7 +447,7 @@ function(target_code_coverage TARGET_NAME)
436447
-instr-profile=${target_code_coverage_COVERAGE_TARGET_NAME}.profdata
437448
-format="text" ${LINKED_OBJECTS} ${EXCLUDE_REGEX} >
438449
${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/${target_code_coverage_COVERAGE_TARGET_NAME}.json
439-
DEPENDS ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME})
450+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profdata)
440451

441452
# Only generates HTML output of the coverage information for perusal
442453
add_custom_target(
@@ -447,15 +458,12 @@ function(target_code_coverage TARGET_NAME)
447458
-show-line-counts-or-regions
448459
-output-dir=${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/${target_code_coverage_COVERAGE_TARGET_NAME}
449460
-format="html" ${LINKED_OBJECTS} ${EXCLUDE_REGEX}
450-
DEPENDS ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME})
461+
DEPENDS ${target_code_coverage_COVERAGE_TARGET_NAME}.profdata)
451462

452463
# Generates HTML output of the coverage information for perusal
453464
add_custom_target(
454465
ccov-${target_code_coverage_COVERAGE_TARGET_NAME}
455-
COMMAND
456-
DEPENDS ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME}
457-
ccov-processing-${target_code_coverage_COVERAGE_TARGET_NAME}
458-
ccov-html-${target_code_coverage_COVERAGE_TARGET_NAME})
466+
DEPENDS ccov-html-${target_code_coverage_COVERAGE_TARGET_NAME})
459467

460468
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES
461469
"GNU")
@@ -556,14 +564,14 @@ function(target_code_coverage TARGET_NAME)
556564

557565
# ALL
558566
if(target_code_coverage_ALL)
559-
if(NOT TARGET ccov-all-processing)
567+
if(NOT TARGET ccov-all-run)
560568
message(
561569
FATAL_ERROR
562570
"Calling target_code_coverage with 'ALL' must be after a call to 'add_code_coverage_all_targets'."
563571
)
564572
endif()
565573

566-
add_dependencies(ccov-all-processing
574+
add_dependencies(ccov-all-run
567575
ccov-run-${target_code_coverage_COVERAGE_TARGET_NAME})
568576
endif()
569577
endif()
@@ -612,34 +620,36 @@ function(add_code_coverage_all_targets)
612620
if(CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang"
613621
OR CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?[Cc]lang")
614622

623+
add_custom_target(ccov-all-run)
624+
615625
# Merge the profile data for all of the run targets
616626
if(WIN32)
617-
add_custom_target(
618-
ccov-all-processing
627+
add_custom_command(
628+
OUTPUT ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
619629
COMMAND powershell cat ${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/* >
620630
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-objects.list
621631
COMMAND powershell cat ${CMAKE_COVERAGE_DATA_DIRECTORY}/profraw/* >
622632
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list
623633
COMMAND
624634
powershell -Command $$FILELIST = Get-Content
625-
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list \;
626-
llvm-profdata.exe merge -o
627-
${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata -sparse $$FILELIST)
635+
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list \; llvm-profdata.exe
636+
merge -o ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata -sparse
637+
$$FILELIST
638+
DEPENDS ccov-all-run)
628639
else()
629-
add_custom_target(
630-
ccov-all-processing
640+
add_custom_command(
641+
OUTPUT ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
631642
COMMAND
632-
${CMAKE_COMMAND} -E cat
633-
${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/* >
643+
${CMAKE_COMMAND} -E cat ${CMAKE_COVERAGE_DATA_DIRECTORY}/objects/* >
634644
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-objects.list
635645
COMMAND
636-
${CMAKE_COMMAND} -E cat
637-
${CMAKE_COVERAGE_DATA_DIRECTORY}/profraw/* >
646+
${CMAKE_COMMAND} -E cat ${CMAKE_COVERAGE_DATA_DIRECTORY}/profraw/* >
638647
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list
639648
COMMAND
640649
${LLVM_PROFDATA_PATH} merge -o
641650
${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata -sparse `cat
642-
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list`)
651+
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-profraw.list`
652+
DEPENDS ccov-all-run)
643653
endif()
644654

645655
# Regex exclude only available for LLVM >= 7
@@ -660,7 +670,7 @@ function(add_code_coverage_all_targets)
660670
report $$FILELIST
661671
-instr-profile=${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
662672
${EXCLUDE_REGEX}
663-
DEPENDS ccov-all-processing)
673+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
664674
else()
665675
add_custom_target(
666676
ccov-all-report
@@ -669,7 +679,7 @@ function(add_code_coverage_all_targets)
669679
${CMAKE_COVERAGE_DATA_DIRECTORY}/all-objects.list`
670680
-instr-profile=${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
671681
${EXCLUDE_REGEX}
672-
DEPENDS ccov-all-processing)
682+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
673683
endif()
674684

675685
# Export coverage information so continuous integration tools (e.g. Jenkins)
@@ -684,7 +694,7 @@ function(add_code_coverage_all_targets)
684694
-instr-profile=${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
685695
-format="text" ${EXCLUDE_REGEX} >
686696
${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/coverage.json
687-
DEPENDS ccov-all-processing)
697+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
688698
else()
689699
add_custom_target(
690700
ccov-all-export
@@ -694,7 +704,7 @@ function(add_code_coverage_all_targets)
694704
-instr-profile=${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata
695705
-format="text" ${EXCLUDE_REGEX} >
696706
${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/coverage.json
697-
DEPENDS ccov-all-processing)
707+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
698708
endif()
699709

700710
# Generate HTML output of all added targets for perusal
@@ -709,7 +719,7 @@ function(add_code_coverage_all_targets)
709719
-show-line-counts-or-regions
710720
-output-dir=${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/all-merged
711721
-format="html" ${EXCLUDE_REGEX}
712-
DEPENDS ccov-all-processing)
722+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
713723
else()
714724
add_custom_target(
715725
ccov-all
@@ -720,7 +730,7 @@ function(add_code_coverage_all_targets)
720730
-show-line-counts-or-regions
721731
-output-dir=${CMAKE_COVERAGE_OUTPUT_DIRECTORY}/all-merged
722732
-format="html" ${EXCLUDE_REGEX}
723-
DEPENDS ccov-all-processing)
733+
DEPENDS ${CMAKE_COVERAGE_DATA_DIRECTORY}/ccov-all.profdata)
724734
endif()
725735

726736
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES

0 commit comments

Comments
 (0)