diff options
author | Thibault Saunier <thibault.saunier@osg.samsung.com> | 2016-11-11 13:27:56 -0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2016-11-12 17:34:06 -0500 |
commit | 85a0cd7635c45bb150b59f55dbd6ecbbe10048f8 (patch) | |
tree | a8b50106266044237437a42648bac9c1f5b9ce7c /mesonbuild | |
parent | 085650a1e3769366ac47f7d8a59386ed6d5a1ef5 (diff) | |
download | meson-85a0cd7635c45bb150b59f55dbd6ecbbe10048f8.zip meson-85a0cd7635c45bb150b59f55dbd6ecbbe10048f8.tar.gz meson-85a0cd7635c45bb150b59f55dbd6ecbbe10048f8.tar.bz2 |
Add new add_project_[link]_args functions
Fixes 979
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/backend/backends.py | 1 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 2 | ||||
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 3 | ||||
-rw-r--r-- | mesonbuild/build.py | 15 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 48 | ||||
-rw-r--r-- | mesonbuild/modules/gnome.py | 2 |
6 files changed, 65 insertions, 6 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 45d946f..b82227f 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -354,6 +354,7 @@ class Backend(): commands += compiler.get_warn_args(self.environment.coredata.get_builtin_option('warning_level')) commands += compiler.get_option_compile_args(self.environment.coredata.compiler_options) commands += self.build.get_global_args(compiler) + commands += self.build.get_project_args(compiler, target.subproject) commands += self.environment.coredata.external_args[compiler.get_language()] commands += self.escape_extra_args(compiler, target.get_extra_args(compiler.get_language())) commands += compiler.get_buildtype_args(self.environment.coredata.get_builtin_option('buildtype')) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index bb681d7..fb1280b 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1018,6 +1018,7 @@ int dummy; args = [] args += self.build.get_global_args(valac) + args += self.build.get_project_args(valac, target.subproject) args += valac.get_buildtype_args(self.environment.coredata.get_builtin_option('buildtype')) # Tell Valac to output everything in our private directory. Sadly this # means it will also preserve the directory components of Vala sources @@ -1945,6 +1946,7 @@ rule FORTRAN_DEP_HACK abspath = os.path.join(self.environment.get_build_dir(), target.subdir) commands = [] if not isinstance(target, build.StaticLibrary): + commands += self.build.get_project_link_args(linker, target.subproject) commands += self.build.get_global_link_args(linker) commands += self.get_cross_stdlib_link_args(target, linker) commands += linker.get_linker_always_args() diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index c66233e..15bebba 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -680,6 +680,9 @@ class Vs2010Backend(backends.Backend): for l, args in self.build.global_args.items(): if l in file_args: file_args[l] += args + for l, args in self.build.projects_args.get(target.subproject, {}).items(): + if l in file_args: + file_args[l] += args for l, args in target.extra_args.items(): if l in file_args: file_args[l] += compiler.unix_compile_flags_to_native(args) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index d87d9a0..d1746f1 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -89,7 +89,9 @@ class Build: self.compilers = [] self.cross_compilers = [] self.global_args = {} + self.projects_args = {} self.global_link_args = {} + self.projects_link_args = {} self.tests = [] self.benchmarks = [] self.headers = [] @@ -153,9 +155,22 @@ class Build: def get_global_args(self, compiler): return self.global_args.get(compiler.get_language(), []) + def get_project_args(self, compiler, project): + args = self.projects_args.get(project) + if not args: + return [] + return args.get(compiler.get_language(), []) + def get_global_link_args(self, compiler): return self.global_link_args.get(compiler.get_language(), []) + def get_project_link_args(self, compiler, project): + link_args = self.projects_link_args.get(project) + if not link_args: + return [] + + return link_args.get(compiler.get_language(), []) + class IncludeDirs(): def __init__(self, curdir, dirs, is_system, extra_build_dirs=None): self.curdir = curdir diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index f8af82e..9780626 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1007,6 +1007,7 @@ class ModuleHolder(InterpreterObject): state.headers = self.interpreter.build.get_headers() state.man = self.interpreter.build.get_man() state.global_args = self.interpreter.build.global_args + state.project_args = self.interpreter.build.projects_args.get(self.interpreter.subproject, {}) value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) @@ -1182,7 +1183,7 @@ class Interpreter(): self.builtin = {'meson': MesonMain(build, self)} self.generators = [] self.visited_subdirs = {} - self.global_args_frozen = False + self.args_frozen = False self.subprojects = {} self.subproject_stack = [] self.build_func_dict() @@ -1227,7 +1228,9 @@ class Interpreter(): 'configure_file' : self.func_configure_file, 'include_directories' : self.func_include_directories, 'add_global_arguments' : self.func_add_global_arguments, + 'add_project_arguments' : self.func_add_project_arguments, 'add_global_link_arguments' : self.func_add_global_link_arguments, + 'add_project_link_arguments' : self.func_add_project_link_arguments, 'add_languages' : self.func_add_languages, 'find_program' : self.func_find_program, 'find_library' : self.func_find_library, @@ -1578,7 +1581,7 @@ class Interpreter(): raise InterpreterException(msg.format(os.path.join(self.subproject_dir, dirname))) subdir = os.path.join(self.subproject_dir, resolved) os.makedirs(os.path.join(self.build.environment.get_build_dir(), subdir), exist_ok=True) - self.global_args_frozen = True + self.args_frozen = True mlog.log('\nExecuting subproject ', mlog.bold(dirname), '.\n', sep='') subi = Interpreter(self.build, self.backend, dirname, subdir, self.subproject_dir) subi.subprojects = self.subprojects @@ -1935,7 +1938,7 @@ requirements use the version keyword argument instead.''') try: dep = self.subprojects[dirname].get_variable_method([varname], {}) except KeyError: - raise InvalidCode('Fallback variable {!r} in the subproject ' + raise InvalidCode('Fallback variable {!r} in the subproject ' '{!r} does not exist'.format(varname, dirname)) if not isinstance(dep, DependencyHolder): raise InvalidCode('Fallback variable {!r} in the subproject {!r} is ' @@ -2291,7 +2294,7 @@ requirements use the version keyword argument instead.''') 'arguments and add it to the appropriate *_args kwarg ' \ 'in each target.' raise InvalidCode(msg) - if self.global_args_frozen: + if self.args_frozen: msg = 'Tried to set global arguments after a build target has ' \ 'been declared.\nThis is not permitted. Please declare all ' \ 'global arguments before your targets.' @@ -2314,7 +2317,7 @@ requirements use the version keyword argument instead.''') 'arguments and add it to the appropriate *_args kwarg ' \ 'in each target.' raise InvalidCode(msg) - if self.global_args_frozen: + if self.args_frozen: msg = 'Tried to set global link arguments after a build target has ' \ 'been declared.\nThis is not permitted. Please declare all ' \ 'global arguments before your targets.' @@ -2327,6 +2330,39 @@ requirements use the version keyword argument instead.''') else: self.build.global_link_args[lang] = args + @stringArgs + def func_add_project_link_arguments(self, node, args, kwargs): + if self.args_frozen: + msg = 'Tried to set project link arguments after a build target has ' \ + 'been declared.\nThis is not permitted. Please declare all ' \ + 'project link arguments before your targets.' + raise InvalidCode(msg) + if not 'language' in kwargs: + raise InvalidCode('Missing language definition in add_project_link_arguments') + lang = kwargs['language'].lower() + if self.subproject not in self.build.projects_link_args: + self.build.projects_link_args[self.subproject] = {} + + args = self.build.projects_link_args[self.subproject].get(lang, []) + args + self.build.projects_link_args[self.subproject][lang] = args + + @stringArgs + def func_add_project_arguments(self, node, args, kwargs): + if self.args_frozen: + msg = 'Tried to set project arguments after a build target has ' \ + 'been declared.\nThis is not permitted. Please declare all ' \ + 'project arguments before your targets.' + raise InvalidCode(msg) + + if not 'language' in kwargs: + raise InvalidCode('Missing language definition in add_project_arguments') + + if self.subproject not in self.build.projects_args: + self.build.projects_args[self.subproject] = {} + + lang = kwargs['language'].lower() + args = self.build.projects_args[self.subproject].get(lang, []) + args + self.build.projects_args[self.subproject][lang] = args def func_environment(self, node, args, kwargs): return EnvironmentVariablesHolder() @@ -2425,7 +2461,7 @@ requirements use the version keyword argument instead.''') self.add_cross_stdlib_info(target) l = targetholder(target, self) self.add_target(name, l.held_object) - self.global_args_frozen = True + self.args_frozen = True return l def get_used_languages(self, target): diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index f3f22bc..9262104 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -368,6 +368,8 @@ class GnomeModule: cflags = [] if state.global_args.get('c'): cflags += state.global_args['c'] + if state.project_args.get('c'): + cflags += state.project_args['c'] for compiler in state.compilers: if compiler.get_language() == 'c': sanitize = compiler.get_options().get('b_sanitize') |