aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorThibault Saunier <thibault.saunier@osg.samsung.com>2016-11-11 13:27:56 -0300
committerJussi Pakkanen <jpakkane@gmail.com>2016-11-12 17:34:06 -0500
commit85a0cd7635c45bb150b59f55dbd6ecbbe10048f8 (patch)
treea8b50106266044237437a42648bac9c1f5b9ce7c /mesonbuild
parent085650a1e3769366ac47f7d8a59386ed6d5a1ef5 (diff)
downloadmeson-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.py1
-rw-r--r--mesonbuild/backend/ninjabackend.py2
-rw-r--r--mesonbuild/backend/vs2010backend.py3
-rw-r--r--mesonbuild/build.py15
-rw-r--r--mesonbuild/interpreter.py48
-rw-r--r--mesonbuild/modules/gnome.py2
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')