From 3aebdb717a489bd7f8f441ffdfb65dcb71ab3853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 25 Sep 2016 16:56:49 +0100 Subject: [PATCH] configuration_data: can pass descriptions to setters (#783) Add support for passing a description to configuration data setter methods via a 'description' kwarg. The description string will be used when meson generates the entire configure file without a template, autoconf-style. --- mesonbuild/build.py | 2 +- mesonbuild/interpreter.py | 24 +++++++++++-------- mesonbuild/mesonlib.py | 8 ++++--- .../common/16 configure file/meson.build | 4 ++-- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 7605b464d..dce023642 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1271,7 +1271,7 @@ class ConfigurationData(): return repr(self.values) def get(self, name): - return self.values[name] + return self.values[name] # (val, desc) def keys(self): return self.values.keys() diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index aa032e58d..b5da91f4f 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -228,40 +228,44 @@ class ConfigurationDataHolder(InterpreterObject): def mark_used(self): self.used = True - def validate_args(self, args): + def validate_args(self, args, kwargs): if len(args) != 2: raise InterpreterException("Configuration set requires 2 arguments.") if self.used: raise InterpreterException("Can not set values on configuration object that has been used.") name = args[0] val = args[1] + desc = kwargs.get('description', None) if not isinstance(name, str): raise InterpreterException("First argument to set must be a string.") - return (name, val) + if desc is not None and not isinstance(desc, str): + raise InterpreterException('Description must be a string.') + + return (name, val, desc) def set_method(self, args, kwargs): - (name, val) = self.validate_args(args) - self.held_object.values[name] = val + (name, val, desc) = self.validate_args(args, kwargs) + self.held_object.values[name] = (val, desc) def set_quoted_method(self, args, kwargs): - (name, val) = self.validate_args(args) + (name, val, desc) = self.validate_args(args, kwargs) if not isinstance(val, str): raise InterpreterException("Second argument to set_quoted must be a string.") escaped_val = '\\"'.join(val.split('"')) - self.held_object.values[name] = '"' + escaped_val + '"' + self.held_object.values[name] = ('"' + escaped_val + '"', desc) def set10_method(self, args, kwargs): - (name, val) = self.validate_args(args) + (name, val, desc) = self.validate_args(args, kwargs) if val: - self.held_object.values[name] = 1 + self.held_object.values[name] = (1, desc) else: - self.held_object.values[name] = 0 + self.held_object.values[name] = (0, desc) def has_method(self, args, kwargs): return args[0] in self.held_object.values def get(self, name): - return self.held_object.values[name] + return self.held_object.values[name] # (val, desc) def keys(self): return self.held_object.values.keys() diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index d06e4eb9a..7294a5490 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -221,7 +221,7 @@ def do_replacement(regex, line, confdata): while match: varname = match.group(1) if varname in confdata.keys(): - var = confdata.get(varname) + (var, desc) = confdata.get(varname) if isinstance(var, str): pass elif isinstance(var, int): @@ -240,7 +240,7 @@ def do_mesondefine(line, confdata): raise MesonException('#mesondefine does not contain exactly two tokens: %s', line.strip()) varname = arr[1] try: - v = confdata.get(varname) + (v, desc) = confdata.get(varname) except KeyError: return '/* #undef %s */\n' % varname if isinstance(v, bool): @@ -289,7 +289,9 @@ def dump_conf_header(ofilename, cdata): ''') for k in sorted(cdata.keys()): - v = cdata.get(k) + (v, desc) = cdata.get(k) + if desc: + ofile.write('/* %s */\n' % desc) if isinstance(v, bool): if v: ofile.write('#define %s\n\n' % k) diff --git a/test cases/common/16 configure file/meson.build b/test cases/common/16 configure file/meson.build index c00af4073..ae3ad27e2 100644 --- a/test cases/common/16 configure file/meson.build +++ b/test cases/common/16 configure file/meson.build @@ -34,7 +34,7 @@ test('inctest2', executable('prog2', 'prog2.c')) # Generate a conf file without an input file. dump = configuration_data() -dump.set_quoted('SHOULD_BE_STRING', 'string') +dump.set_quoted('SHOULD_BE_STRING', 'string', description : 'A string') dump.set_quoted('SHOULD_BE_STRING2', 'A "B" C') dump.set_quoted('SHOULD_BE_STRING3', 'A "" C') dump.set_quoted('SHOULD_BE_STRING4', 'A " C') @@ -42,7 +42,7 @@ dump.set('SHOULD_BE_RETURN', 'return') dump.set('SHOULD_BE_DEFINED', true) dump.set('SHOULD_BE_UNDEFINED', false) dump.set('SHOULD_BE_ONE', 1) -dump.set('SHOULD_BE_ZERO', 0) +dump.set('SHOULD_BE_ZERO', 0, description : 'Absolutely zero') dump.set('SHOULD_BE_QUOTED_ONE', '"1"') configure_file(output : 'config3.h', configuration : dump)