diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-10-04 22:10:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-04 22:10:09 +0300 |
commit | 88054c48a60e386909421dc8e2c89c918f2253d0 (patch) | |
tree | d8dee617bbc746033db72bd7f92d2e2d0cfafef1 /mesonbuild/build.py | |
parent | c0c075c1298ad9018a62d75a632af1c0d0d7d0f8 (diff) | |
parent | c53d35aa721e3c98590ef15c82a87b01ede9f628 (diff) | |
download | meson-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.py | 68 |
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() |