aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmesonconf.py12
-rwxr-xr-xmesongui.py10
-rw-r--r--mesonlib.py52
-rw-r--r--optinterpreter.py85
4 files changed, 87 insertions, 72 deletions
diff --git a/mesonconf.py b/mesonconf.py
index db526b0..6922ea6 100755
--- a/mesonconf.py
+++ b/mesonconf.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# Copyright 2014 The Meson development team
+# Copyright 2014-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.
@@ -17,7 +17,7 @@
import sys, os
import pickle
import argparse
-import coredata, optinterpreter
+import coredata, mesonlib
from meson import build_types, layouts, warning_levels
parser = argparse.ArgumentParser()
@@ -127,15 +127,15 @@ class Conf:
self.coredata.localedir = v
elif k in self.coredata.user_options:
tgt = self.coredata.user_options[k]
- if isinstance(tgt, optinterpreter.UserBooleanOption):
+ if isinstance(tgt, mesonlib.UserBooleanOption):
tgt.set_value(self.tobool(v))
- elif isinstance(tgt, optinterpreter.UserComboOption):
+ elif isinstance(tgt, mesonlib.UserComboOption):
try:
tgt.set_value(v)
- except optinterpreter.OptionException:
+ except coredata.MesonException:
raise ConfException('Value of %s must be one of %s.' %
(k, tgt.choices))
- elif isinstance(tgt, optinterpreter.UserStringOption):
+ elif isinstance(tgt, mesonlib.UserStringOption):
tgt.set_value(v)
else:
raise ConfException('Internal error, unknown option type.')
diff --git a/mesongui.py b/mesongui.py
index 10a84f7..bdd44bb 100755
--- a/mesongui.py
+++ b/mesongui.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# Copyright 2013 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.
@@ -15,7 +15,7 @@
# limitations under the License.
import sys, os, pickle, time, shutil
-import build, coredata, environment, optinterpreter
+import build, coredata, environment, mesonlib
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QHeaderView
from PyQt5.QtWidgets import QComboBox, QCheckBox
@@ -272,14 +272,14 @@ class OptionForm:
self.opt_widgets = []
for key in keys:
opt = options[key]
- if isinstance(opt, optinterpreter.UserStringOption):
+ if isinstance(opt, mesonlib.UserStringOption):
w = PyQt5.QtWidgets.QLineEdit(opt.value)
w.textChanged.connect(self.user_option_changed)
- elif isinstance(opt, optinterpreter.UserBooleanOption):
+ elif isinstance(opt, mesonlib.UserBooleanOption):
w = QCheckBox('')
w.setChecked(opt.value)
w.stateChanged.connect(self.user_option_changed)
- elif isinstance(opt, optinterpreter.UserComboOption):
+ elif isinstance(opt, mesonlib.UserComboOption):
w = QComboBox()
for i in opt.choices:
w.addItem(i)
diff --git a/mesonlib.py b/mesonlib.py
index d7c40f4..0b200ac 100644
--- a/mesonlib.py
+++ b/mesonlib.py
@@ -255,3 +255,55 @@ def replace_if_different(dst, dst_tmp):
pass
os.replace(dst_tmp, dst)
+class UserOption:
+ def __init__(self, name, description):
+ super().__init__()
+ self.name = name
+ self.description = description
+
+ def parse_string(self, valuestring):
+ return valuestring
+
+class UserStringOption(UserOption):
+ def __init__(self, name, description, value):
+ super().__init__(name, description)
+ self.set_value(value)
+
+ def set_value(self, newvalue):
+ if not isinstance(newvalue, str):
+ raise MesonException('Value "%s" for string option "%s" is not a string.' % (str(newvalue), self.name))
+ self.value = newvalue
+
+class UserBooleanOption(UserOption):
+ def __init__(self, name, description, value):
+ super().__init__(name, description)
+ self.set_value(value)
+
+ def set_value(self, newvalue):
+ if not isinstance(newvalue, bool):
+ raise MesonException('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 MesonException('Value "%s" for boolean option "%s" is not a boolean.' % (valuestring, self.name))
+
+class UserComboOption(UserOption):
+ def __init__(self, name, description, choices, value):
+ super().__init__(name, description)
+ self.choices = choices
+ if not isinstance(self.choices, list):
+ raise MesonException('Combo choices must be an array.')
+ for i in self.choices:
+ if not isinstance(i, str):
+ raise MesonException('Combo choice elements must be strings.')
+ self.set_value(value)
+
+ def set_value(self, newvalue):
+ if newvalue not in self.choices:
+ optionsstring = ', '.join(['"%s"' % (item,) for item in self.choices])
+ raise MesonException('Value "%s" for combo option "%s" is not one of the choices. Possible choices are: %s.' % (newvalue, self.name, optionsstring))
+ self.value = newvalue
diff --git a/optinterpreter.py b/optinterpreter.py
index 6906d31..e61707a 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,7 +13,7 @@
# limitations under the License.
import mparser
-import coredata
+import coredata, mesonlib
import os, re
forbidden_option_names = coredata.builtin_options
@@ -23,64 +23,27 @@ class OptionException(coredata.MesonException):
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:
@@ -161,7 +124,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)
+ 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: