aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/backends.py28
-rw-r--r--mesonbuild/build.py35
2 files changed, 35 insertions, 28 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index e0a593f..0a28782 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -27,9 +27,6 @@ from collections import OrderedDict
import shlex
from functools import lru_cache
-@lru_cache(maxsize=None)
-def get_target_macos_dylib_install_name(ld):
- return get_macos_dylib_install_name(ld.prefix, ld.name, ld.suffix, ld.soversion)
class CleanTrees:
@@ -970,29 +967,6 @@ class Backend:
with open(install_data_file, 'wb') as ofile:
pickle.dump(d, ofile)
- def get_target_link_deps_mappings(self, t, prefix):
- '''
- On macOS, we need to change the install names of all built libraries
- that a target depends on using install_name_tool so that the target
- continues to work after installation. For this, we need a dictionary
- mapping of the install_name value to the new one, so we can change them
- on install.
- '''
- result = {}
- if isinstance(t, build.StaticLibrary):
- return result
- for ld in t.get_all_link_deps():
- if ld is t or not isinstance(ld, build.SharedLibrary):
- continue
- old = get_target_macos_dylib_install_name(ld)
- if old in result:
- continue
- fname = ld.get_filename()
- outdirs, _ = ld.get_install_dir(self.environment)
- new = os.path.join(prefix, outdirs[0], fname)
- result.update({old: new})
- return result
-
def generate_target_install(self, d):
for t in self.build.get_targets().values():
if not t.should_install():
@@ -1012,7 +986,7 @@ class Backend:
# Install primary build output (library/executable/jar, etc)
# Done separately because of strip/aliases/rpath
if outdirs[0] is not False:
- mappings = self.get_target_link_deps_mappings(t, d.prefix)
+ mappings = t.get_link_deps_mapping(d.prefix, self.environment)
i = TargetInstallData(self.get_target_filename(t), outdirs[0],
t.get_aliases(), should_strip, mappings,
t.install_rpath, install_mode)
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 9279590..9c7b6a4 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -25,7 +25,7 @@ from .mesonlib import File, MesonException, listify, extract_as_list, OrderedSet
from .mesonlib import typeslistify, stringlistify, classify_unity_sources
from .mesonlib import get_filenames_templates_dict, substitute_values
from .mesonlib import for_windows, for_darwin, for_cygwin, for_android, has_path_sep
-from .compilers import is_object, clink_langs, sort_clink, lang_suffixes
+from .compilers import is_object, clink_langs, sort_clink, lang_suffixes, get_macos_dylib_install_name
from .interpreterbase import FeatureNew
pch_kwargs = set(['c_pch', 'cpp_pch'])
@@ -89,6 +89,10 @@ known_shmod_kwargs = known_build_target_kwargs
known_stlib_kwargs = known_build_target_kwargs | {'pic'}
known_jar_kwargs = known_exe_kwargs | {'main_class'}
+@lru_cache(maxsize=None)
+def get_target_macos_dylib_install_name(ld):
+ return get_macos_dylib_install_name(ld.prefix, ld.name, ld.suffix, ld.soversion)
+
class InvalidArguments(MesonException):
pass
@@ -692,6 +696,20 @@ class BuildTarget(Target):
result += i.get_all_link_deps()
return result
+ def get_link_deps_mapping(self, prefix, environment):
+ return self.get_transitive_link_deps_mapping(prefix, environment)
+
+ @lru_cache(maxsize=None)
+ def get_transitive_link_deps_mapping(self, prefix, environment):
+ result = {}
+ for i in self.link_targets:
+ mapping = i.get_link_deps_mapping(prefix, environment)
+ #we are merging two dictionaries, while keeping the earlier one dominant
+ result_tmp = mapping.copy()
+ result_tmp.update(result)
+ result = result_tmp
+ return result
+
@lru_cache(maxsize=None)
def get_link_dep_subdirs(self):
result = OrderedSet()
@@ -1404,6 +1422,9 @@ class StaticLibrary(BuildTarget):
self.filename = self.prefix + self.name + '.' + self.suffix
self.outputs = [self.filename]
+ def get_link_deps_mapping(self, prefix, environment):
+ return {}
+
def get_default_install_dir(self, environment):
return environment.get_static_lib_dir()
@@ -1453,6 +1474,18 @@ class SharedLibrary(BuildTarget):
self.basic_filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
self.determine_filenames(is_cross, environment)
+ def get_link_deps_mapping(self, prefix, environment):
+ result = {}
+ mappings = self.get_transitive_link_deps_mapping(prefix, environment)
+ old = get_target_macos_dylib_install_name(self)
+ if old not in mappings:
+ fname = self.get_filename()
+ outdirs, _ = self.get_install_dir(self.environment)
+ new = os.path.join(prefix, outdirs[0], fname)
+ result.update({old: new})
+ mappings.update(result)
+ return mappings
+
def get_default_install_dir(self, environment):
return environment.get_shared_lib_dir()