aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/build.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-10-04 22:10:09 +0300
committerGitHub <noreply@github.com>2018-10-04 22:10:09 +0300
commit88054c48a60e386909421dc8e2c89c918f2253d0 (patch)
treed8dee617bbc746033db72bd7f92d2e2d0cfafef1 /mesonbuild/build.py
parentc0c075c1298ad9018a62d75a632af1c0d0d7d0f8 (diff)
parentc53d35aa721e3c98590ef15c82a87b01ede9f628 (diff)
downloadmeson-88054c48a60e386909421dc8e2c89c918f2253d0.zip
meson-88054c48a60e386909421dc8e2c89c918f2253d0.tar.gz
meson-88054c48a60e386909421dc8e2c89c918f2253d0.tar.bz2
Merge pull request #4293 from marcelhollerbach/master
Performance optimize the install part generation
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r--mesonbuild/build.py68
1 files changed, 67 insertions, 1 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index ee99806..8ba5465 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'])
@@ -90,6 +90,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
@@ -325,6 +329,20 @@ a hard error in the future.''' % name)
self.build_always_stale = False
self.option_overrides = {}
+ def get_install_dir(self, environment):
+ # Find the installation directory.
+ default_install_dir = self.get_default_install_dir(environment)
+ outdirs = self.get_custom_install_dir()
+ if outdirs[0] is not None and outdirs[0] != default_install_dir and outdirs[0] is not True:
+ # Either the value is set to a non-default value, or is set to
+ # False (which means we want this specific output out of many
+ # outputs to not be installed).
+ custom_install_dir = True
+ else:
+ custom_install_dir = False
+ outdirs[0] = default_install_dir
+ return outdirs, custom_install_dir
+
def get_basename(self):
return self.name
@@ -679,6 +697,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()
@@ -687,6 +719,9 @@ class BuildTarget(Target):
result.update(i.get_link_dep_subdirs())
return result
+ def get_default_install_dir(self, environment):
+ return environment.get_libdir()
+
def get_custom_install_dir(self):
return self.install_dir
@@ -1327,6 +1362,9 @@ class Executable(BuildTarget):
# Only linkwithable if using export_dynamic
self.is_linkwithable = self.export_dynamic
+ def get_default_install_dir(self, environment):
+ return environment.get_bindir()
+
def description(self):
'''Human friendly description of the executable'''
return self.name
@@ -1388,6 +1426,12 @@ 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()
+
def type_suffix(self):
return "@sta"
@@ -1434,6 +1478,21 @@ 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()
+
def determine_filenames(self, is_cross, env):
"""
See https://github.com/mesonbuild/meson/pull/417 for details.
@@ -1705,6 +1764,10 @@ class SharedModule(SharedLibrary):
raise MesonException('Shared modules must not specify the soversion kwarg.')
super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs)
+ def get_default_install_dir(self, environment):
+ return environment.get_shared_module_dir()
+
+
class CustomTarget(Target):
known_kwargs = set([
'input',
@@ -1742,6 +1805,9 @@ class CustomTarget(Target):
mlog.warning('Unknown keyword arguments in target %s: %s' %
(self.name, ', '.join(unknowns)))
+ def get_default_install_dir(self, environment):
+ return None
+
def __lt__(self, other):
return self.get_id() < other.get_id()