aboutsummaryrefslogtreecommitdiff
path: root/optinterpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'optinterpreter.py')
-rw-r--r--optinterpreter.py103
1 files changed, 41 insertions, 62 deletions
diff --git a/optinterpreter.py b/optinterpreter.py
index 6906d31..d66aa1f 100644
--- a/optinterpreter.py
+++ b/optinterpreter.py
@@ -1,4 +1,4 @@
-# Copyright 2013-2014 The Meson development team
+# Copyright 2013-2015 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -13,74 +13,53 @@
# limitations under the License.
import mparser
-import coredata
+import coredata, mesonlib
import os, re
forbidden_option_names = coredata.builtin_options
+forbidden_prefixes = {'c_': True,
+ 'cpp_': True,
+ 'rust_': True,
+ 'fortran_': True,
+ 'objc_': True,
+ 'objcpp_': True,
+ 'vala_': True,
+ 'csharp_': True
+ }
+
+def is_invalid_name(name):
+ if name in forbidden_option_names:
+ return True
+ if name in forbidden_prefixes:
+ return True
+ return False
class OptionException(coredata.MesonException):
pass
optname_regex = re.compile('[^a-zA-Z0-9_-]')
-class UserOption:
- def __init__(self, name, kwargs):
- super().__init__()
- self.description = kwargs.get('description', '')
- self.name = name
-
- def parse_string(self, valuestring):
- return valuestring
-
-class UserStringOption(UserOption):
- def __init__(self, name, kwargs):
- super().__init__(name, kwargs)
- self.set_value(kwargs.get('value', ''))
-
- def set_value(self, newvalue):
- if not isinstance(newvalue, str):
- raise OptionException('Value "%s" for string option "%s" is not a string.' % (str(newvalue), self.name))
- self.value = newvalue
-
-class UserBooleanOption(UserOption):
- def __init__(self, name, kwargs):
- super().__init__(name, kwargs)
- self.set_value(kwargs.get('value', 'true'))
-
- def set_value(self, newvalue):
- if not isinstance(newvalue, bool):
- raise OptionException('Value "%s" for boolean option "%s" is not a boolean.' % (str(newvalue), self.name))
- self.value = newvalue
-
- def parse_string(self, valuestring):
- if valuestring == 'false':
- return False
- if valuestring == 'true':
- return True
- raise OptionException('Value "%s" for boolean option "%s" is not a boolean.' % (valuestring, self.name))
-
-class UserComboOption(UserOption):
- def __init__(self, name, kwargs):
- super().__init__(name, kwargs)
- if 'choices' not in kwargs:
- raise OptionException('Combo option missing "choices" keyword.')
- self.choices = kwargs['choices']
- if not isinstance(self.choices, list):
- raise OptionException('Combo choices must be an array.')
- for i in self.choices:
- if not isinstance(i, str):
- raise OptionException('Combo choice elements must be strings.')
- self.value = kwargs.get('value', self.choices[0])
-
- def set_value(self, newvalue):
- if newvalue not in self.choices:
- optionsstring = ', '.join(['"%s"' % (item,) for item in self.choices])
- raise OptionException('Value "%s" for combo option "%s" is not one of the choices. Possible choices are: %s.' % (newvalue, self.name, optionsstring))
- self.value = newvalue
-
-option_types = {'string' : UserStringOption,
- 'boolean' : UserBooleanOption,
- 'combo' : UserComboOption,
+def StringParser(name, description, kwargs):
+ return mesonlib.UserStringOption(name, description,
+ kwargs.get('value', ''))
+
+def BooleanParser(name, description, kwargs):
+ return mesonlib.UserBooleanOption(name, description, kwargs.get('value', True))
+
+def ComboParser(name, description, kwargs):
+ if 'choices' not in kwargs:
+ raise OptionException('Combo option missing "choices" keyword.')
+ choices = kwargs['choices']
+ if not isinstance(choices, list):
+ raise OptionException('Combo choices must be an array.')
+ for i in choices:
+ if not isinstance(i, str):
+ raise OptionException('Combo choice elements must be strings.')
+ return mesonlib.UserComboOption(name, description, choices, kwargs.get('value', choices[0]))
+
+option_types = {'string' : StringParser,
+ 'boolean' : BooleanParser,
+ 'combo' : ComboParser,
}
class OptionInterpreter:
@@ -157,11 +136,11 @@ class OptionInterpreter:
raise OptionException('Positional argument must be a string.')
if optname_regex.search(opt_name) is not None:
raise OptionException('Option names can only contain letters, numbers or dashes.')
- if opt_name in forbidden_option_names:
+ if is_invalid_name(opt_name):
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)
+ opt = option_types[opt_type](opt_name, kwargs.get('description', ''), kwargs)
if opt.description == '':
opt.description = opt_name
if opt_name in self.cmd_line_options: