aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2020-02-25 10:29:47 -0500
committerXavier Claessens <xavier.claessens@collabora.com>2020-02-26 14:24:12 -0500
commit8101b0ddab1dea8de3b2588a4b75da525865c404 (patch)
tree0464532a0a29a382f92ad6490c6b4d7a3b4a4483 /mesonbuild/interpreter.py
parentc175e97a8862be5c87196aa94cb911975c84cf84 (diff)
downloadmeson-8101b0ddab1dea8de3b2588a4b75da525865c404.zip
meson-8101b0ddab1dea8de3b2588a4b75da525865c404.tar.gz
meson-8101b0ddab1dea8de3b2588a4b75da525865c404.tar.bz2
summary: Add more info in Subprojects section
This adds a warnings counter for subprojects that passed. This is to encourage developpers to check warnings in the logs and hopefully fix them. Otherwise they could be hidden in hundreds lines of logs. This also print the error message for subprojects that did not pass. The error message is often enough to fix the issue (e.g. missing dependency) and it's easier than searching in the logs why a subproject failed.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py40
1 files changed, 28 insertions, 12 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index c9e559c..53225c4 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -963,10 +963,14 @@ class Test(InterpreterObject):
class SubprojectHolder(InterpreterObject, ObjectHolder):
- def __init__(self, subinterpreter, subproject_dir, name):
+ def __init__(self, subinterpreter, subproject_dir, name, warnings=0, disabled_feature=None,
+ exception=None):
InterpreterObject.__init__(self)
ObjectHolder.__init__(self, subinterpreter)
self.name = name
+ self.warnings = warnings
+ self.disabled_feature = disabled_feature
+ self.exception = exception
self.subproject_dir = subproject_dir
self.methods.update({'get_variable': self.get_variable_method,
'found': self.found_method,
@@ -2602,10 +2606,9 @@ external dependencies (including libraries) must go to "dependencies".''')
dirname = args[0]
return self.do_subproject(dirname, 'meson', kwargs)
- def disabled_subproject(self, dirname, feature=None):
- sub = SubprojectHolder(None, self.subproject_dir, dirname)
- if feature:
- sub.disabled_feature = feature
+ def disabled_subproject(self, dirname, disabled_feature=None, exception=None):
+ sub = SubprojectHolder(None, self.subproject_dir, dirname,
+ disabled_feature=disabled_feature, exception=exception)
self.subprojects[dirname] = sub
return sub
@@ -2613,7 +2616,7 @@ external dependencies (including libraries) must go to "dependencies".''')
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
if disabled:
mlog.log('Subproject', mlog.bold(dirname), ':', 'skipped: feature', mlog.bold(feature), 'disabled')
- return self.disabled_subproject(dirname, feature)
+ return self.disabled_subproject(dirname, disabled_feature=feature)
default_options = mesonlib.stringlistify(kwargs.get('default_options', []))
default_options = coredata.create_options_dict(default_options)
@@ -2654,7 +2657,7 @@ external dependencies (including libraries) must go to "dependencies".''')
if not required:
mlog.log(e)
mlog.log('Subproject ', mlog.bold(subprojdir), 'is buildable:', mlog.red('NO'), '(disabling)')
- return self.disabled_subproject(dirname)
+ return self.disabled_subproject(dirname, exception=e)
raise e
subdir = os.path.join(self.subproject_dir, resolved)
@@ -2682,7 +2685,7 @@ external dependencies (including libraries) must go to "dependencies".''')
# fatal and VS CI treat any logs with "ERROR:" as fatal.
mlog.exception(e, prefix=mlog.yellow('Exception:'))
mlog.log('\nSubproject', mlog.bold(dirname), 'is buildable:', mlog.red('NO'), '(disabling)')
- return self.disabled_subproject(dirname)
+ return self.disabled_subproject(dirname, exception=e)
raise e
def _do_subproject_meson(self, dirname, subdir, default_options, kwargs, ast=None, build_def_files=None):
@@ -2694,7 +2697,12 @@ external dependencies (including libraries) must go to "dependencies".''')
subi.subproject_stack = self.subproject_stack + [dirname]
current_active = self.active_projectname
+ current_warnings_counter = mlog.log_warnings_counter
+ mlog.log_warnings_counter = 0
subi.run()
+ subi_warnings = mlog.log_warnings_counter
+ mlog.log_warnings_counter = current_warnings_counter
+
mlog.log('Subproject', mlog.bold(dirname), 'finished.')
mlog.log()
@@ -2706,7 +2714,8 @@ external dependencies (including libraries) must go to "dependencies".''')
raise InterpreterException('Subproject %s version is %s but %s required.' % (dirname, pv, wanted))
self.active_projectname = current_active
self.subprojects.update(subi.subprojects)
- self.subprojects[dirname] = SubprojectHolder(subi, self.subproject_dir, dirname)
+ self.subprojects[dirname] = SubprojectHolder(subi, self.subproject_dir, dirname,
+ warnings=subi_warnings)
# Duplicates are possible when subproject uses files from project root
if build_def_files:
self.build_def_files = list(set(self.build_def_files + build_def_files))
@@ -2982,11 +2991,18 @@ external dependencies (including libraries) must go to "dependencies".''')
all_subprojects = collections.OrderedDict()
for name, subp in sorted(self.subprojects.items()):
value = subp.found()
- if not value and hasattr(subp, 'disabled_feature'):
- value = 'Feature {!r} disabled'.format(subp.disabled_feature)
+ if subp.disabled_feature:
+ value = [value, 'Feature {!r} disabled'.format(subp.disabled_feature)]
+ elif subp.exception:
+ value = [value, str(subp.exception)]
+ elif subp.warnings > 0:
+ value = [value, '{} warnings'.format(subp.warnings)]
all_subprojects[name] = value
if all_subprojects:
- self.summary_impl('Subprojects', all_subprojects, {'bool_yn': True})
+ self.summary_impl('Subprojects', all_subprojects,
+ {'bool_yn': True,
+ 'list_sep': ' ',
+ })
# Print all summaries, main project last.
mlog.log('') # newline
main_summary = self.summary.pop('', None)