diff options
author | dragonmux <git@dragonmux.network> | 2023-08-23 22:46:57 +0100 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2024-02-24 11:35:02 -0800 |
commit | cfada46694aa952369063d3f4fa4e63d7e637ba3 (patch) | |
tree | 590fb6f1b1cd1b9b83f51380106fc434647dbc6a | |
parent | a234c001a0011cd10953a8e4f265d64a12ac0a50 (diff) | |
download | meson-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.py | 3 | ||||
-rw-r--r-- | mesonbuild/environment.py | 21 | ||||
-rw-r--r-- | mesonbuild/scripts/coverage.py | 21 |
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:])) |