aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/optinterpreter.py27
-rw-r--r--test cases/common/140 get define/meson_options.txt2
-rw-r--r--test cases/failing/62 bad option argument/meson.build3
-rw-r--r--test cases/failing/62 bad option argument/meson_options.txt1
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')