From 111e3df45dddd5b4ae98ad957f8183980c90a503 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Wed, 10 May 2017 19:31:12 +0300 Subject: Moved coverage commands to a standalone script. --- mesonbuild/scripts/coverage.py | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 mesonbuild/scripts/coverage.py (limited to 'mesonbuild/scripts/coverage.py') diff --git a/mesonbuild/scripts/coverage.py b/mesonbuild/scripts/coverage.py new file mode 100644 index 0000000..59e475a --- /dev/null +++ b/mesonbuild/scripts/coverage.py @@ -0,0 +1,61 @@ +# Copyright 2017 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from mesonbuild import environment + +import sys, os, subprocess, re + +def coverage(source_root, build_root, log_dir): + (gcovr_exe, lcov_exe, genhtml_exe) = environment.find_coverage_tools() + if gcovr_exe: + subprocess.check_call([gcovr_exe, + '-x', + '-r', source_root, + '-o', os.path.join(log_dir, 'coverage.xml'), + ]) + subprocess.check_call([gcovr_exe, + '-r', source_root, + '-o', os.path.join(log_dir, 'coverage.txt'), + ]) + if lcov_exe and genhtml_exe: + htmloutdir = os.path.join(log_dir, 'coveragereport') + covinfo = os.path.join(log_dir, 'coverage.info') + lcov_command = [lcov_exe, + '--directory', build_root, + '--capture', + '--output-file', covinfo, + '--no-checksum', + '--rc', 'lcov_branch_coverage=1', + ] + genhtml_command = [genhtml_exe, + '--prefix', build_root, + '--output-directory', htmloutdir, + '--title', 'Code coverage', + '--legend', + '--show-details', + '--branch-coverage', + covinfo] + subprocess.check_call(lcov_command) + subprocess.check_call(genhtml_command) + return 0 + +def run(args): + if not os.path.isfile('build.ninja'): + print('Coverage currently only works with the Ninja backend.') + return 1 + source_root, build_root, log_dir = args[:] + return coverage(source_root, build_root, log_dir) + +if __name__ == '__main__': + sys.exit(run(sys.argv[1:])) \ No newline at end of file -- cgit v1.1 From 95f8cb93b3d0ce99ff99146517625e0d79e848ad Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Wed, 10 May 2017 19:57:47 +0300 Subject: Strip system directories and show coverage for files not executed at all. Closes #1721. --- mesonbuild/scripts/coverage.py | 56 ++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'mesonbuild/scripts/coverage.py') diff --git a/mesonbuild/scripts/coverage.py b/mesonbuild/scripts/coverage.py index 59e475a..441ec0c 100644 --- a/mesonbuild/scripts/coverage.py +++ b/mesonbuild/scripts/coverage.py @@ -14,7 +14,12 @@ from mesonbuild import environment -import sys, os, subprocess, re +import sys, os, subprocess + +def remove_dir_from_trace(lcov_command, covfile, dirname): + tmpfile = covfile + '.tmp' + subprocess.check_call([lcov_command, '--remove', covfile, dirname, '-o', tmpfile]) + os.replace(tmpfile, covfile) def coverage(source_root, build_root, log_dir): (gcovr_exe, lcov_exe, genhtml_exe) = environment.find_coverage_tools() @@ -31,23 +36,36 @@ def coverage(source_root, build_root, log_dir): if lcov_exe and genhtml_exe: htmloutdir = os.path.join(log_dir, 'coveragereport') covinfo = os.path.join(log_dir, 'coverage.info') - lcov_command = [lcov_exe, - '--directory', build_root, - '--capture', - '--output-file', covinfo, - '--no-checksum', - '--rc', 'lcov_branch_coverage=1', - ] - genhtml_command = [genhtml_exe, - '--prefix', build_root, - '--output-directory', htmloutdir, - '--title', 'Code coverage', - '--legend', - '--show-details', - '--branch-coverage', - covinfo] - subprocess.check_call(lcov_command) - subprocess.check_call(genhtml_command) + initial_tracefile = covinfo + '.initial' + run_tracefile = covinfo + '.run' + subprocess.check_call([lcov_exe, + '--directory', build_root, + '--capture', + '--initial', + '--output-file', + initial_tracefile]) + subprocess.check_call([lcov_exe, + '--directory', build_root, + '--capture', + '--output-file', run_tracefile, + '--no-checksum', + '--rc', 'lcov_branch_coverage=1', + ]) + # Join initial and test results. + subprocess.check_call([lcov_exe, + '-a', initial_tracefile, + '-a', run_tracefile, + '-o', covinfo]) + remove_dir_from_trace(lcov_exe, covinfo, '/usr/include/*') + remove_dir_from_trace(lcov_exe, covinfo, '/usr/local/include/*') + subprocess.check_call([genhtml_exe, + '--prefix', build_root, + '--output-directory', htmloutdir, + '--title', 'Code coverage', + '--legend', + '--show-details', + '--branch-coverage', + covinfo]) return 0 def run(args): @@ -58,4 +76,4 @@ def run(args): return coverage(source_root, build_root, log_dir) if __name__ == '__main__': - sys.exit(run(sys.argv[1:])) \ No newline at end of file + sys.exit(run(sys.argv[1:])) -- cgit v1.1