#!/usr/bin/env bash # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025, The OpenROAD Authors # Generate an lcov/genhtml code coverage report for OpenSTA. # Requires a coverage build: ./etc/Build.sh -coverage # # Usage: # ./etc/CodeCoverage.sh Run all tests, generate report # ./etc/CodeCoverage.sh -tcl-only Run only Tcl tests (skip C++ unit tests) set -euo pipefail cd "$(dirname $(readlink -f $0))/../" buildDir="build" reportDir="coverage-output" tclOnly=no _help() { cat <&2 _help ;; *) echo "unknown option: ${1}" >&2 _help ;; esac shift 1 done if [[ ! -d "${buildDir}" ]]; then echo "Build directory '${buildDir}' not found." >&2 echo "Run ./etc/Build.sh -coverage first." >&2 exit 1 fi # Common lcov flags to suppress all known warnings: # mismatch - GCC/GoogleTest macro function range mismatches # gcov - unexecuted blocks on non-branch lines (GCC optimizer artifacts) # source - source file newer than .gcno notes file (stale build artifacts) # Double-specification (X,X) suppresses the warning output entirely. LCOV_IGNORE="--ignore-errors mismatch,mismatch,gcov,gcov,source,source,unused,unused,negative,negative" # Clear stale coverage data before test execution. # Old .gcda files from previous runs can cause gcov checksum mismatch noise. find "${buildDir}" -name '*.gcda' -delete # Step 1: Run tests if [[ "${tclOnly}" == "yes" ]]; then echo "[INFO] Running Tcl tests only..." ctest --test-dir "${buildDir}" -L tcl -j $(nproc) --output-on-failure || true else echo "[INFO] Running all tests..." ctest --test-dir "${buildDir}" -j $(nproc) --output-on-failure || true fi # Step 2: Capture coverage echo "[INFO] Capturing coverage data..." lcov --capture \ -d "${buildDir}" \ -o "${buildDir}/coverage.info" \ --quiet \ ${LCOV_IGNORE} # Step 3: Filter system/build/test dirs lcov --remove "${buildDir}/coverage.info" \ '/usr/*' \ '*/build/*' \ '*/test/*' \ -o "${buildDir}/filtered.info" \ --quiet \ ${LCOV_IGNORE} # Step 4: Generate HTML report GENHTML_IGNORE="--ignore-errors unmapped,unmapped,inconsistent,inconsistent,corrupt,corrupt,negative,negative,empty,empty,format,format,mismatch,mismatch,source,source" mkdir -p "${reportDir}" genhtml "${buildDir}/filtered.info" \ --output-directory "${reportDir}" \ --quiet \ ${GENHTML_IGNORE} || true echo "" echo "=== Coverage report generated ===" echo "Open $(pwd)/${reportDir}/index.html in a browser to view." echo "" lcov --summary "${buildDir}/filtered.info" ${LCOV_IGNORE} 2>&1 || true