diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-07-03 23:16:33 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2018-08-09 19:46:49 +0300 |
commit | 6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d (patch) | |
tree | 6e858ee5ae062f23737806bd44215b941a150673 | |
parent | 15fb2843955b53414cf292cf0a6b7faf7ffc883a (diff) | |
download | meson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.zip meson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.tar.gz meson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.tar.bz2 |
Add kwarg for specifying symbol visibility.
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 2 | ||||
-rw-r--r-- | mesonbuild/build.py | 9 | ||||
-rw-r--r-- | mesonbuild/compilers/compilers.py | 15 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 1 | ||||
-rw-r--r-- | test cases/failing build/2 hidden symbol/bob.c | 5 | ||||
-rw-r--r-- | test cases/failing build/2 hidden symbol/bob.h | 3 | ||||
-rw-r--r-- | test cases/failing build/2 hidden symbol/bobuser.c | 5 | ||||
-rw-r--r-- | test cases/failing build/2 hidden symbol/meson.build | 14 |
8 files changed, 54 insertions, 0 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 913830f..f88c589 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1951,6 +1951,8 @@ rule FORTRAN_DEP_HACK%s # Create an empty commands list, and start adding arguments from # various sources in the order in which they must override each other commands = CompilerArgs(compiler) + # Start with symbol visibility. + commands += compiler.symbol_visibility_args(target.symbol_visibility) # Add compiler args for compiling this target derived from 'base' build # options passed on the command-line, in default_options, etc. # These have the lowest priority. diff --git a/mesonbuild/build.py b/mesonbuild/build.py index a3cd993..3d43c89 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -71,6 +71,7 @@ buildtarget_kwargs = set([ 'objects', 'override_options', 'sources', + 'symbol_visibility', ]) known_build_target_kwargs = ( @@ -817,6 +818,14 @@ This will become a hard error in a future Meson release.''') self.implicit_include_directories = kwargs.get('implicit_include_directories', True) if not isinstance(self.implicit_include_directories, bool): raise InvalidArguments('Implicit_include_directories must be a boolean.') + self.symbol_visibility = kwargs.get('symbol_visibility', '') + if not isinstance(self.symbol_visibility, str): + raise InvalidArguments('Symbol visibility must be a string.') + if self.symbol_visibility != '': + permitted = ['default', 'internal', 'hidden', 'protected', 'inlineshidden'] + if self.symbol_visibility not in permitted: + raise InvalidArguments('Symbol visibility arg %s not one of: %s', + self.symbol_visibility, ', '.join(permitted)) def get_filename(self): return self.filename diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 25835a3..3668a79 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -311,6 +311,14 @@ vs64_instruction_set_args = {'mmx': ['/arch:AVX'], 'neon': None, } +common_symbol_visibility_args = {'': [], + 'default': ['-fvisibility=default'], + 'internal': ['-fvisibility=internal'], + 'hidden': ['-fvisibility=hidden'], + 'protected': ['-fvisibility=protected'], + 'inlineshidden': ['-fvisibility=hidden', '-fvisibility-inlines-hidden'], + } + def sanitizer_compile_args(value): if value == 'none': return [] @@ -1062,6 +1070,9 @@ class Compiler: # building fails with undefined symbols. return [] + def symbol_visibility_args(self, vistype): + return [] + GCC_STANDARD = 0 GCC_OSX = 1 GCC_MINGW = 2 @@ -1277,6 +1288,8 @@ class GnuCompiler: def openmp_flags(self): return ['-fopenmp'] + def symbol_visibility_args(self, vistype): + return common_symbol_visibility_args[vistype] class ElbrusCompiler(GnuCompiler): # Elbrus compiler is nearly like GCC, but does not support @@ -1419,6 +1432,8 @@ class ClangCompiler: # Shouldn't work, but it'll be checked explicitly in the OpenMP dependency. return [] + def symbol_visibility_args(self, vistype): + return common_symbol_visibility_args[vistype] class ArmclangCompiler: def __init__(self): diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index fd0385d..c84ed96 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -3850,6 +3850,7 @@ Try setting b_lundef to false instead.''') @FeatureNewKwargs('build target', '0.42.0', ['rust_crate_type', 'build_rpath', 'implicit_include_directories']) @FeatureNewKwargs('build target', '0.41.0', ['rust_args']) @FeatureNewKwargs('build target', '0.40.0', ['build_by_default']) + @FeatureNewKwargs('build target', '0.48.0', ['symbol_visibility']) def build_target_decorator_caller(self, node, args, kwargs): return True diff --git a/test cases/failing build/2 hidden symbol/bob.c b/test cases/failing build/2 hidden symbol/bob.c new file mode 100644 index 0000000..9a3325a --- /dev/null +++ b/test cases/failing build/2 hidden symbol/bob.c @@ -0,0 +1,5 @@ +#include"bob.h" + +int hidden_function() { + return 7; +} diff --git a/test cases/failing build/2 hidden symbol/bob.h b/test cases/failing build/2 hidden symbol/bob.h new file mode 100644 index 0000000..947f6ee --- /dev/null +++ b/test cases/failing build/2 hidden symbol/bob.h @@ -0,0 +1,3 @@ +#pragma once + +int hidden_function(); diff --git a/test cases/failing build/2 hidden symbol/bobuser.c b/test cases/failing build/2 hidden symbol/bobuser.c new file mode 100644 index 0000000..89272ed --- /dev/null +++ b/test cases/failing build/2 hidden symbol/bobuser.c @@ -0,0 +1,5 @@ +#include"bob.h" + +int main(int argc, char **argv) { + return hidden_function(); +} diff --git a/test cases/failing build/2 hidden symbol/meson.build b/test cases/failing build/2 hidden symbol/meson.build new file mode 100644 index 0000000..d888385 --- /dev/null +++ b/test cases/failing build/2 hidden symbol/meson.build @@ -0,0 +1,14 @@ +project('hidden symbol', 'c') + +if host_machine.system() == 'windows' + cc = meson.get_compiler('c') + if cc.get_id() == 'gcc' + error('MESON_SKIP_TEST -fvisibility=hidden does not work on MinGW.') + endif +endif + +l = shared_library('bob', 'bob.c', + symbol_visibility: 'hidden') + +executable('bobuser', 'bobuser.c', + link_with: l) |