diff options
author | Philipp Ittershagen <pit@shgn.de> | 2017-04-07 20:36:30 +0200 |
---|---|---|
committer | Philipp Ittershagen <pit@shgn.de> | 2017-04-07 21:07:57 +0200 |
commit | a00ab548ebc323d52a1ff59dd9a8adec9ce0302a (patch) | |
tree | ac29d41462b075adca2ed1941b6436de3d8664f0 | |
parent | 69d07fe75a141d41a7b2a0459cdae58bbd8a892b (diff) | |
download | meson-a00ab548ebc323d52a1ff59dd9a8adec9ce0302a.zip meson-a00ab548ebc323d52a1ff59dd9a8adec9ce0302a.tar.gz meson-a00ab548ebc323d52a1ff59dd9a8adec9ce0302a.tar.bz2 |
add_project_arguments: allow call after subproject()
This commit fixes #1554 by removing the restriction of add_project_arguments()
to be called before any subproject() statement.
-rw-r--r-- | mesonbuild/interpreter.py | 17 | ||||
-rw-r--r-- | test cases/common/123 subproject project arguments/meson.build | 4 |
2 files changed, 13 insertions, 8 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 6984bdf..d1ac569 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1239,7 +1239,8 @@ class Interpreter(InterpreterBase): self.builtin.update({'meson': MesonMain(build, self)}) self.generators = [] self.visited_subdirs = {} - self.args_frozen = False + self.project_args_frozen = False + self.global_args_frozen = False # implies self.project_args_frozen self.subprojects = {} self.subproject_stack = [] self.default_project_options = default_project_options[:] # Passed from the outside, only used in subprojects. @@ -1522,7 +1523,7 @@ class Interpreter(InterpreterBase): raise InterpreterException(msg.format(os.path.join(self.subproject_dir, dirname), e)) subdir = os.path.join(self.subproject_dir, resolved) os.makedirs(os.path.join(self.build.environment.get_build_dir(), subdir), exist_ok=True) - self.args_frozen = True + self.global_args_frozen = True mlog.log('\nExecuting subproject ', mlog.bold(dirname), '.\n', sep='') subi = Interpreter(self.build, self.backend, dirname, subdir, self.subproject_dir, mesonlib.stringlistify(kwargs.get('default_options', []))) @@ -2462,15 +2463,17 @@ different subdirectory. 'arguments and add it to the appropriate *_args kwarg ' \ 'in each target.'.format(node.func_name) raise InvalidCode(msg) - self.add_arguments(node, argsdict, args, kwargs) + frozen = self.project_args_frozen or self.global_args_frozen + self.add_arguments(node, argsdict, frozen, args, kwargs) def add_project_arguments(self, node, argsdict, args, kwargs): if self.subproject not in argsdict: argsdict[self.subproject] = {} - self.add_arguments(node, argsdict[self.subproject], args, kwargs) + self.add_arguments(node, argsdict[self.subproject], + self.project_args_frozen, args, kwargs) - def add_arguments(self, node, argsdict, args, kwargs): - if self.args_frozen: + def add_arguments(self, node, argsdict, args_frozen, args, kwargs): + if args_frozen: msg = 'Tried to use \'{}\' after a build target has been declared.\n' \ 'This is not permitted. Please declare all ' \ 'arguments before your targets.'.format(node.func_name) @@ -2566,7 +2569,7 @@ different subdirectory. self.add_cross_stdlib_info(target) l = targetholder(target, self) self.add_target(name, l.held_object) - self.args_frozen = True + self.project_args_frozen = True return l def get_used_languages(self, target): diff --git a/test cases/common/123 subproject project arguments/meson.build b/test cases/common/123 subproject project arguments/meson.build index 12a9497..90d4c05 100644 --- a/test cases/common/123 subproject project arguments/meson.build +++ b/test cases/common/123 subproject project arguments/meson.build @@ -4,11 +4,13 @@ project('project options tester', 'c', 'cpp', add_global_arguments('-DGLOBAL_ARGUMENT', language: 'c') add_project_arguments('-DPROJECT_OPTION', language: 'c') -add_project_arguments('-DPROJECT_OPTION_1', language: 'c') add_project_arguments('-DPROJECT_OPTION_CPP', language: 'cpp') add_project_arguments('-DPROJECT_OPTION_C_CPP', language: ['c', 'cpp']) sub = subproject('subexe', version : '1.0.0') + +add_project_arguments('-DPROJECT_OPTION_1', language: 'c') + e = executable('exe', 'exe.c') e = executable('execpp', 'exe.cpp') test('exetest', e) |