aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordragonmux <git@dragonmux.network>2023-08-23 22:46:57 +0100
committerDylan Baker <dylan@pnwbakers.com>2024-02-24 11:35:02 -0800
commitcfada46694aa952369063d3f4fa4e63d7e637ba3 (patch)
tree590fb6f1b1cd1b9b83f51380106fc434647dbc6a
parenta234c001a0011cd10953a8e4f265d64a12ac0a50 (diff)
downloadmeson-cfada46694aa952369063d3f4fa4e63d7e637ba3.zip
meson-cfada46694aa952369063d3f4fa4e63d7e637ba3.tar.gz
meson-cfada46694aa952369063d3f4fa4e63d7e637ba3.tar.bz2
scripts/coverage: Implemented handling for passing the gcovr and llvm-cov binaries to use to the script
-rw-r--r--mesonbuild/backend/ninjabackend.py3
-rw-r--r--mesonbuild/environment.py21
-rw-r--r--mesonbuild/scripts/coverage.py21
3 files changed, 30 insertions, 15 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 2606ac4..421bb62 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -630,7 +630,8 @@ class NinjaBackend(backends.Backend):
key = OptionKey('b_coverage')
if (key in self.environment.coredata.options and
self.environment.coredata.options[key].value):
- gcovr_exe, gcovr_version, lcov_exe, lcov_version, genhtml_exe, _ = environment.find_coverage_tools()
+ gcovr_exe, gcovr_version, lcov_exe, lcov_version, genhtml_exe, llvm_cov_exe = environment.find_coverage_tools(self.environment.coredata)
+ mlog.debug(f'Using {gcovr_exe} ({gcovr_version}), {lcov_exe} and {llvm_cov_exe} for code coverage')
if gcovr_exe or (lcov_exe and genhtml_exe):
self.add_build_comment(NinjaComment('Coverage rules'))
self.generate_coverage_rules(gcovr_exe, gcovr_version)
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 14e4ee8..dd6d7ba 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -72,8 +72,7 @@ def _get_env_var(for_machine: MachineChoice, is_cross: bool, var_name: str) -> T
return value
-def detect_gcovr(min_version: str = '3.3', log: bool = False):
- gcovr_exe = 'gcovr'
+def detect_gcovr(gcovr_exe: str = 'gcovr', min_version: str = '3.3', log: bool = False):
try:
p, found = Popen_safe([gcovr_exe, '--version'])[0:2]
except (FileNotFoundError, PermissionError):
@@ -86,8 +85,7 @@ def detect_gcovr(min_version: str = '3.3', log: bool = False):
return gcovr_exe, found
return None, None
-def detect_lcov(log: bool = False):
- lcov_exe = 'lcov'
+def detect_lcov(lcov_exe: str = 'lcov', log: bool = False):
try:
p, found = Popen_safe([lcov_exe, '--version'])[0:2]
except (FileNotFoundError, PermissionError):
@@ -107,16 +105,19 @@ def detect_llvm_cov():
return tool
return None
-def find_coverage_tools() -> T.Tuple[T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str]]:
+def detect_lcov_genhtml(lcov_exe: str = 'lcov', genhtml_exe: str = 'genhtml'):
+ lcov_exe, lcov_version = detect_lcov(lcov_exe)
+ if not mesonlib.exe_exists([genhtml_exe, '--version']):
+ genhtml_exe = None
+
+ return lcov_exe, lcov_version, genhtml_exe
+
+def find_coverage_tools(coredata: coredata.CoreData) -> T.Tuple[T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str], T.Optional[str]]:
gcovr_exe, gcovr_version = detect_gcovr()
llvm_cov_exe = detect_llvm_cov()
- lcov_exe, lcov_version = detect_lcov()
- genhtml_exe = 'genhtml'
-
- if not mesonlib.exe_exists([genhtml_exe, '--version']):
- genhtml_exe = None
+ lcov_exe, lcov_version, genhtml_exe = detect_lcov_genhtml()
return gcovr_exe, gcovr_version, lcov_exe, lcov_version, genhtml_exe, llvm_cov_exe
diff --git a/mesonbuild/scripts/coverage.py b/mesonbuild/scripts/coverage.py
index 2375e45..bded052 100644
--- a/mesonbuild/scripts/coverage.py
+++ b/mesonbuild/scripts/coverage.py
@@ -8,11 +8,19 @@ from mesonbuild import environment, mesonlib
import argparse, re, sys, os, subprocess, pathlib, stat
import typing as T
-def coverage(outputs: T.List[str], source_root: str, subproject_root: str, build_root: str, log_dir: str, use_llvm_cov: bool) -> int:
+def coverage(outputs: T.List[str], source_root: str, subproject_root: str, build_root: str, log_dir: str, use_llvm_cov: bool,
+ gcovr_exe: str, llvm_cov_exe: str) -> int:
outfiles = []
exitcode = 0
- (gcovr_exe, gcovr_version, lcov_exe, lcov_version, genhtml_exe, llvm_cov_exe) = environment.find_coverage_tools()
+ if gcovr_exe == '':
+ gcovr_exe = None
+ else:
+ gcovr_exe, gcovr_version = environment.detect_gcovr(gcovr_exe)
+ if llvm_cov_exe == '' or not mesonlib.exe_exists([llvm_cov_exe, '--version']):
+ llvm_cov_exe = None
+
+ lcov_exe, lcov_version, genhtml_exe = environment.detect_lcov_genhtml()
# load config files for tools if available in the source tree
# - lcov requires manually specifying a per-project config
@@ -186,8 +194,12 @@ def run(args: T.List[str]) -> int:
const='sonarqube', help='generate Sonarqube Xml report')
parser.add_argument('--html', dest='outputs', action='append_const',
const='html', help='generate Html report')
- parser.add_argument('--use_llvm_cov', action='store_true',
+ parser.add_argument('--use-llvm-cov', action='store_true',
help='use llvm-cov')
+ parser.add_argument('--gcovr', action='store', default='',
+ help='The gcovr executable to use if specified')
+ parser.add_argument('--llvm-cov', action='store', default='',
+ help='The llvm-cov executable to use if specified')
parser.add_argument('source_root')
parser.add_argument('subproject_root')
parser.add_argument('build_root')
@@ -195,7 +207,8 @@ def run(args: T.List[str]) -> int:
options = parser.parse_args(args)
return coverage(options.outputs, options.source_root,
options.subproject_root, options.build_root,
- options.log_dir, options.use_llvm_cov)
+ options.log_dir, options.use_llvm_cov,
+ options.gcovr, options.llvm_cov)
if __name__ == '__main__':
sys.exit(run(sys.argv[1:]))