aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-07-03 23:16:33 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2018-08-09 19:46:49 +0300
commit6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d (patch)
tree6e858ee5ae062f23737806bd44215b941a150673
parent15fb2843955b53414cf292cf0a6b7faf7ffc883a (diff)
downloadmeson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.zip
meson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.tar.gz
meson-6a0e6740432dfd22c54976ae3fe2fc1c9fea0b3d.tar.bz2
Add kwarg for specifying symbol visibility.
-rw-r--r--mesonbuild/backend/ninjabackend.py2
-rw-r--r--mesonbuild/build.py9
-rw-r--r--mesonbuild/compilers/compilers.py15
-rw-r--r--mesonbuild/interpreter.py1
-rw-r--r--test cases/failing build/2 hidden symbol/bob.c5
-rw-r--r--test cases/failing build/2 hidden symbol/bob.h3
-rw-r--r--test cases/failing build/2 hidden symbol/bobuser.c5
-rw-r--r--test cases/failing build/2 hidden symbol/meson.build14
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)