aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-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--mesonbuild/minit.py16
5 files changed, 29 insertions, 14 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 913830f..9dcf0fa 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.gnu_symbol_visibility_args(target.gnu_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..c1cb8a8 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -71,6 +71,7 @@ buildtarget_kwargs = set([
'objects',
'override_options',
'sources',
+ 'gnu_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.gnu_symbol_visibility = kwargs.get('gnu_symbol_visibility', '')
+ if not isinstance(self.gnu_symbol_visibility, str):
+ raise InvalidArguments('GNU symbol visibility must be a string.')
+ if self.gnu_symbol_visibility != '':
+ permitted = ['default', 'internal', 'hidden', 'protected', 'inlineshidden']
+ if self.gnu_symbol_visibility not in permitted:
+ raise InvalidArguments('GNU 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 cb3ed23..ea0fc2c 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -311,6 +311,14 @@ vs64_instruction_set_args = {'mmx': ['/arch:AVX'],
'neon': None,
}
+gnu_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 []
@@ -1065,6 +1073,9 @@ class Compiler:
# building fails with undefined symbols.
return []
+ def gnu_symbol_visibility_args(self, vistype):
+ return []
+
GCC_STANDARD = 0
GCC_OSX = 1
GCC_MINGW = 2
@@ -1280,6 +1291,8 @@ class GnuCompiler:
def openmp_flags(self):
return ['-fopenmp']
+ def gnu_symbol_visibility_args(self, vistype):
+ return gnu_symbol_visibility_args[vistype]
class ElbrusCompiler(GnuCompiler):
# Elbrus compiler is nearly like GCC, but does not support
@@ -1422,6 +1435,8 @@ class ClangCompiler:
# Shouldn't work, but it'll be checked explicitly in the OpenMP dependency.
return []
+ def gnu_symbol_visibility_args(self, vistype):
+ return gnu_symbol_visibility_args[vistype]
class ArmclangCompiler:
def __init__(self):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 50d6148..1cf20f8 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -3854,6 +3854,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', ['gnu_symbol_visibility'])
def build_target_decorator_caller(self, node, args, kwargs):
return True
diff --git a/mesonbuild/minit.py b/mesonbuild/minit.py
index 1a83ed2..a66361f 100644
--- a/mesonbuild/minit.py
+++ b/mesonbuild/minit.py
@@ -72,16 +72,10 @@ lib_c_meson_template = '''project('{project_name}', 'c',
# not the executables that use the library.
lib_args = ['-DBUILDING_{utoken}']
-# Hiding symbols that are not explicitly marked as exported
-# requires a compiler flag on all compilers except VS.
-cc = meson.get_compiler('c')
-if cc.get_id() != 'msvc'
- lib_args += ['-fvisibility=hidden']
-endif
-
shlib = shared_library('{lib_name}', '{source_file}',
install : true,
c_args : lib_args,
+ gnu_symbol_visibility : 'hidden',
)
test_exe = executable('{test_exe_name}', '{test_source_file}',
@@ -226,16 +220,10 @@ lib_cpp_meson_template = '''project('{project_name}', 'cpp',
# not the executables that use the library.
lib_args = ['-DBUILDING_{utoken}']
-# Hiding symbols that are not explicitly marked as exported
-# requires a compiler flag on all compilers except VS.
-cpp = meson.get_compiler('cpp')
-if cpp.get_id() != 'msvc'
- lib_args += ['-fvisibility=hidden']
-endif
-
shlib = shared_library('{lib_name}', '{source_file}',
install : true,
cpp_args : lib_args,
+ gnu_symbol_visibility : 'hidden',
)
test_exe = executable('{test_exe_name}', '{test_source_file}',