aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers/compilers.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/compilers/compilers.py')
-rw-r--r--mesonbuild/compilers/compilers.py49
1 files changed, 34 insertions, 15 deletions
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 9bd9bb2..6a310ba 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -249,6 +249,9 @@ base_options = {'b_pch': coredata.UserBooleanOption('b_pch', 'Use precompiled he
'b_staticpic': coredata.UserBooleanOption('b_staticpic',
'Build static libraries as position independent',
True),
+ 'b_bitcode': coredata.UserBooleanOption('b_bitcode',
+ 'Generate and embed bitcode (only macOS and iOS)',
+ False),
}
gnulike_instruction_set_args = {'mmx': ['-mmmx'],
@@ -287,7 +290,6 @@ vs64_instruction_set_args = {'mmx': ['/arch:AVX'],
'neon': None,
}
-
def sanitizer_compile_args(value):
if value == 'none':
return []
@@ -302,6 +304,14 @@ def sanitizer_link_args(value):
args = ['-fsanitize=' + value]
return args
+def option_enabled(boptions, options, option):
+ try:
+ if option not in boptions:
+ return False
+ return options[option].value
+ except KeyError:
+ return False
+
def get_base_compile_args(options, compiler):
args = []
# FIXME, gcc/clang specific.
@@ -338,6 +348,9 @@ def get_base_compile_args(options, compiler):
args += ['-DNDEBUG']
except KeyError:
pass
+ # This does not need a try...except
+ if option_enabled(compiler.base_options, options, 'b_bitcode'):
+ args.append('-fembed-bitcode')
return args
def get_base_link_args(options, linker, is_shared_module):
@@ -361,20 +374,22 @@ def get_base_link_args(options, linker, is_shared_module):
except KeyError:
pass
try:
- if not is_shared_module and 'b_lundef' in linker.base_options and options['b_lundef'].value:
- args.append('-Wl,--no-undefined')
- except KeyError:
- pass
- try:
- if 'b_asneeded' in linker.base_options and options['b_asneeded'].value:
- args.append(linker.get_asneeded_args())
- except KeyError:
- pass
- try:
if options['b_coverage'].value:
args += linker.get_coverage_link_args()
except KeyError:
pass
+ # These do not need a try...except
+ if not is_shared_module and option_enabled(linker.base_options, options, 'b_lundef'):
+ args.append('-Wl,--no-undefined')
+ as_needed = option_enabled(linker.base_options, options, 'b_asneeded')
+ bitcode = option_enabled(linker.base_options, options, 'b_bitcode')
+ # Shared modules cannot be built with bitcode_bundle because
+ # -bitcode_bundle is incompatible with -undefined and -bundle
+ if bitcode and not is_shared_module:
+ args.append('-Wl,-bitcode_bundle')
+ elif as_needed:
+ # -Wl,-dead_strip_dylibs is incompatible with bitcode
+ args.append(linker.get_asneeded_args())
return args
class CrossNoRunException(MesonException):
@@ -862,7 +877,7 @@ class Compiler:
def get_std_shared_lib_link_args(self):
return []
- def get_std_shared_module_link_args(self):
+ def get_std_shared_module_link_args(self, options):
return self.get_std_shared_lib_link_args()
def get_link_whole_for(self, args):
@@ -1071,7 +1086,9 @@ class GnuCompiler:
self.defines = defines or {}
self.base_options = ['b_pch', 'b_lto', 'b_pgo', 'b_sanitize', 'b_coverage',
'b_colorout', 'b_ndebug', 'b_staticpic']
- if self.gcc_type != GCC_OSX:
+ if self.gcc_type == GCC_OSX:
+ self.base_options.append('b_bitcode')
+ else:
self.base_options.append('b_lundef')
self.base_options.append('b_asneeded')
# All GCC backends can do assembly
@@ -1201,7 +1218,9 @@ class ClangCompiler:
self.clang_type = clang_type
self.base_options = ['b_pch', 'b_lto', 'b_pgo', 'b_sanitize', 'b_coverage',
'b_ndebug', 'b_staticpic', 'b_colorout']
- if self.clang_type != CLANG_OSX:
+ if self.clang_type == CLANG_OSX:
+ self.base_options.append('b_bitcode')
+ else:
self.base_options.append('b_lundef')
self.base_options.append('b_asneeded')
# All Clang backends can do assembly and LLVM IR
@@ -1270,7 +1289,7 @@ class ClangCompiler:
extra_args.append('-Wl,-no_weak_imports')
return super().has_function(funcname, prefix, env, extra_args, dependencies)
- def get_std_shared_module_link_args(self):
+ def get_std_shared_module_link_args(self, options):
if self.clang_type == CLANG_OSX:
return ['-bundle', '-Wl,-undefined,dynamic_lookup']
return ['-shared']