Auto-generate dexpreopt boot image module
Add prebuilt modules that installs bootjar dexpreopt files generated by soong, for example `dexpreopt_bootjar.boot_arm64` installs .art / .oat / .vdex, etc for the framework boot image ("boot") for primary arch ("arm64"). Bug: 159196136 Test: TH built artifacts noop Test: Check device boot images are installed Test: ./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm64.ninja -t browse Test: Check that generated dependency graph is sane Test: Check that bootjar dexpreopt bits are listed in `m dump-files` Change-Id: Ia30b37be9be972c5e28b5840923801ea7237a237
This commit is contained in:
parent
4a2e443ec2
commit
3ca4980d36
4 changed files with 98 additions and 50 deletions
|
@ -21,32 +21,38 @@ ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(DEXPREOPT_IMAGE_PROFIL
|
|||
my_boot_image_arch := TARGET_ARCH
|
||||
my_boot_image_out := $(PRODUCT_OUT)
|
||||
my_boot_image_syms := $(TARGET_OUT_UNSTRIPPED)
|
||||
my_boot_image_root := DEFAULT_DEX_PREOPT_INSTALLED_IMAGE
|
||||
DEFAULT_DEX_PREOPT_INSTALLED_IMAGE :=
|
||||
$(foreach my_boot_image_name,$(DEXPREOPT_IMAGE_NAMES),$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk))
|
||||
DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE := \
|
||||
$(foreach my_boot_image_name,$(DEXPREOPT_IMAGE_NAMES),$(strip \
|
||||
$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk) \
|
||||
$(my_boot_image_module)))
|
||||
ifdef TARGET_2ND_ARCH
|
||||
my_boot_image_arch := TARGET_2ND_ARCH
|
||||
my_boot_image_root := 2ND_DEFAULT_DEX_PREOPT_INSTALLED_IMAGE
|
||||
2ND_DEFAULT_DEX_PREOPT_INSTALLED_IMAGE :=
|
||||
$(foreach my_boot_image_name,$(DEXPREOPT_IMAGE_NAMES),$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk))
|
||||
2ND_DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE := \
|
||||
$(foreach my_boot_image_name,$(DEXPREOPT_IMAGE_NAMES),$(strip \
|
||||
$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk) \
|
||||
$(my_boot_image_module)))
|
||||
endif
|
||||
# Install boot images for testing on host. We exclude framework image as it is not part of art manifest.
|
||||
my_boot_image_arch := HOST_ARCH
|
||||
my_boot_image_out := $(HOST_OUT)
|
||||
my_boot_image_syms := $(HOST_OUT)/symbols
|
||||
my_boot_image_root := HOST_BOOT_IMAGE
|
||||
HOST_BOOT_IMAGE :=
|
||||
$(foreach my_boot_image_name,art_host,$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk))
|
||||
HOST_BOOT_IMAGE_MODULE := \
|
||||
$(foreach my_boot_image_name,art_host,$(strip \
|
||||
$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk) \
|
||||
$(my_boot_image_module)))
|
||||
HOST_BOOT_IMAGE := $(call module-installed-files,$(HOST_BOOT_IMAGE_MODULE))
|
||||
ifdef HOST_2ND_ARCH
|
||||
my_boot_image_arch := HOST_2ND_ARCH
|
||||
my_boot_image_root := 2ND_HOST_BOOT_IMAGE
|
||||
2ND_HOST_BOOT_IMAGE :=
|
||||
$(foreach my_boot_image_name,art_host,$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk))
|
||||
2ND_HOST_BOOT_IMAGE_MODULE := \
|
||||
$(foreach my_boot_image_name,art_host,$(strip \
|
||||
$(eval include $(BUILD_SYSTEM)/dex_preopt_libart.mk) \
|
||||
$(my_boot_image_module)))
|
||||
2ND_HOST_BOOT_IMAGE := $(call module-installed-files,$(2ND_HOST_BOOT_IMAGE_MODULE))
|
||||
endif
|
||||
my_boot_image_arch :=
|
||||
my_boot_image_out :=
|
||||
my_boot_image_syms :=
|
||||
my_boot_image_root :=
|
||||
my_boot_image_module :=
|
||||
|
||||
# Build the boot.zip which contains the boot jars and their compilation output
|
||||
# We can do this only if preopt is enabled and if the product uses libart config (which sets the
|
||||
|
|
|
@ -5,38 +5,75 @@
|
|||
# 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))
|
||||
# my_boot_image_root: make variable used to store installed image path
|
||||
#
|
||||
# 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
|
||||
my_vdex_shared := $$(dir $$(patsubst %/,%,$$(dir $(2))))$$(notdir $(2)) # Remove the arch dir.
|
||||
ifneq ($(my_boot_image_arch),$(filter $(my_boot_image_arch), TARGET_2ND_ARCH HOST_2ND_ARCH))
|
||||
$$(my_vdex_shared): $(1) # Copy $(1) to directory one level up (i.e. with the arch dir removed).
|
||||
@echo "Install: $$@"
|
||||
$$(copy-file-to-target)
|
||||
endif
|
||||
$(2): $$(my_vdex_shared) # Create symlink at $(2) which points to the actual physical copy.
|
||||
@echo "Symlink: $$@"
|
||||
mkdir -p $$(dir $$@)
|
||||
ln -sfn ../$$(notdir $$@) $$@
|
||||
my_vdex_shared :=
|
||||
$(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),$(eval $(call copy-vdex-file, $(call word-colon,1,$(v)), $(2)$(call word-colon,2,$(v)))))
|
||||
$(foreach v,$(1),$(2)$(call word-colon,2,$(v)))
|
||||
$(foreach v,$(1),$(call copy-vdex-file,$(call word-colon,1,$(v)),$(2)$(call word-colon,2,$(v))))
|
||||
endef
|
||||
|
||||
# Install the boot images compiled by Soong.
|
||||
# The first file is saved in $(my_boot_image_root) and the rest are added as it's dependencies.
|
||||
my_suffix := BUILT_INSTALLED_$(my_boot_image_name)_$($(my_boot_image_arch))
|
||||
my_installed := $(call copy-many-files,$(DEXPREOPT_IMAGE_$(my_suffix)),$(my_boot_image_out))
|
||||
my_installed += $(call copy-many-files,$(DEXPREOPT_IMAGE_UNSTRIPPED_$(my_suffix)),$(my_boot_image_syms))
|
||||
my_installed += $(call copy-vdex-files,$(DEXPREOPT_IMAGE_VDEX_$(my_suffix)),$(my_boot_image_out))
|
||||
$(my_boot_image_root) += $(firstword $(my_installed))
|
||||
$(firstword $(my_installed)): $(wordlist 2,9999,$(my_installed))
|
||||
my_installed :=
|
||||
my_suffix :=
|
||||
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
|
||||
|
|
|
@ -150,9 +150,6 @@ endif
|
|||
# Bring in standard build system definitions.
|
||||
include $(BUILD_SYSTEM)/definitions.mk
|
||||
|
||||
# Bring in dex_preopt.mk
|
||||
include $(BUILD_SYSTEM)/dex_preopt.mk
|
||||
|
||||
ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)
|
||||
$(info ***************************************************************)
|
||||
$(info ***************************************************************)
|
||||
|
@ -473,6 +470,12 @@ endif
|
|||
# Typical build; include any Android.mk files we can find.
|
||||
#
|
||||
|
||||
# Bring in dex_preopt.mk
|
||||
# This creates some modules so it needs to be included after
|
||||
# should-install-to-system is defined (in order for base_rules.mk to function
|
||||
# properly), but before readonly-final-product-vars is called.
|
||||
include $(BUILD_SYSTEM)/dex_preopt.mk
|
||||
|
||||
# Strip and readonly a few more variables so they won't be modified.
|
||||
$(readonly-final-product-vars)
|
||||
ADDITIONAL_SYSTEM_PROPERTIES := $(strip $(ADDITIONAL_SYSTEM_PROPERTIES))
|
||||
|
|
|
@ -94,16 +94,18 @@ ifdef LOCAL_SOONG_DEX_JAR
|
|||
boot_jars := $(foreach pair,$(PRODUCT_BOOT_JARS), $(call word-colon,2,$(pair)))
|
||||
ifneq ($(filter $(LOCAL_MODULE),$(boot_jars)),) # is_boot_jar
|
||||
ifeq (true,$(WITH_DEXPREOPT))
|
||||
# For libart, the boot jars' odex files are replaced by $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE).
|
||||
# We use this installed_odex trick to get boot.art installed.
|
||||
installed_odex := $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)
|
||||
# Append the odex for the 2nd arch if we have one.
|
||||
installed_odex += $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)
|
||||
ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex)
|
||||
# Make sure to install the .odex and .vdex when you run "make <module_name>"
|
||||
$(my_all_targets): $(installed_odex)
|
||||
# Copy $(LOCAL_BUILT_MODULE) and its dependencies when installing boot.art
|
||||
$(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE): $(LOCAL_BUILT_MODULE)
|
||||
# $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE) contains modules that installs
|
||||
# all of bootjars' dexpreopt files (.art, .oat, .vdex, ...)
|
||||
# Add them to the required list so they are installed alongside this module.
|
||||
ALL_MODULES.$(my_register_name).REQUIRED_FROM_TARGET += \
|
||||
$(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE) \
|
||||
$(2ND_DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE)
|
||||
# Copy $(LOCAL_BUILT_MODULE) and its dependencies when installing boot.art
|
||||
# so that dependencies of $(LOCAL_BUILT_MODULE) (which may include
|
||||
# jacoco-report-classes.jar) are copied for every build.
|
||||
$(foreach m,$(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE) $(2ND_DEFAULT_DEX_PREOPT_INSTALLED_IMAGE_MODULE), \
|
||||
$(eval $(call add-dependency,$(firstword $(call module-installed-files,$(m))),$(LOCAL_BUILT_MODULE))) \
|
||||
)
|
||||
endif
|
||||
endif # is_boot_jar
|
||||
|
||||
|
|
Loading…
Reference in a new issue