diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-02-21 00:36:28 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-02-21 00:36:28 +0200 |
commit | f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc (patch) | |
tree | 8e475f65023b2cdf36ed693abf886fccbc750100 | |
parent | 9418ece26a83c3c9925ace74eef20b3c19058bbb (diff) | |
download | meson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.zip meson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.tar.gz meson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.tar.bz2 |
Added support for coverage.
-rwxr-xr-x | environment.py | 36 | ||||
-rwxr-xr-x | generators.py | 33 | ||||
-rwxr-xr-x | meson.py | 2 |
3 files changed, 67 insertions, 4 deletions
diff --git a/environment.py b/environment.py index 1dda393..86ef9bc 100755 --- a/environment.py +++ b/environment.py @@ -52,10 +52,16 @@ class CCompiler(): def get_debug_flags(self): return ['-g'] - + + def get_coverage_flags(self): + return ['--coverage'] + + def get_coverage_link_flags(self): + return ['-lgcov'] + def get_std_exe_link_flags(self): return [] - + def get_include_arg(self, path): return '-I' + path @@ -167,7 +173,7 @@ class GnuCXXCompiler(CXXCompiler): class ClangCXXCompiler(CXXCompiler): std_warn_flags = ['-Wall', '-Winvalid-pch'] std_opt_flags = ['-O2'] - + def __init__(self, exelist): CXXCompiler.__init__(self, exelist) @@ -191,10 +197,32 @@ class ArLinker(): def get_std_link_flags(self): return self.std_flags - + def get_output_flags(self): return [] + def get_coverage_link_flags(self): + return [] + +def find_coverage_tools(): + gcovr_exe = 'gcovr' + lcov_exe = 'lcov' + genhtml_exe = 'genhtml' + + pg = subprocess.Popen([gcovr_exe, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + pg.communicate() + if pg.returncode != 0: + gcovr_exe = None + pl = subprocess.Popen([lcov_exe, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + pl.communicate() + if pl.returncode != 0: + lcov_exe = None + ph = subprocess.Popen([genhtml_exe, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + ph.communicate() + if ph.returncode != 0: + genhtml_exe = None + return (gcovr_exe, lcov_exe, genhtml_exe) + header_suffixes = ['h', 'hh', 'hpp', 'hxx', 'H'] class Environment(): diff --git a/generators.py b/generators.py index bf44bd7..788fc84 100755 --- a/generators.py +++ b/generators.py @@ -16,6 +16,7 @@ import os, stat, re, pickle import interpreter, nodes +import environment from builder_install import InstallData def shell_quote(cmdlist): @@ -126,6 +127,8 @@ class Generator(): commands += compiler.get_debug_flags() if self.environment.options.buildtype == 'optimized': commands += compiler.get_std_opt_flags() + if self.environment.options.coverage: + commands += compiler.get_coverage_flags() commands += compiler.get_std_warn_flags() if isinstance(target, interpreter.SharedLibrary): commands += compiler.get_pic_flags() @@ -174,9 +177,37 @@ class NinjaGenerator(Generator): self.generate_tests(outfile) outfile.write('# Install rules\n\n') self.generate_install(outfile) + if self.environment.options.coverage: + outfile.write('# Coverage rules\n\n') + self.generate_coverage_rules(outfile) outfile.write('# Suffix\n\n') self.generate_ending(outfile) + def generate_coverage_rules(self, outfile): + (gcovr_exe, lcov_exe, genhtml_exe) = environment.find_coverage_tools() + if gcovr_exe: + xmlbuild = 'build coverage-xml: CUSTOM_COMMAND\n\n' + xmlcommand = " COMMAND = '%s' -x -r '%s' -o coverage.xml\n\n" %\ + (ninja_quote(gcovr_exe), ninja_quote(self.environment.get_build_dir())) + outfile.write(xmlbuild) + outfile.write(xmlcommand) + textbuild = 'build coverage-text: CUSTOM_COMMAND\n' + textcommand = " COMMAND = '%s' -r '%s' -o coverage.txt\n\n" %\ + (ninja_quote(gcovr_exe), ninja_quote(self.environment.get_build_dir())) + outfile.write(textbuild) + outfile.write(textcommand) + if lcov_exe and genhtml_exe: + phony = 'build coverage-html: phony coveragereport/index.html\n' + htmlbuild = 'build coveragereport/index.html: CUSTOM_COMMAND\n' + lcov_command = "'%s' --directory '%s' --capture --output-file coverage.info --no-checksum" %\ + (ninja_quote(lcov_exe), ninja_quote(self.environment.get_build_dir())) + genhtml_command = "'%s' --prefix='%s' --output-directory coveragereport --title='Code coverage' --legend --show-details coverage.info" %\ + (ninja_quote(genhtml_exe), ninja_quote(self.environment.get_build_dir())) + command = ' COMMAND = %s && %s\n\n' % (lcov_command, genhtml_command) + outfile.write(phony) + outfile.write(htmlbuild) + outfile.write(command) + def generate_install(self, outfile): script_root = self.get_script_root() install_script = os.path.join(script_root, 'builder_install.py') @@ -394,6 +425,8 @@ class NinjaGenerator(Generator): commands += dep.get_link_flags() dependencies = target.get_dependencies() commands += self.build_target_link_arguments(dependencies) + if self.environment.options.coverage: + commands += linker.get_coverage_link_flags() if len(dependencies) == 0: dep_targets = '' else: @@ -48,6 +48,8 @@ parser.add_option('--buildtype', default='debug', type='choice', choices=build_t help=buildtype_help) parser.add_option('--strip', action='store_true', dest='strip', default=False,\ help='strip targets on install (default: %default)') +parser.add_option('--enable-gcov', action='store_true', dest='coverage', default=False,\ + help='measure test coverage') class BuilderApp(): |