diff options
author | Martin Stjernholm <mast@google.com> | 2020-09-01 10:32:49 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-09-01 10:32:49 +0000 |
commit | a24c0fe6550f0f8c6eae3c4287c71b661988cb16 (patch) | |
tree | 427dc60aa0b722c82b6c3b2d1abf386d34b13114 | |
parent | 2a476f6908c36d915d0f17a126c102389691269c (diff) | |
parent | 49a4e9b52e6878403e3ef57958f065691fd27ec4 (diff) | |
download | build-a24c0fe6550f0f8c6eae3c4287c71b661988cb16.tar.gz |
Merge "Preserve symlinks in the Soong prebuilt install steps for host binaries and shared libs."
-rw-r--r-- | core/base_rules.mk | 4 | ||||
-rw-r--r-- | core/definitions.mk | 19 | ||||
-rw-r--r-- | core/soong_cc_prebuilt.mk | 8 | ||||
-rw-r--r-- | core/soong_rust_prebuilt.mk | 4 |
4 files changed, 35 insertions, 0 deletions
diff --git a/core/base_rules.mk b/core/base_rules.mk index 0ee4e12576..cb6cadc7ed 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -516,7 +516,11 @@ ifneq ($(LOCAL_INSTALLED_MODULE),$(my_default_test_module)) $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) @echo "Install: $@" +ifeq ($(LOCAL_MODULE_MAKEFILE),$(SOONG_ANDROID_MK)) + $(copy-file-or-link-to-new-target) +else $(copy-file-to-new-target) +endif $(PRIVATE_POST_INSTALL_CMD) endif diff --git a/core/definitions.mk b/core/definitions.mk index 2cf7a04ce5..ace3ff8830 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2554,6 +2554,18 @@ $(hide) rm -f $@ $(hide) cp $< $@ endef +# The same as copy-file-to-new-target, but preserve symlinks. Symlinks are +# converted to absolute to not break. +define copy-file-or-link-to-new-target +@mkdir -p $(dir $@) +$(hide) rm -f $@ +$(hide) if [ -h $< ]; then \ + ln -s $$(realpath $<) $@; \ +else \ + cp $< $@; \ +fi +endef + # Copy a prebuilt file to a target location. define transform-prebuilt-to-target @echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" @@ -2566,6 +2578,13 @@ define transform-prebuilt-to-target-strip-comments $(copy-file-to-target-strip-comments) endef +# Copy a prebuilt file to a target location, but preserve symlinks rather than +# dereference them. +define copy-or-link-prebuilt-to-target +@echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" +$(copy-file-or-link-to-new-target) +endef + # Copy a list of files/directories to target location, with sub dir structure preserved. # For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt . # $(1): the source list of files/directories. diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk index c9b742a7b8..a0315a5429 100644 --- a/core/soong_cc_prebuilt.mk +++ b/core/soong_cc_prebuilt.mk @@ -142,8 +142,16 @@ ifeq ($(my_check_same_vndk_variants),true) $(LOCAL_BUILT_MODULE): $(same_vndk_variants_stamp) endif +# Use copy-or-link-prebuilt-to-target for host executables and shared libraries, +# to preserve symlinks to the source trees. They can then run directly from the +# prebuilt directories where the linker can load their dependencies using +# relative RUNPATHs. $(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE) +ifeq ($(LOCAL_IS_HOST_MODULE) $(if $(filter EXECUTABLES SHARED_LIBRARIES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),true,),true true) + $(copy-or-link-prebuilt-to-target) +else $(transform-prebuilt-to-target) +endif ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),) $(hide) chmod +x $@ endif diff --git a/core/soong_rust_prebuilt.mk b/core/soong_rust_prebuilt.mk index 804e37edf9..de6bafdc7e 100644 --- a/core/soong_rust_prebuilt.mk +++ b/core/soong_rust_prebuilt.mk @@ -57,7 +57,11 @@ ifdef LOCAL_INSTALLED_MODULE endif $(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE) +ifeq ($(LOCAL_IS_HOST_MODULE) $(if $(filter EXECUTABLES SHARED_LIBRARIES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),true,),true true) + $(copy-or-link-prebuilt-to-target) +else $(transform-prebuilt-to-target) +endif ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),) $(hide) chmod +x $@ endif |