mirror of
https://github.com/mesonbuild/meson.git
synced 2026-08-08 08:40:52 +00:00
Add macOS linker versioning information
This patch exploits the information residing in ltversion to set the -compatibility_version and -current_version flags that are passed to the linker on macOS.
This commit is contained in:
committed by
Jussi Pakkanen
parent
0e00470d8c
commit
fa6ca16054
@@ -2392,7 +2392,7 @@ rule FORTRAN_DEP_HACK
|
||||
commands += linker.get_pic_args()
|
||||
# Add -Wl,-soname arguments on Linux, -install_name on OS X
|
||||
commands += linker.get_soname_args(target.prefix, target.name, target.suffix,
|
||||
abspath, target.soversion,
|
||||
abspath, target.soversion, target.ltversion,
|
||||
isinstance(target, build.SharedModule))
|
||||
# This is only visited when building for Windows using either GCC or Visual Studio
|
||||
if target.vs_module_defs and hasattr(linker, 'gen_vs_module_defs_args'):
|
||||
|
||||
@@ -85,7 +85,7 @@ class CCompiler(Compiler):
|
||||
# Almost every compiler uses this for disabling warnings
|
||||
return ['-w']
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
return []
|
||||
|
||||
def split_shlib_to_parts(self, fname):
|
||||
|
||||
@@ -939,7 +939,7 @@ ICC_WIN = 2
|
||||
GNU_LD_AS_NEEDED = '-Wl,--as-needed'
|
||||
APPLE_LD_AS_NEEDED = '-Wl,-dead_strip_dylibs'
|
||||
|
||||
def get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
if soversion is None:
|
||||
sostr = ''
|
||||
else:
|
||||
@@ -956,7 +956,15 @@ def get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, i
|
||||
if soversion is not None:
|
||||
install_name += '.' + soversion
|
||||
install_name += '.dylib'
|
||||
return ['-install_name', os.path.join('@rpath', install_name)]
|
||||
args = ['-install_name', os.path.join('@rpath', install_name)]
|
||||
if version and len(version.split('.')) == 3:
|
||||
splitted = version.split('.')
|
||||
major = int(splitted[0])
|
||||
minor = int(splitted[1])
|
||||
revision = int(splitted[2])
|
||||
args += ['-compatibility_version', '%d' % (major + minor + 1)]
|
||||
args += ['-current_version', '%d.%d' % (major + minor + 1, revision)]
|
||||
return args
|
||||
else:
|
||||
raise RuntimeError('Not implemented yet.')
|
||||
|
||||
@@ -1094,8 +1102,8 @@ class GnuCompiler:
|
||||
def split_shlib_to_parts(self, fname):
|
||||
return os.path.dirname(fname), fname
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
return get_gcc_soname_args(self.gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module)
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
return get_gcc_soname_args(self.gcc_type, prefix, shlib_name, suffix, path, soversion, version, is_shared_module)
|
||||
|
||||
def get_std_shared_lib_link_args(self):
|
||||
return ['-shared']
|
||||
@@ -1193,7 +1201,7 @@ class ClangCompiler:
|
||||
# so it might change semantics at any time.
|
||||
return ['-include-pch', os.path.join(pch_dir, self.get_pch_name(header))]
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
if self.clang_type == CLANG_STANDARD:
|
||||
gcc_type = GCC_STANDARD
|
||||
elif self.clang_type == CLANG_OSX:
|
||||
@@ -1202,7 +1210,7 @@ class ClangCompiler:
|
||||
gcc_type = GCC_MINGW
|
||||
else:
|
||||
raise MesonException('Unreachable code when converting clang type to gcc type.')
|
||||
return get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module)
|
||||
return get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, version, is_shared_module)
|
||||
|
||||
def has_multi_arguments(self, args, env):
|
||||
myargs = ['-Werror=unknown-warning-option', '-Werror=unused-command-line-argument']
|
||||
@@ -1276,7 +1284,7 @@ class IntelCompiler:
|
||||
def split_shlib_to_parts(self, fname):
|
||||
return os.path.dirname(fname), fname
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
if self.icc_type == ICC_STANDARD:
|
||||
gcc_type = GCC_STANDARD
|
||||
elif self.icc_type == ICC_OSX:
|
||||
@@ -1285,7 +1293,7 @@ class IntelCompiler:
|
||||
gcc_type = GCC_MINGW
|
||||
else:
|
||||
raise MesonException('Unreachable code when converting icc type to gcc type.')
|
||||
return get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module)
|
||||
return get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, version, is_shared_module)
|
||||
|
||||
# TODO: centralise this policy more globally, instead
|
||||
# of fragmenting it into GnuCompiler and ClangCompiler
|
||||
|
||||
@@ -41,7 +41,7 @@ class CsCompiler(Compiler):
|
||||
def get_link_args(self, fname):
|
||||
return ['-r:' + fname]
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
return []
|
||||
|
||||
def get_werror_args(self):
|
||||
|
||||
@@ -89,9 +89,9 @@ class DCompiler(Compiler):
|
||||
def get_std_shared_lib_link_args(self):
|
||||
return ['-shared']
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
# FIXME: Make this work for Windows, MacOS and cross-compiling
|
||||
return get_gcc_soname_args(GCC_STANDARD, prefix, shlib_name, suffix, path, soversion, is_shared_module)
|
||||
return get_gcc_soname_args(GCC_STANDARD, prefix, shlib_name, suffix, path, soversion, version, is_shared_module)
|
||||
|
||||
def get_feature_args(self, kwargs, build_to_src):
|
||||
res = []
|
||||
|
||||
@@ -94,8 +94,8 @@ end program prog
|
||||
def split_shlib_to_parts(self, fname):
|
||||
return os.path.dirname(fname), fname
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
return get_gcc_soname_args(self.gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module)
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
return get_gcc_soname_args(self.gcc_type, prefix, shlib_name, suffix, path, soversion, version, is_shared_module)
|
||||
|
||||
def get_dependency_gen_args(self, outtarget, outfile):
|
||||
# Disabled until this is fixed:
|
||||
|
||||
@@ -25,7 +25,7 @@ class JavaCompiler(Compiler):
|
||||
self.id = 'unknown'
|
||||
self.javarunner = 'java'
|
||||
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module):
|
||||
def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, version, is_shared_module):
|
||||
return []
|
||||
|
||||
def get_werror_args(self):
|
||||
|
||||
Reference in New Issue
Block a user