diff options
Diffstat (limited to 'core/dex_preopt_libart.mk')
-rw-r--r-- | core/dex_preopt_libart.mk | 96 |
1 files changed, 65 insertions, 31 deletions
diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 79d5f8cd8b..393053dc9b 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -1,45 +1,79 @@ #################################### # ART boot image installation -# Input variable: +# Input variables: # my_boot_image_name: the boot image to install +# my_boot_image_arch: the architecture to install (e.g. TARGET_ARCH, not expanded) +# my_boot_image_out: the install directory (e.g. $(PRODUCT_OUT)) +# my_boot_image_syms: the symbols director (e.g. $(TARGET_OUT_UNSTRIPPED)) +# +# Output variables: +# my_boot_image_module: the created module name. Empty if no module is created. +# +# Install the boot images compiled by Soong. +# Create a module named dexpreopt_bootjar.$(my_boot_image_name)_$($(my_boot_image_arch)) +# that installs all of boot image files. +# If there is no file to install for $(my_boot_image_name), for example when +# building an unbundled build, then no module is created. # #################################### -# Install primary arch vdex files into a shared location, and then symlink them to both the primary -# and secondary arch directories. -my_vdex_copy_pairs := $(DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_$(my_boot_image_name)_$(TARGET_ARCH)) -my_installed := $(foreach v,$(my_vdex_copy_pairs),$(PRODUCT_OUT)$(call word-colon,2,$(v))) -$(firstword $(my_installed)): $(wordlist 2,9999,$(my_installed)) +# 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) \ +) +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)))) +endef -my_built_vdex_dir := $(dir $(call word-colon,1,$(firstword $(my_vdex_copy_pairs)))) -my_installed_vdex_dir := $(PRODUCT_OUT)$(dir $(call word-colon,2,$(firstword $(my_vdex_copy_pairs)))) +my_boot_image_module := -$(my_installed): $(my_installed_vdex_dir)% : $(my_built_vdex_dir)% - @echo "Install: $@" - @rm -f $@ - $(copy-file-to-target) - mkdir -p $(dir $@)/$(TARGET_ARCH) - ln -sfn ../$(notdir $@) $(dir $@)/$(TARGET_ARCH) -ifdef TARGET_2ND_ARCH - mkdir -p $(dir $@)/$(TARGET_2ND_ARCH) - ln -sfn ../$(notdir $@) $(dir $@)/$(TARGET_2ND_ARCH) -endif +my_suffix := $(my_boot_image_name)_$($(my_boot_image_arch)) +my_copy_pairs := $(strip $(DEXPREOPT_IMAGE_BUILT_INSTALLED_$(my_suffix))) -my_dexpreopt_image_extra_deps := $(firstword $(my_installed)) +# Generate the boot image module only if there is any file to install. +ifneq (,$(my_copy_pairs)) + my_first_pair := $(firstword $(my_copy_pairs)) + my_rest_pairs := $(wordlist 2,$(words $(my_copy_pairs)),$(my_copy_pairs)) -my_2nd_arch_prefix := -include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk + my_first_src := $(call word-colon,1,$(my_first_pair)) + my_first_dest := $(my_boot_image_out)$(call word-colon,2,$(my_first_pair)) -ifdef TARGET_2ND_ARCH - my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) - include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk -endif + 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_2nd_arch_prefix := + # We don't have a LOCAL_PATH for the auto-generated modules, so let it be the $(BUILD_SYSTEM). + LOCAL_PATH := $(BUILD_SYSTEM) + 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)) + ifneq (,$(strip $(filter HOST_%,$(my_boot_image_arch)))) + LOCAL_IS_HOST_MODULE := true + endif + LOCAL_MODULE_CLASS := ETC + include $(BUILD_PREBUILT) + $(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) -my_vdex_copy_pairs := -my_installed := -my_built_vdex_dir := -my_installed_vdex_dir := -my_dexpreopt_image_extra_deps := + my_boot_image_module := $(LOCAL_MODULE) +endif # my_copy_pairs != empty |