diff options
-rw-r--r-- | mesonbuild/optinterpreter.py | 27 | ||||
-rw-r--r-- | test cases/common/140 get define/meson_options.txt | 2 | ||||
-rw-r--r-- | test cases/failing/62 bad option argument/meson.build | 3 | ||||
-rw-r--r-- | test cases/failing/62 bad option argument/meson_options.txt | 1 |
4 files changed, 29 insertions, 4 deletions
diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index ac27269..4b8e147 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -12,10 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os, re +import functools + from . import mparser from . import coredata from . import mesonlib -import os, re + forbidden_option_names = coredata.get_builtin_options() forbidden_prefixes = {'c_', @@ -43,15 +46,33 @@ def is_invalid_name(name): class OptionException(mesonlib.MesonException): pass + +def permitted_kwargs(permitted): + """Function that validates kwargs for options.""" + def _wraps(func): + @functools.wraps(func) + def _inner(name, description, kwargs): + bad = [a for a in kwargs.keys() if a not in permitted] + if bad: + raise OptionException('Invalid kwargs for option "{}": "{}"'.format( + name, ' '.join(bad))) + return func(name, description, kwargs) + return _inner + return _wraps + + optname_regex = re.compile('[^a-zA-Z0-9_-]') +@permitted_kwargs({'value'}) def StringParser(name, description, kwargs): return coredata.UserStringOption(name, description, kwargs.get('value', ''), kwargs.get('choices', [])) +@permitted_kwargs({'value'}) def BooleanParser(name, description, kwargs): return coredata.UserBooleanOption(name, description, kwargs.get('value', True)) +@permitted_kwargs({'value', 'choices'}) def ComboParser(name, description, kwargs): if 'choices' not in kwargs: raise OptionException('Combo option missing "choices" keyword.') @@ -141,7 +162,7 @@ class OptionInterpreter: (posargs, kwargs) = self.reduce_arguments(node.args) if 'type' not in kwargs: raise OptionException('Option call missing mandatory "type" keyword argument') - opt_type = kwargs['type'] + opt_type = kwargs.pop('type') if opt_type not in option_types: raise OptionException('Unknown type %s.' % opt_type) if len(posargs) != 1: @@ -155,7 +176,7 @@ class OptionInterpreter: raise OptionException('Option name %s is reserved.' % opt_name) if self.subproject != '': opt_name = self.subproject + ':' + opt_name - opt = option_types[opt_type](opt_name, kwargs.get('description', ''), kwargs) + opt = option_types[opt_type](opt_name, kwargs.pop('description', ''), kwargs) if opt.description == '': opt.description = opt_name if opt_name in self.cmd_line_options: diff --git a/test cases/common/140 get define/meson_options.txt b/test cases/common/140 get define/meson_options.txt index a88cecd..7d34a2e 100644 --- a/test cases/common/140 get define/meson_options.txt +++ b/test cases/common/140 get define/meson_options.txt @@ -1 +1 @@ -option('MESON_TEST_DEFINE_VALUE', type : 'string', default : '') +option('MESON_TEST_DEFINE_VALUE', type : 'string', value : '') diff --git a/test cases/failing/62 bad option argument/meson.build b/test cases/failing/62 bad option argument/meson.build new file mode 100644 index 0000000..5219cfb --- /dev/null +++ b/test cases/failing/62 bad option argument/meson.build @@ -0,0 +1,3 @@ +project('bad option') + +get_option('name') diff --git a/test cases/failing/62 bad option argument/meson_options.txt b/test cases/failing/62 bad option argument/meson_options.txt new file mode 100644 index 0000000..de1fff6 --- /dev/null +++ b/test cases/failing/62 bad option argument/meson_options.txt @@ -0,0 +1 @@ +option('name', type : 'string', vaule : 'foo') |