aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2017-09-22 20:51:30 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2017-11-27 23:31:34 +0200
commit904fe4745d8fb285c28f33dff2afbf3754e875fd (patch)
treeb091dcc57c63fd7b19b6411ff051c5e7f7e47429
parent11f1fc913d32adfd15b4d65cb25f06183361781b (diff)
downloadmeson-904fe4745d8fb285c28f33dff2afbf3754e875fd.zip
meson-904fe4745d8fb285c28f33dff2afbf3754e875fd.tar.gz
meson-904fe4745d8fb285c28f33dff2afbf3754e875fd.tar.bz2
Added option types to dependencies and a disabler object.
-rw-r--r--mesonbuild/coredata.py5
-rw-r--r--mesonbuild/interpreter.py33
-rw-r--r--mesonbuild/optinterpreter.py6
-rw-r--r--test cases/common/161 dolphin option/encprog.c10
-rw-r--r--test cases/common/161 dolphin option/meson.build8
-rw-r--r--test cases/common/161 dolphin option/meson_options.txt2
6 files changed, 63 insertions, 1 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 401211a..b70677b 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -124,6 +124,11 @@ class UserComboOption(UserOption):
raise MesonException('Value %s not one of accepted values.' % value)
return value
+class UserDolphinOption(UserComboOption):
+ def __init__(self, name, description, value):
+ super().__init__(name, description, ['required', 'auto', 'disabled'], value)
+
+
class UserStringArrayOption(UserOption):
def __init__(self, name, description, value, **kwargs):
super().__init__(name, description, kwargs.get('choices', []))
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index fbf9a21..0f855ce 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1081,6 +1081,9 @@ ModuleState = namedtuple('ModuleState', [
'data', 'headers', 'man', 'global_args', 'project_args', 'build_machine',
'host_machine', 'target_machine'])
+class DisablerHolder(InterpreterObject):
+ pass
+
class ModuleHolder(InterpreterObject, ObjectHolder):
def __init__(self, modname, module, interpreter):
InterpreterObject.__init__(self)
@@ -2132,8 +2135,32 @@ to directly access options of other subprojects.''')
return identifier, cached_dep
@permittedKwargs(permitted_kwargs['dependency'])
+ def is_disabled(self, args, kwargs):
+ for i in args:
+ if isinstance(i, DisablerHolder):
+ return True
+ for i in kwargs.values():
+ if isinstance(i, DisablerHolder):
+ return True
+ if isinstance(i, list):
+ for j in i:
+ if isinstance(j, DisablerHolder):
+ return True
+ return False
+
def func_dependency(self, node, args, kwargs):
self.validate_arguments(args, 1, [str])
+ if 'required' in kwargs and 'option' in kwargs:
+ raise InterpreterException('Can only use "required" or "option", not both at the same time.')
+ required = kwargs.get('required', 'options' not in kwargs)
+ for oname in listify(kwargs.get('options', [])):
+ o = self.environment.coredata.user_options[oname]
+ if not isinstance(o, coredata.UserDolphinOption):
+ raise InterpreterException('Value of option must point to a Dolphin object.')
+ if o.value == 'disabled':
+ return DisablerHolder()
+ if o.value == 'required':
+ required = True
name = args[0]
if '<' in name or '>' in name or '=' in name:
raise InvalidArguments('Characters <, > and = are forbidden in dependency names. To specify'
@@ -2141,7 +2168,7 @@ to directly access options of other subprojects.''')
identifier, cached_dep = self._find_cached_dep(name, kwargs)
if cached_dep:
- if kwargs.get('required', True) and not cached_dep.found():
+ if required and not cached_dep.found():
m = 'Dependency {!r} was already checked and was not found'
raise DependencyException(m.format(name))
dep = cached_dep
@@ -2392,6 +2419,8 @@ to directly access options of other subprojects.''')
@permittedKwargs(permitted_kwargs['test'])
def func_test(self, node, args, kwargs):
+ if self.is_disabled(args, kwargs):
+ return DisablerHolder()
self.add_test(node, args, kwargs, True)
def unpack_env_kwarg(self, kwargs):
@@ -2916,6 +2945,8 @@ different subdirectory.
self.coredata.target_guids[idname] = str(uuid.uuid4()).upper()
def build_target(self, node, args, kwargs, targetholder):
+ if self.is_disabled(args, kwargs):
+ return DisablerHolder()
if not args:
raise InterpreterException('Target does not have a name.')
name = args[0]
diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py
index 01dd036..f9d206a 100644
--- a/mesonbuild/optinterpreter.py
+++ b/mesonbuild/optinterpreter.py
@@ -84,9 +84,15 @@ def ComboParser(name, description, kwargs):
raise OptionException('Combo choice elements must be strings.')
return coredata.UserComboOption(name, description, choices, kwargs.get('value', choices[0]))
+def DolphinParser(name, description, kwargs):
+ if 'choices' in kwargs:
+ raise OptionException('Dolphin option must not have choices keyword.')
+ return coredata.UserDolphinOption(name, description, kwargs.get('value', 'required'))
+
option_types = {'string': StringParser,
'boolean': BooleanParser,
'combo': ComboParser,
+ 'dolphin': DolphinParser,
}
class OptionInterpreter:
diff --git a/test cases/common/161 dolphin option/encprog.c b/test cases/common/161 dolphin option/encprog.c
new file mode 100644
index 0000000..8d9a87d
--- /dev/null
+++ b/test cases/common/161 dolphin option/encprog.c
@@ -0,0 +1,10 @@
+#include<stdlib.h>
+#include<stdint.h>
+#include<x264.h>
+
+int main(int argc, char **argv) {
+ x264_t *h;
+ h = x264_encoder_open(NULL);
+ x264_encoder_close(h);
+ return 0;
+}
diff --git a/test cases/common/161 dolphin option/meson.build b/test cases/common/161 dolphin option/meson.build
new file mode 100644
index 0000000..7f5211a
--- /dev/null
+++ b/test cases/common/161 dolphin option/meson.build
@@ -0,0 +1,8 @@
+project('dolphin option', 'c')
+
+x264_dep = dependency('x264', options : ['video', 'patented'])
+
+exe = executable('encprog', 'encprog.c',
+ dependencies : x264_dep)
+test('enc test', exe)
+
diff --git a/test cases/common/161 dolphin option/meson_options.txt b/test cases/common/161 dolphin option/meson_options.txt
new file mode 100644
index 0000000..55076b4
--- /dev/null
+++ b/test cases/common/161 dolphin option/meson_options.txt
@@ -0,0 +1,2 @@
+option('video', type : 'dolphin')
+option('patented', type : 'dolphin', value : 'disabled')