Add gcovr 4.2 support

The out-of-source build syntax for gcovr 4.2 is different compared to
previous versions and therefore an update was needed. In researching the
most appropriate solution it was found that any gcovr version older than
3.3 always resulted in 0% coverage. Because of this, rather than adding
an additional layer of logic, some already existing logic was modified
to ensure correct syntax for the new version, while versions older than
3.3 are flagged as not supported.

Closes mesonbuild#5089.
pull/5319/head
Richard Kjerstadius 6 years ago
parent add821db64
commit 48ee6a6148
  1. 6
      mesonbuild/environment.py
  2. 29
      mesonbuild/scripts/coverage.py

@ -83,7 +83,7 @@ from .compilers import (
build_filename = 'meson.build'
def detect_gcovr(version='3.1', log=False):
def detect_gcovr(min_version='3.3', new_rootdir_version='4.2', log=False):
gcovr_exe = 'gcovr'
try:
p, found = Popen_safe([gcovr_exe, '--version'])[0:2]
@ -91,10 +91,10 @@ def detect_gcovr(version='3.1', log=False):
# Doesn't exist in PATH or isn't executable
return None, None
found = search_version(found)
if p.returncode == 0:
if p.returncode == 0 and mesonlib.version_compare(found, '>=' + min_version):
if log:
mlog.log('Found gcovr-{} at {}'.format(found, shlex.quote(shutil.which(gcovr_exe))))
return gcovr_exe, mesonlib.version_compare(found, '>=' + version)
return gcovr_exe, mesonlib.version_compare(found, '>=' + new_rootdir_version)
return None, None
def find_coverage_tools():

@ -22,35 +22,33 @@ def coverage(outputs, source_root, subproject_root, build_root, log_dir):
(gcovr_exe, gcovr_new_rootdir, lcov_exe, genhtml_exe) = environment.find_coverage_tools()
# gcovr >= 3.1 interprets rootdir differently
# gcovr >= 4.2 requires a different syntax for out of source builds
if gcovr_new_rootdir:
gcovr_rootdir = build_root
gcovr_base_cmd = [gcovr_exe, '-r', source_root, build_root]
else:
gcovr_rootdir = source_root
gcovr_base_cmd = [gcovr_exe, '-r', build_root]
if not outputs or 'xml' in outputs:
if gcovr_exe:
subprocess.check_call([gcovr_exe,
'-x',
'-r', gcovr_rootdir,
subprocess.check_call(gcovr_base_cmd +
['-x',
'-e', subproject_root,
'-o', os.path.join(log_dir, 'coverage.xml'),
])
outfiles.append(('Xml', pathlib.Path(log_dir, 'coverage.xml')))
elif outputs:
print('gcovr needed to generate Xml coverage report')
print('gcovr >= 3.3 needed to generate Xml coverage report')
exitcode = 1
if not outputs or 'text' in outputs:
if gcovr_exe:
subprocess.check_call([gcovr_exe,
'-r', gcovr_rootdir,
'-e', subproject_root,
subprocess.check_call(gcovr_base_cmd +
['-e', subproject_root,
'-o', os.path.join(log_dir, 'coverage.txt'),
])
outfiles.append(('Text', pathlib.Path(log_dir, 'coverage.txt')))
elif outputs:
print('gcovr needed to generate text coverage report')
print('gcovr >= 3.3 needed to generate text coverage report')
exitcode = 1
if not outputs or 'html' in outputs:
@ -101,21 +99,20 @@ def coverage(outputs, source_root, subproject_root, build_root, log_dir):
'--branch-coverage',
covinfo])
outfiles.append(('Html', pathlib.Path(htmloutdir, 'index.html')))
elif gcovr_exe and gcovr_new_rootdir:
elif gcovr_exe:
htmloutdir = os.path.join(log_dir, 'coveragereport')
if not os.path.isdir(htmloutdir):
os.mkdir(htmloutdir)
subprocess.check_call([gcovr_exe,
'--html',
subprocess.check_call(gcovr_base_cmd +
['--html',
'--html-details',
'--print-summary',
'-r', build_root,
'-e', subproject_root,
'-o', os.path.join(htmloutdir, 'index.html'),
])
outfiles.append(('Html', pathlib.Path(htmloutdir, 'index.html')))
elif outputs:
print('lcov/genhtml or gcovr >= 3.2 needed to generate Html coverage report')
print('lcov/genhtml or gcovr >= 3.3 needed to generate Html coverage report')
exitcode = 1
if not outputs and not outfiles:

Loading…
Cancel
Save