diff options
author | Joel Klinghed <the_jk@spawned.biz> | 2018-03-14 21:54:33 +0100 |
---|---|---|
committer | Joel Klinghed <the_jk@spawned.biz> | 2018-03-19 21:52:34 +0100 |
commit | 79bb1df04faf96f03f2b5a6b2dcb95fcff1a3b0d (patch) | |
tree | ff0ac5e1743b62b133f70ce1b3dacf2dc2567d48 /mesonbuild/backend | |
parent | 50c66f1f5c099cb1286dab8a646bed55f39d1e3e (diff) | |
download | meson-79bb1df04faf96f03f2b5a6b2dcb95fcff1a3b0d.zip meson-79bb1df04faf96f03f2b5a6b2dcb95fcff1a3b0d.tar.gz meson-79bb1df04faf96f03f2b5a6b2dcb95fcff1a3b0d.tar.bz2 |
Use standalone coverage script for legacy targets
ninja coverage -> generate all possible reports (text, xml, html)
depending on gcovr and/or lcov/genhtml availability.
ninja coverage-html -> generate only html report
ninja coverage-xml -> generate only xml report
ninja coverage-text -> generate only text report
Make all targets phony, the old legacy rules where just annoying as
you would have to remove the old report before being able to generate
a new one.
ninja coverage succeeds if it can generate at least one report.
ninja coverage-* only succeeds if it can generate the requested report
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 108 |
1 files changed, 29 insertions, 79 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index ba249ed..086d4e1 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -613,13 +613,17 @@ int dummy; self.create_target_alias(target_name, outfile) self.processed_targets[target.get_id()] = True + def generate_coverage_command(self, elem, outputs): + elem.add_item('COMMAND', self.environment.get_build_command() + + ['--internal', 'coverage'] + + outputs + + [self.environment.get_source_dir(), + self.environment.get_build_dir(), + self.environment.get_log_dir()]) + def generate_coverage_rules(self, outfile): e = NinjaBuildElement(self.all_outputs, 'meson-coverage', 'CUSTOM_COMMAND', 'PHONY') - e.add_item('COMMAND', self.environment.get_build_command() + - ['--internal', 'coverage', - self.environment.get_source_dir(), - self.environment.get_build_dir(), - self.environment.get_log_dir()]) + self.generate_coverage_command(e, []) e.add_item('description', 'Generates coverage reports.') e.write(outfile) # Alias that runs the target defined above @@ -627,80 +631,26 @@ int dummy; self.generate_coverage_legacy_rules(outfile) def generate_coverage_legacy_rules(self, outfile): - (gcovr_exe, gcovr_new_rootdir, lcov_exe, genhtml_exe) = environment.find_coverage_tools() - added_rule = False - if gcovr_exe: - # gcovr >= 3.1 interprets rootdir differently - if gcovr_new_rootdir: - rootdir = self.environment.get_build_dir() - else: - rootdir = self.environment.get_source_dir(), - added_rule = True - elem = NinjaBuildElement(self.all_outputs, 'meson-coverage-xml', 'CUSTOM_COMMAND', '') - elem.add_item('COMMAND', [gcovr_exe, '-x', '-r', rootdir, - '-o', os.path.join(self.environment.get_log_dir(), 'coverage.xml')]) - elem.add_item('DESC', 'Generating XML coverage report.') - elem.write(outfile) - # Alias that runs the target defined above - self.create_target_alias('meson-coverage-xml', outfile) - elem = NinjaBuildElement(self.all_outputs, 'meson-coverage-text', 'CUSTOM_COMMAND', '') - elem.add_item('COMMAND', [gcovr_exe, '-r', rootdir, - '-o', os.path.join(self.environment.get_log_dir(), 'coverage.txt')]) - elem.add_item('DESC', 'Generating text coverage report.') - elem.write(outfile) - # Alias that runs the target defined above - self.create_target_alias('meson-coverage-text', outfile) - if lcov_exe and genhtml_exe: - added_rule = True - htmloutdir = os.path.join(self.environment.get_log_dir(), 'coveragereport') - covinfo = os.path.join(self.environment.get_log_dir(), 'coverage.info') - phony_elem = NinjaBuildElement(self.all_outputs, 'meson-coverage-html', 'phony', os.path.join(htmloutdir, 'index.html')) - phony_elem.write(outfile) - # Alias that runs the target defined above - self.create_target_alias('meson-coverage-html', outfile) - elem = NinjaBuildElement(self.all_outputs, os.path.join(htmloutdir, 'index.html'), 'CUSTOM_COMMAND', '') - - subproject_dir = self.build.get_subproject_dir() - command = [lcov_exe, - '--directory', self.environment.get_build_dir(), - '--capture', - '--output-file', covinfo, - '--no-checksum', - '&&', lcov_exe, - '--extract', - covinfo, - os.path.join(self.environment.get_source_dir(), '*'), - '--output-file', covinfo, - '&&', lcov_exe, - '--remove', - covinfo, - os.path.join(self.environment.get_source_dir(), subproject_dir, '*'), - '--output-file', covinfo, - '&&', genhtml_exe, - '--prefix', self.environment.get_build_dir(), - '--output-directory', htmloutdir, - '--title', 'Code coverage', - '--legend', - '--show-details', - covinfo] - elem.add_item('COMMAND', command) - elem.add_item('DESC', 'Generating HTML coverage report.') - elem.write(outfile) - elif gcovr_exe and gcovr_new_rootdir: - added_rule = True - htmloutdir = os.path.join(self.environment.get_log_dir(), 'coveragereport') - phony_elem = NinjaBuildElement(self.all_outputs, 'meson-coverage-html', 'phony', os.path.join(htmloutdir, 'index.html')) - phony_elem.write(outfile) - # Alias that runs the target defined above - self.create_target_alias('meson-coverage-html', outfile) - elem = NinjaBuildElement(self.all_outputs, os.path.join(htmloutdir, 'index.html'), 'CUSTOM_COMMAND', '') - command = [gcovr_exe, '--html', '--html-details', '-r', self.environment.get_build_dir(), - '-o', os.path.join(htmloutdir, 'index.html')] - elem.add_item('COMMAND', command) - elem.add_item('DESC', 'Generating HTML coverage report.') - elem.write(outfile) - if not added_rule: - mlog.warning('coverage requested but neither gcovr nor lcov/genhtml found.') + e = NinjaBuildElement(self.all_outputs, 'meson-coverage-xml', 'CUSTOM_COMMAND', 'PHONY') + self.generate_coverage_command(e, ['--xml']) + e.add_item('description', 'Generates XML coverage report.') + e.write(outfile) + # Alias that runs the target defined above + self.create_target_alias('meson-coverage-xml', outfile) + + e = NinjaBuildElement(self.all_outputs, 'meson-coverage-text', 'CUSTOM_COMMAND', 'PHONY') + self.generate_coverage_command(e, ['--text']) + e.add_item('description', 'Generates text coverage report.') + e.write(outfile) + # Alias that runs the target defined above + self.create_target_alias('meson-coverage-text', outfile) + + e = NinjaBuildElement(self.all_outputs, 'meson-coverage-html', 'CUSTOM_COMMAND', 'PHONY') + self.generate_coverage_command(e, ['--html']) + e.add_item('description', 'Generates HTML coverage report.') + e.write(outfile) + # Alias that runs the target defined above + self.create_target_alias('meson-coverage-html', outfile) def generate_install(self, outfile): install_data_file = os.path.join(self.environment.get_scratch_dir(), 'install.dat') |