diff options
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r-- | mesonbuild/build.py | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 1ef183b..3d41cda 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -44,12 +44,19 @@ known_basic_kwargs = {'install' : True, 'native' : True, } -known_shlib_kwargs = known_basic_kwargs.copy() -known_shlib_kwargs.update({'version' : True, - 'soversion' : True, - 'name_prefix' : True, - 'name_suffix' : True, - 'vs_module_defs' : True}) +# These contain kwargs supported by both static and shared libraries. These are +# combined here because a library() call might be shared_library() or +# static_library() at runtime based on the configuration. +# FIXME: Find a way to pass that info down here so we can have proper target +# kwargs checking when specifically using shared_library() or static_library(). +known_lib_kwargs = known_basic_kwargs.copy() +known_lib_kwargs.update({'version' : True, # Only for shared libs + 'soversion' : True, # Only for shared libs + 'name_prefix' : True, + 'name_suffix' : True, + 'vs_module_defs' : True, # Only for shared libs + 'pic' : True, # Only for static libs + }) def compilers_are_msvc(compilers): """ @@ -516,6 +523,16 @@ class BuildTarget(): if not isinstance(name_suffix, str): raise InvalidArguments('Name suffix must be a string.') self.suffix = name_suffix + if isinstance(self, StaticLibrary): + # You can't disable PIC on OS X. The compiler ignores -fno-PIC. + # PIC is always on for Windows (all code is position-independent + # since library loading is done differently) + if for_darwin(self.is_cross, self.environment) or for_windows(self.is_cross, self.environment): + self.pic = True + else: + self.pic = kwargs.get('pic', False) + if not isinstance(self.pic, bool): + raise InvalidArguments('Argument pic must be boolean') def get_subdir(self): return self.subdir @@ -618,6 +635,8 @@ by calling get_variable() on the subproject object.''') t = t.held_object if not isinstance(t, (StaticLibrary, SharedLibrary)): raise InvalidArguments('Link target is not library.') + if isinstance(self, SharedLibrary) and isinstance(t, StaticLibrary) and not t.pic: + raise InvalidArguments("Can't link a non-PIC static library into a shared library") if self.is_cross != t.is_cross: raise InvalidArguments('Tried to mix cross built and native libraries in target %s.' % self.name) self.link_targets.append(t) @@ -831,6 +850,9 @@ class StaticLibrary(BuildTarget): def type_suffix(self): return "@sta" + def check_unknown_kwargs(self, kwargs): + self.check_unknown_kwargs_int(kwargs, known_lib_kwargs) + class SharedLibrary(BuildTarget): def __init__(self, name, subdir, subproject, is_cross, sources, objects, environment, kwargs): self.soversion = None @@ -988,7 +1010,7 @@ class SharedLibrary(BuildTarget): self.link_depends.append(path) def check_unknown_kwargs(self, kwargs): - self.check_unknown_kwargs_int(kwargs, known_shlib_kwargs) + self.check_unknown_kwargs_int(kwargs, known_lib_kwargs) def get_import_filename(self): """ |