Install LOCAL_SOONG_INSTALL_SYMLINKS even if LOCAL_SOONG_INSTALLED_MODULE isn't set
LOCAL_SOONG_INSTALL_SYMLINKS can now be set by the install_symlink
module type. The install_symlink module type doesn't set
LOCAL_SOONG_INSTALLED_MODULE because make tries to copy that file
around, which doesn't work with a symlink.
Bug: 205632228
Test: built and ran the emulator observed the /system/bin/hwservicemanager symlink is still there
Change-Id: I1ec355b5ae057d0b7fe167674d70da6a4d03f6b5
diff --git a/core/Makefile b/core/Makefile
index b715ac3..a129441 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -3331,12 +3331,6 @@
ALL_DEFAULT_INSTALLED_MODULES += $(_systemext_symlink)
endif
-# Create symlink /system/bin/hwservicemanager -> /system/system_ext/bin/hwservicemanager
-# Old vendor libraries (like libhidlbase) may require /system/bin/hwservicemanager to be present
-$(call symlink-file,$(TARGET_OUT_SYSTEM_EXT)/bin/hwservicemanager,/system/system_ext/bin/hwservicemanager, $(TARGET_OUT)/bin/hwservicemanager)
-INTERNAL_SYSTEMIMAGE_FILES += \
- $(TARGET_OUT)/bin/hwservicemanager
-
# -----------------------------------------------------------------
# system_dlkm partition image
diff --git a/core/base_rules.mk b/core/base_rules.mk
index b3c5b94..3313b5f 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -521,10 +521,6 @@
# copy of the intermediates for now, as some rules that collect intermediates may expect
# them to exist.
$(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE)
-
- $(foreach symlink, $(LOCAL_SOONG_INSTALL_SYMLINKS), \
- $(call declare-0p-target,$(symlink)))
- $(my_all_targets) : | $(LOCAL_SOONG_INSTALL_SYMLINKS)
else ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD)
$(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE)
@@ -546,6 +542,15 @@
endif # !LOCAL_UNINSTALLABLE_MODULE
+# Add dependencies on LOCAL_SOONG_INSTALL_SYMLINKS if we're installing any kind of module, not just
+# ones that set LOCAL_SOONG_INSTALLED_MODULE. This is so we can have a soong module that only
+# installs symlinks (e.g. install_symlink). We can't set LOCAL_SOONG_INSTALLED_MODULE to a symlink
+# because cp commands will fail on symlinks.
+ifneq (,$(or $(LOCAL_SOONG_INSTALLED_MODULE),$(call boolean-not,$(LOCAL_UNINSTALLABLE_MODULE))))
+ $(foreach symlink, $(LOCAL_SOONG_INSTALL_SYMLINKS), $(call declare-0p-target,$(symlink)))
+ $(my_all_targets) : | $(LOCAL_SOONG_INSTALL_SYMLINKS)
+endif
+
###########################################################
## VINTF manifest fragment and init.rc goals
###########################################################
@@ -1001,6 +1006,16 @@
$(my_init_rc_installed) \
$(my_vintf_installed))
endif
+
+# Mark LOCAL_SOONG_INSTALL_SYMLINKS as installed if we're installing any kind of module, not just
+# ones that set LOCAL_SOONG_INSTALLED_MODULE. This is so we can have a soong module that only
+# installs symlinks (e.g. installed_symlink). We can't set LOCAL_SOONG_INSTALLED_MODULE to a symlink
+# because cp commands will fail on symlinks.
+ifneq (,$(or $(LOCAL_SOONG_INSTALLED_MODULE),$(call boolean-not,$(LOCAL_UNINSTALLABLE_MODULE))))
+ ALL_MODULES.$(my_register_name).INSTALLED += $(LOCAL_SOONG_INSTALL_SYMLINKS)
+ ALL_MODULES.$(my_register_name).INSTALLED_SYMLINKS := $(LOCAL_SOONG_INSTALL_SYMLINKS)
+endif
+
ifdef LOCAL_PICKUP_FILES
# Files or directories ready to pick up by the build system
# when $(LOCAL_BUILT_MODULE) is done.
diff --git a/core/definitions.mk b/core/definitions.mk
index 0777904..909357c 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -147,6 +147,10 @@
$(filter true, $(1))
endef
+define boolean-not
+$(if $(filter true,$(1)),,true)
+endef
+
###########################################################
## Rule for touching GCNO files.
###########################################################
diff --git a/target/product/generic_system.mk b/target/product/generic_system.mk
index f194d8b..dc9324c 100644
--- a/target/product/generic_system.mk
+++ b/target/product/generic_system.mk
@@ -131,6 +131,10 @@
_base_mk_allowed_list :=
+# TODO(b/299166571) Remove this after the artifact path requirements checker picks up
+# hwservicemanager correctly.
+PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += $(TARGET_COPY_OUT_SYSTEM)/bin/hwservicemanager
+
_my_allowed_list := $(_base_mk_allowed_list)
# For mainline, system.img should be mounted at /, so we include ROOT here.