From b85a140c3c0f7b2ff2123acd12fccac12ea3891a Mon Sep 17 00:00:00 2001 From: Yo Chiang Date: Sun, 10 May 2020 19:28:31 +0800 Subject: [PATCH] Refactor bitness resolving logic of product-installed-files * Add get-modules-for-2nd-arch helper function Add a generic function to retrieve second arch variant module names for TARGET, HOST and HOST_CROSS modules. It uses ALL_MODULES..FOR_2ND_ARCH to make sure that we are really returning second arch variant module names. Unlike `get-32-bit-modules` this function doesn't sort its output so it potentially saves us a tiny bit of makefile parsing time. * Add resolve-bitness-for-modules Factor out the common bitness-resolving logic of `product-installed-files` and `host-installed-files` to a helper function. When resolving HOST_CROSS modules, the primary arch is 32-bit and secondary arch is 64-bit. Bug: 155869107 Test: TH Test: check the value of product_target_FILES and product_host_FILES Change-Id: I0fdea2e8c55e5b8edf960dbf5e17bb789abb0bf8 --- core/main.mk | 76 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/core/main.mk b/core/main.mk index 68303cf660..0299e704db 100644 --- a/core/main.mk +++ b/core/main.mk @@ -487,6 +487,21 @@ CUSTOM_MODULES := \ # brought in as requirements of other modules. # # Resolve the required module name to 32-bit or 64-bit variant. + +# TODO(b/155869107): Replace get-32-bit-modules with get-modules-for-2nd-arch +# Get a list of corresponding module names for the second arch, if they exist. +# $(1): TARGET, HOST or HOST_CROSS +# $(2): A list of module names +define get-modules-for-2nd-arch +$(strip \ + $(foreach m,$(2), \ + $(if $(filter true,$(ALL_MODULES.$(m)$($(1)_2ND_ARCH_MODULE_SUFFIX).FOR_2ND_ARCH)), \ + $(m)$($(1)_2ND_ARCH_MODULE_SUFFIX) \ + ) \ + ) \ +) +endef + # Get a list of corresponding 32-bit module names, if one exists. define get-32-bit-modules $(sort $(foreach m,$(1),\ @@ -1030,6 +1045,45 @@ define auto-included-modules endef +# Resolves module bitness for PRODUCT_PACKAGES and PRODUCT_HOST_PACKAGES. +# The returned list of module names can be used to access +# ALL_MODULES..<*> variables. +# Name resolution for PRODUCT_PACKAGES / PRODUCT_HOST_PACKAGES: +# foo:32 resolves to foo_32; +# foo:64 resolves to foo; +# foo resolves to both foo and foo_32 (if foo_32 is defined). +# +# Name resolution for HOST_CROSS modules: +# foo:32 resolves to foo; +# foo:64 resolves to foo_64; +# foo resolves to both foo and foo_64 (if foo_64 is defined). +# +# $(1): TARGET, HOST or HOST_CROSS +# $(2): A list of simple module names with :32 and :64 suffix +define resolve-bitness-for-modules +$(strip \ + $(eval modules_32 := $(patsubst %:32,%,$(filter %:32,$(2)))) \ + $(eval modules_64 := $(patsubst %:64,%,$(filter %:64,$(2)))) \ + $(eval modules_both := $(filter-out %:32 %:64,$(2))) \ + $(eval ### For host cross modules, the primary arch is windows x86 and secondary is x86_64) \ + $(if $(filter HOST_CROSS,$(1)), \ + $(eval modules_1st_arch := $(modules_32)) \ + $(eval modules_2nd_arch := $(modules_64)), \ + $(eval modules_1st_arch := $(modules_64)) \ + $(eval modules_2nd_arch := $(modules_32))) \ + $(eval ### Note for 32-bit product, 32 and 64 will be added as their original module names.) \ + $(eval modules := $(modules_1st_arch)) \ + $(if $($(1)_2ND_ARCH), \ + $(eval modules += $(call get-modules-for-2nd-arch,$(1),$(modules_2nd_arch))), \ + $(eval modules += $(modules_2nd_arch))) \ + $(eval ### For the rest we add both) \ + $(eval modules += $(modules_both)) \ + $(if $($(1)_2ND_ARCH), \ + $(eval modules += $(call get-modules-for-2nd-arch,$(1),$(modules_both)))) \ + $(modules) \ +) +endef + # Lists most of the files a particular product installs, including: # - PRODUCT_PACKAGES, and their LOCAL_REQUIRED_MODULES # - PRODUCT_COPY_FILES @@ -1059,15 +1113,7 @@ define product-installed-files $(eval _pif_overrides := $(call module-overrides,$(_pif_modules))) \ $(eval _pif_modules := $(filter-out $(_pif_overrides), $(_pif_modules))) \ $(eval ### Resolve the :32 :64 module name) \ - $(eval _pif_modules_32 := $(patsubst %:32,%,$(filter %:32, $(_pif_modules)))) \ - $(eval _pif_modules_64 := $(patsubst %:64,%,$(filter %:64, $(_pif_modules)))) \ - $(eval _pif_modules_rest := $(filter-out %:32 %:64,$(_pif_modules))) \ - $(eval ### Note for 32-bit product, 32 and 64 will be added as their original module names.) \ - $(eval _pif_modules := $(call get-32-bit-modules-if-we-can, $(_pif_modules_32))) \ - $(eval _pif_modules += $(_pif_modules_64)) \ - $(eval ### For the rest we add both) \ - $(eval _pif_modules += $(call get-32-bit-modules, $(_pif_modules_rest))) \ - $(eval _pif_modules += $(_pif_modules_rest)) \ + $(eval _pif_modules := $(sort $(call resolve-bitness-for-modules,TARGET,$(_pif_modules)))) \ $(call expand-required-modules,_pif_modules,$(_pif_modules),$(_pif_overrides)) \ $(filter-out $(HOST_OUT_ROOT)/%,$(call module-installed-files, $(_pif_modules))) \ $(call resolve-product-relative-paths,\ @@ -1078,18 +1124,12 @@ endef # This does support the :32 / :64 syntax, but does not support module overrides. define host-installed-files $(eval _hif_modules := $(call get-product-var,$(1),PRODUCT_HOST_PACKAGES)) \ - $(eval ### Resolve the :32 :64 module name) \ - $(eval _hif_modules_32 := $(patsubst %:32,%,$(filter %:32, $(_hif_modules)))) \ - $(eval _hif_modules_64 := $(patsubst %:64,%,$(filter %:64, $(_hif_modules)))) \ - $(eval _hif_modules_rest := $(filter-out %:32 %:64,$(_hif_modules))) \ - $(eval _hif_modules := $(call get-host-32-bit-modules-if-we-can, $(_hif_modules_32))) \ - $(eval _hif_modules += $(_hif_modules_64)) \ - $(eval ### For the rest we add both) \ - $(eval _hif_modules += $(call get-host-32-bit-modules, $(_hif_modules_rest))) \ - $(eval _hif_modules += $(_hif_modules_rest)) \ $(eval ### Split host vs host cross modules) \ $(eval _hcif_modules := $(filter host_cross_%,$(_hif_modules))) \ $(eval _hif_modules := $(filter-out host_cross_%,$(_hif_modules))) \ + $(eval ### Resolve the :32 :64 module name) \ + $(eval _hif_modules := $(sort $(call resolve-bitness-for-modules,HOST,$(_hif_modules)))) \ + $(eval _hcif_modules := $(sort $(call resolve-bitness-for-modules,HOST_CROSS,$(_hcif_modules)))) \ $(call expand-required-host-modules,_hif_modules,$(_hif_modules),HOST) \ $(call expand-required-host-modules,_hcif_modules,$(_hcif_modules),HOST_CROSS) \ $(filter $(HOST_OUT)/%,$(call module-installed-files, $(_hif_modules))) \