diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 393053dc9b..a2c9942a41 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -17,52 +17,83 @@ # #################################### -# Install $(1) to $(2) so that it is shared between architectures. -# Returns the target path of the shared vdex file and installed symlink. -define copy-vdex-file -$(strip \ - $(eval # Remove the arch dir) \ - $(eval my_vdex_shared := $(dir $(patsubst %/,%,$(dir $(2))))$(notdir $(2))) \ - $(if $(filter-out %_2ND_ARCH,$(my_boot_image_arch)), \ - $(eval # Copy $(1) to directory one level up (i.e. with the arch dir removed).) \ - $(eval $(call copy-one-file,$(1),$(my_vdex_shared))) \ - ) \ - $(eval # Create symlink at $(2) which points to the actual physical copy.) \ - $(call symlink-file,$(my_vdex_shared),../$(notdir $(2)),$(2)) \ - $(my_vdex_shared) $(2) \ -) +# Takes a list of src:dest install pairs and returns a new list with a path +# prefixed to each dest value. +# $(1): list of src:dest install pairs +# $(2): path to prefix to each dest value +define prefix-copy-many-files-dest +$(foreach v,$(1),$(call word-colon,1,$(v)):$(2)$(call word-colon,2,$(v))) endef -# Same as 'copy-many-files' but it uses the vdex-specific helper above. -define copy-vdex-files -$(foreach v,$(1),$(call copy-vdex-file,$(call word-colon,1,$(v)),$(2)$(call word-colon,2,$(v)))) +# Converts an architecture-specific vdex path into a location that can be shared +# between architectures. +define vdex-shared-install-path +$(dir $(patsubst %/,%,$(dir $(1))))$(notdir $(1)) +endef + +# Takes a list of src:dest install pairs of vdex files and returns a new list +# where each dest has been rewritten to the shared location for vdex files. +define vdex-copy-many-files-shared-dest +$(foreach v,$(1),$(call word-colon,1,$(v)):$(call vdex-shared-install-path,$(call word-colon,2,$(v)))) +endef + +# Creates a rule to symlink an architecture specific vdex file to the shared +# location for that vdex file. +define symlink-vdex-file +$(strip \ + $(call symlink-file,\ + $(call vdex-shared-install-path,$(1)),\ + ../$(notdir $(1)),\ + $(1))\ + $(1)) +endef + +# Takes a list of src:dest install pairs of vdex files and creates rules to +# symlink each dest to the shared location for that vdex file. +define symlink-vdex-files +$(foreach v,$(1),$(call symlink-vdex-file,$(call word-colon,2,$(v)))) endef my_boot_image_module := my_suffix := $(my_boot_image_name)_$($(my_boot_image_arch)) -my_copy_pairs := $(strip $(DEXPREOPT_IMAGE_BUILT_INSTALLED_$(my_suffix))) +my_copy_pairs := $(call prefix-copy-many-files-dest,$(DEXPREOPT_IMAGE_BUILT_INSTALLED_$(my_suffix)),$(my_boot_image_out)) +my_vdex_copy_pairs := $(call prefix-copy-many-files-dest,$(DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_$(my_suffix)),$(my_boot_image_out)) +my_vdex_copy_shared_pairs := $(call vdex-copy-many-files-shared-dest,$(my_vdex_copy_pairs)) +ifeq (,$(filter %_2ND_ARCH,$(my_boot_image_arch))) + # Only install the vdex to the shared location for the primary architecture. + my_copy_pairs += $(my_vdex_copy_shared_pairs) +endif + +my_unstripped_copy_pairs := $(call prefix-copy-many-files-dest,$(DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_$(my_suffix)),$(my_boot_image_syms)) # Generate the boot image module only if there is any file to install. -ifneq (,$(my_copy_pairs)) +ifneq (,$(strip $(my_copy_pairs))) my_first_pair := $(firstword $(my_copy_pairs)) my_rest_pairs := $(wordlist 2,$(words $(my_copy_pairs)),$(my_copy_pairs)) my_first_src := $(call word-colon,1,$(my_first_pair)) - my_first_dest := $(my_boot_image_out)$(call word-colon,2,$(my_first_pair)) + my_first_dest := $(call word-colon,2,$(my_first_pair)) - my_installed := $(call copy-many-files,$(my_rest_pairs),$(my_boot_image_out)) - my_installed += $(call copy-vdex-files,$(DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_$(my_suffix)),$(my_boot_image_out)) - my_unstripped_installed := $(call copy-many-files,$(DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_$(my_suffix)),$(my_boot_image_syms)) + my_installed := $(call copy-many-files,$(my_copy_pairs)) + my_unstripped_installed := $(call copy-many-files,$(my_unstripped_copy_pairs)) + + my_symlinks := $(call symlink-vdex-files,$(my_vdex_copy_pairs)) # We don't have a LOCAL_PATH for the auto-generated modules, so let it be the $(BUILD_SYSTEM). LOCAL_PATH := $(BUILD_SYSTEM) + # Hack to let these pseudo-modules wrapped around Soong modules use LOCAL_SOONG_INSTALLED_MODULE. + LOCAL_MODULE_MAKEFILE := $(SOONG_ANDROID_MK) include $(CLEAR_VARS) LOCAL_MODULE := dexpreopt_bootjar.$(my_suffix) LOCAL_PREBUILT_MODULE_FILE := $(my_first_src) LOCAL_MODULE_PATH := $(dir $(my_first_dest)) LOCAL_MODULE_STEM := $(notdir $(my_first_dest)) + LOCAL_SOONG_INSTALL_PAIRS := $(my_copy_pairs) + LOCAL_SOONG_INSTALL_SYMLINKS := $(my_symlinks) + LOCAL_SOONG_INSTALLED_MODULE := $(my_first_dest) + LOCAL_SOONG_LICENSE_METADATA := $(DEXPREOPT_IMAGE_LICENSE_METADATA_$(my_suffix)) ifneq (,$(strip $(filter HOST_%,$(my_boot_image_arch)))) LOCAL_IS_HOST_MODULE := true endif @@ -71,9 +102,8 @@ ifneq (,$(my_copy_pairs)) $(LOCAL_BUILT_MODULE): | $(my_unstripped_installed) # Installing boot.art causes all boot image bits to be installed. # Keep this old behavior in case anyone still needs it. - $(LOCAL_INSTALLED_MODULE): $(my_installed) - ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed) - $(my_all_targets): $(my_installed) + $(LOCAL_INSTALLED_MODULE): $(wordlist 2,$(words $(my_installed)),$(my_installed)) $(my_symlinks) + $(my_all_targets): $(my_installed) $(my_symlinks) my_boot_image_module := $(LOCAL_MODULE) endif # my_copy_pairs != empty