@@ -55,7 +55,7 @@ resolve_tool() {
5555 return 1
5656}
5757
58- resolve_gcov_command () {
58+ resolve_coverage_gcov_tool () {
5959 local family=" $1 "
6060 if [[ " ${family} " != " clang" ]]; then
6161 echo " gcov"
@@ -70,12 +70,17 @@ resolve_gcov_command() {
7070 llvm_cov=" $( command -v llvm-cov 2> /dev/null || true) "
7171 fi
7272
73- if [[ -n " ${llvm_cov} " ]]; then
74- echo " ${llvm_cov} gcov"
73+ if [[ -z " ${llvm_cov} " ]]; then
74+ echo " gcov"
7575 return 0
7676 fi
7777
78- echo " gcov"
78+ local wrapper_path=" ${BUILD_ROOT} /coverage/.llvm-gcov-wrapper.sh"
79+ mkdir -p " ${BUILD_ROOT} /coverage"
80+ printf ' #!/usr/bin/env sh\n%s gcov "$@"\n' " ${llvm_cov} " > " ${wrapper_path} "
81+ chmod +x " ${wrapper_path} "
82+
83+ echo " ${wrapper_path} "
7984}
8085
8186cpu_count () {
@@ -331,8 +336,11 @@ run_coverage_gate() {
331336
332337 start_section " coverage"
333338
334- local gcov_cmd
335- gcov_cmd=" $( resolve_gcov_command " ${COMPILER_FAMILY} " ) "
339+ local gcov_tool
340+ gcov_tool=" $( resolve_coverage_gcov_tool " ${COMPILER_FAMILY} " ) "
341+ if [[ " ${COMPILER_FAMILY} " == " clang" && " ${gcov_tool} " == " gcov" ]]; then
342+ echo " Using default gcov for coverage; this may fail on mixed compiler profiles."
343+ fi
336344
337345 local coverage_flags=" ${BASE_CXX_FLAGS} --coverage"
338346 local coverage_dir=" ${BUILD_ROOT} /coverage"
@@ -357,11 +365,12 @@ run_coverage_gate() {
357365 local coverage_info=" ${coverage_dir} /coverage.info"
358366 local coverage_extract=" ${coverage_dir} /coverage-filtered.info"
359367 local lcov_report=" ${coverage_dir} /coverage-lcov-summary.txt"
360- local lcov_capture_errors=" inconsistent,source,format,unsupported,empty,gcov"
368+ local lcov_capture_errors=" inconsistent,source,format,unsupported,empty,gcov,version "
361369 local lcov_extract_errors=" inconsistent,format,count,source,unsupported"
362370 local lcov_summary_errors=" inconsistent,corrupt,unsupported,count"
363371 if LC_ALL=C lcov --capture --base-directory " ${REPO_ROOT} " --directory " ${coverage_dir} " \
364372 --output-file " ${coverage_info} " \
373+ --gcov-tool " ${gcov_tool} " \
365374 --ignore-errors " ${lcov_capture_errors} " \
366375 > " ${coverage_report_file} " 2>&1 && \
367376 LC_ALL=C lcov --extract " ${coverage_info} " " ${REPO_ROOT} /*" --output-file " ${coverage_extract} " \
@@ -384,7 +393,7 @@ run_coverage_gate() {
384393
385394 if [[ -z " ${coverage_percent} " ]] && command -v gcovr > /dev/null 2>&1 ; then
386395 if gcovr --root " ${REPO_ROOT} " " ${coverage_dir} " --txt -j 1 \
387- --gcov-executable " ${gcov_cmd } " --gcov-ignore-errors all \
396+ --gcov-executable " ${gcov_tool } " --gcov-ignore-errors all \
388397 > " ${coverage_report_file} " 2>&1 ; then
389398 used_tool=" gcovr"
390399 coverage_report=" $( cat " ${coverage_report_file} " ) "
0 commit comments