aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-02-21 00:36:28 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-02-21 00:36:28 +0200
commitf7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc (patch)
tree8e475f65023b2cdf36ed693abf886fccbc750100
parent9418ece26a83c3c9925ace74eef20b3c19058bbb (diff)
downloadmeson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.zip
meson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.tar.gz
meson-f7d7888b700bb7e684ec8a0cd3e4ef0aca8599fc.tar.bz2
Added support for coverage.
-rwxr-xr-xenvironment.py36
-rwxr-xr-xgenerators.py33
-rwxr-xr-xmeson.py2
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:
diff --git a/meson.py b/meson.py
index d7e6e44..f1f9dd3 100755
--- a/meson.py
+++ b/meson.py
@@ -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():