aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-12-16 19:35:34 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2018-12-16 19:35:34 +0200
commit83c12edde9b37f46680209123cf301442706a7e7 (patch)
treeacf22ad23ecca33f842893fc161193220ef96a48
parentc208e81e1a47b54a1efb536e164b06275ddd7cd9 (diff)
downloadmeson-endmessage.zip
meson-endmessage.tar.gz
meson-endmessage.tar.bz2
Add end_message to print status messages on successfull exit.endmessage
-rw-r--r--data/syntax-highlighting/vim/syntax/meson.vim1
-rw-r--r--docs/markdown/Reference-manual.md10
-rw-r--r--docs/markdown/snippets/end_messages.md20
-rw-r--r--mesonbuild/build.py7
-rw-r--r--mesonbuild/interpreter.py12
-rw-r--r--mesonbuild/msetup.py23
-rwxr-xr-xrun_project_tests.py2
-rw-r--r--test cases/common/209 end message/meson.build6
-rw-r--r--test cases/common/209 end message/subprojects/bob/meson.build5
9 files changed, 86 insertions, 0 deletions
diff --git a/data/syntax-highlighting/vim/syntax/meson.vim b/data/syntax-highlighting/vim/syntax/meson.vim
index 85acf43..fedf6eb 100644
--- a/data/syntax-highlighting/vim/syntax/meson.vim
+++ b/data/syntax-highlighting/vim/syntax/meson.vim
@@ -80,6 +80,7 @@ syn keyword mesonBuiltin
\ declare_dependency
\ dependency
\ disabler
+ \ end_message
\ environment
\ error
\ executable
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index 5318364..714a259 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -431,6 +431,16 @@ The returned object also has methods that are documented in the
Returns a [disabler object](#disabler-object). Added in 0.44.0.
+### end_message()
+
+Added in 0.50.0. This function can be used to print status messages at
+the end of a Meson run. It is usually used to print a summary of
+essential configuration settings. The function takes either one or two
+strings, so it can be used to print both plain messages as well as
+key-value pairs. Meson will automatically format the latter kind so
+that all values are vertically aligned. Thus it recommended to use
+fairly short message strings.
+
### error()
``` meson
diff --git a/docs/markdown/snippets/end_messages.md b/docs/markdown/snippets/end_messages.md
new file mode 100644
index 0000000..0b04c67
--- /dev/null
+++ b/docs/markdown/snippets/end_messages.md
@@ -0,0 +1,20 @@
+## New end_messages method
+
+The new `end_messages` function allows you to create status messages
+that will be printed at the end of the Meson run rather than
+immediately. For example the following setup:
+
+```meson
+end_message('A short name:', 'value #1')
+end_message('A bit longer name:', 'value #2')
+```
+
+Will cause the following text to be printed as the last thing just
+before Meson exits.
+
+```
+Main project
+
+A short name: value #1
+A bit longer name: value #2
+```
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 1fcbc04..29d4e16 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -141,6 +141,7 @@ class Build:
self.test_setup_default_name = None
self.find_overrides = {}
self.searched_programs = set() # The list of all programs that have been searched for.
+ self.end_messages = {}
def copy(self):
other = Build(self.environment)
@@ -220,6 +221,12 @@ class Build:
return link_args.get(compiler.get_language(), [])
+ def add_end_message(self, subproject, message):
+ assert(isinstance(message, list))
+ if subproject not in self.end_messages:
+ self.end_messages[subproject] = []
+ self.end_messages[subproject].append(message)
+
class IncludeDirs:
def __init__(self, curdir, dirs, is_system, extra_build_dirs=None):
self.curdir = curdir
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 4f09c0f..822d844 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1982,6 +1982,7 @@ class Interpreter(InterpreterBase):
'declare_dependency': self.func_declare_dependency,
'dependency': self.func_dependency,
'disabler': self.func_disabler,
+ 'end_message': self.func_end_message,
'environment': self.func_environment,
'error': self.func_error,
'executable': self.func_executable,
@@ -2606,6 +2607,17 @@ external dependencies (including libraries) must go to "dependencies".''')
argstr = self.get_message_string_arg(node)
mlog.log(mlog.bold('Message:'), argstr)
+ @stringArgs
+ @noKwargs
+ @FeatureNew('end_message', '0.50.0')
+ def func_end_message(self, node, args, kwargs):
+ if len(args) == 0 or len(args) > 2:
+ raise InvalidArguments('End_message takes exacly one or two arguments.')
+ if '\n' in ' '.join(args):
+ raise InvalidArguments('The argument strings may not contain linefeeds.')
+ self.build.add_end_message(self.subproject, args)
+ pass
+
@FeatureNew('warning', '0.44.0')
@noKwargs
def func_warning(self, node, args, kwargs):
diff --git a/mesonbuild/msetup.py b/mesonbuild/msetup.py
index f9a5e1c..c594a39 100644
--- a/mesonbuild/msetup.py
+++ b/mesonbuild/msetup.py
@@ -139,6 +139,28 @@ class MesonApp:
(env.coredata.pkgconf_envvar, curvar))
env.coredata.pkgconf_envvar = curvar
+ def print_messagelist(self, project_name, messages):
+ max_length = max([len(x[0]) for x in messages])
+ mlog.log(mlog.bold('\n' + project_name + '\n'))
+ for m in messages:
+ if len(m) == 1:
+ mlog.log(m[0])
+ else:
+ padding = ' '*(max_length - len(m[0]) + 2)
+ mlog.log(m[0] + padding, mlog.bold(m[1]))
+
+ def print_end_messages(self, end_messages):
+ if len(end_messages) == 0:
+ return
+ mlog.log(mlog.bold('\nProject status messages'))
+ all_projects = end_messages.keys()
+ for p in sorted(all_projects):
+ if p == '':
+ continue
+ self.print_messagelist(p, end_messages[p])
+ if '' in end_messages:
+ self.print_messagelist('Main project', end_messages[''])
+
def generate(self):
env = environment.Environment(self.source_dir, self.build_dir, self.options)
mlog.initialize(env.get_log_dir(), self.options.fatal_warnings)
@@ -202,6 +224,7 @@ class MesonApp:
coredata.write_cmd_line_file(self.build_dir, self.options)
else:
coredata.update_cmd_line_file(self.build_dir, self.options)
+ self.print_end_messages(b.end_messages)
except:
if 'cdf' in locals():
old_cdf = cdf + '.prev'
diff --git a/run_project_tests.py b/run_project_tests.py
index 0d64f47..0245148 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -697,6 +697,8 @@ def check_format():
if '.dub' in root: # external deps are here
continue
for fname in files:
+ if fname.startswith('.#') or fname.startswith('#'): # Emacs temp files.
+ continue
if os.path.splitext(fname)[1].lower() in check_suffixes:
bn = os.path.basename(fname)
if bn == 'sitemap.txt' or bn == 'meson-test-run.txt':
diff --git a/test cases/common/209 end message/meson.build b/test cases/common/209 end message/meson.build
new file mode 100644
index 0000000..c185d42
--- /dev/null
+++ b/test cases/common/209 end message/meson.build
@@ -0,0 +1,6 @@
+project('end message', 'c')
+
+end_message('Aligned end message of main project:', '#1')
+subproject('bob') # Intentionally between calls to end_message. Just in case.
+end_message('End message of main project.')
+end_message('Aligned end message of main project:', '#2')
diff --git a/test cases/common/209 end message/subprojects/bob/meson.build b/test cases/common/209 end message/subprojects/bob/meson.build
new file mode 100644
index 0000000..26269b9
--- /dev/null
+++ b/test cases/common/209 end message/subprojects/bob/meson.build
@@ -0,0 +1,5 @@
+project('bob', 'c')
+
+end_message('Aligned end message of Bob:', '#1')
+end_message('End message of Bob.')
+end_message('Aligned end message of Bob:', '#2')