platform_build/core/dex_preopt_libart.mk
Colin Cross db98001be1 Use order-only dependencies for symbols files
Use an order-only dependency from $(LOCAL_BUILT_MODULE) to the symbols
file so that wiping the symbols directory during installclean doesn't
force anything to rebuild.

Bug: 186507256
Test: m && rm -rf $OUT/symbols && m
Change-Id: Ic164819c71f9db6126ff91c58752c8727cde0d5e
2021-04-27 19:43:33 -07:00

79 lines
3.4 KiB
Makefile

####################################
# ART boot image installation
# 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 $(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_boot_image_module :=
my_suffix := $(my_boot_image_name)_$($(my_boot_image_arch))
my_copy_pairs := $(strip $(DEXPREOPT_IMAGE_BUILT_INSTALLED_$(my_suffix)))
# 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_first_src := $(call word-colon,1,$(my_first_pair))
my_first_dest := $(my_boot_image_out)$(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))
# 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_boot_image_module := $(LOCAL_MODULE)
endif # my_copy_pairs != empty