diff --git a/core/Makefile b/core/Makefile index 062e33e59a..3013b7814e 100644 --- a/core/Makefile +++ b/core/Makefile @@ -16,53 +16,93 @@ VENDOR_DLKM_NOTICE_DEPS := ODM_DLKM_NOTICE_DEPS := SYSTEM_DLKM_NOTICE_DEPS := -# ----------------------------------------------------------------- -# Release Config Flags -# Create a summary file of build flags for each partition -# $(1): build flags json file -# $(2): flag names -define generate-partition-build-flag-file -$(eval $(strip $(1)): PRIVATE_OUT := $(strip $(1))) -$(eval $(strip $(1)): PRIVATE_FLAG_NAMES := $(strip $(2))) -$(strip $(1)): - mkdir -p $$(dir $$(PRIVATE_OUT)) - echo '{' > $$(PRIVATE_OUT) - echo '"flags": [' >> $$(PRIVATE_OUT) - $$(foreach flag, $$(PRIVATE_FLAG_NAMES), \ - ( \ - printf ' { "name": "%s", "value": "%s", ' \ - '$$(flag)' \ - '$$(_ALL_RELEASE_FLAGS.$$(flag).VALUE)' \ - ; \ - printf '"set": "%s", "default": "%s", "declared": "%s" }' \ - '$$(_ALL_RELEASE_FLAGS.$$(flag).SET_IN)' \ - '$$(_ALL_RELEASE_FLAGS.$$(flag).DEFAULT)' \ - '$$(_ALL_RELEASE_FLAGS.$$(flag).DECLARED_IN)' \ - ; \ - printf '$$(if $$(filter $$(lastword $$(PRIVATE_FLAG_NAMES)),$$(flag)),,$$(comma))\n' ; \ - ) >> $$(PRIVATE_OUT) \ - ) - echo "]" >> $$(PRIVATE_OUT) - echo "}" >> $$(PRIVATE_OUT) +# IMAGES_TO_BUILD is a list of the partition .img files that will be created. +IMAGES_TO_BUILD:= +ifneq ($(BUILDING_BOOT_IMAGE),) + IMAGES_TO_BUILD += boot +endif +ifneq ($(BUILDING_CACHE_IMAGE),) + IMAGES_TO_BUILD += cache +endif +ifneq ($(BUILDING_DEBUG_BOOT_IMAGE),) + IMAGES_TO_BUILD += debug_boot +endif +ifneq ($(BUILDING_DEBUG_VENDOR_BOOT_IMAGE),) + IMAGES_TO_BUILD += debug_vendor_boot +endif +ifneq ($(BUILDING_INIT_BOOT_IMAGE),) + IMAGES_TO_BUILD += init_boot +endif +ifneq ($(BUILDING_ODM_DLKM_IMAGE),) + IMAGES_TO_BUILD += odm_dlkm +endif +ifneq ($(BUILDING_ODM_IMAGE),) + IMAGES_TO_BUILD += odm +endif +ifneq ($(BUILDING_PRODUCT_IMAGE),) + IMAGES_TO_BUILD += product +endif +ifneq ($(BUILDING_RAMDISK_IMAGE),) + IMAGES_TO_BUILD += ramdisk +endif +ifneq ($(BUILDING_RECOVERY_IMAGE),) + IMAGES_TO_BUILD += recovery +endif +ifneq ($(BUILDING_SUPER_EMPTY_IMAGE),) + IMAGES_TO_BUILD += super_empty +endif +ifneq ($(BUILDING_SYSTEM_DLKM_IMAGE),) + IMAGES_TO_BUILD += system_dlkm +endif +ifneq ($(BUILDING_SYSTEM_EXT_IMAGE),) + IMAGES_TO_BUILD += system_ext +endif +ifneq ($(BUILDING_SYSTEM_IMAGE),) + IMAGES_TO_BUILD += system +endif +ifneq ($(BUILDING_SYSTEM_OTHER_IMAGE),) + IMAGES_TO_BUILD += system_other +endif +ifneq ($(BUILDING_USERDATA_IMAGE),) + IMAGES_TO_BUILD += userdata +endif +ifneq ($(BUILDING_VBMETA_IMAGE),) + IMAGES_TO_BUILD += vbmeta +endif +ifneq ($(BUILDING_VENDOR_BOOT_IMAGE),) + IMAGES_TO_BUILD += vendor_boot +endif +ifneq ($(BUILDING_VENDOR_DLKM_IMAGE),) + IMAGES_TO_BUILD += vendor_dlkm +endif +ifneq ($(BUILDING_VENDOR_IMAGE),) + IMAGES_TO_BUILD += vendor +endif +ifneq ($(BUILDING_VENDOR_KERNEL_BOOT_IMAGE),) + IMAGES_TO_BUILD += vendor_kernel_boot +endif + + +########################################################### +# Get the module names suitable for ALL_MODULES.* variables that are installed +# for a given partition +# +# $(1): Partition +########################################################### +define register-names-for-partition +$(sort $(foreach m,$(product_MODULES),\ + $(if $(filter $(PRODUCT_OUT)/$(strip $(1))/%, $(ALL_MODULES.$(m).INSTALLED)), \ + $(m) + ) \ +)) endef -_FLAG_PARTITIONS := product system system_ext vendor -$(foreach partition, $(_FLAG_PARTITIONS), \ - $(eval BUILD_FLAG_SUMMARIES.$(partition) \ - := $(TARGET_OUT_FLAGS)/$(partition)/etc/build_flags.json) \ - $(eval $(call generate-partition-build-flag-file, \ - $(BUILD_FLAG_SUMMARIES.$(partition)), \ - $(_ALL_RELEASE_FLAGS.PARTITIONS.$(partition)) \ - ) \ - ) \ -) +# Release & Aconfig Flags +# ----------------------------------------------------------------- +include $(BUILD_SYSTEM)/packaging/flags.mk -# TODO: Remove -.PHONY: flag-files -flag-files: $(foreach partition, $(_FLAG_PARTITIONS), \ - $(TARGET_OUT_FLAGS)/$(partition)/etc/build_flags.json) # ----------------------------------------------------------------- # Define rules to copy PRODUCT_COPY_FILES defined by the product. diff --git a/core/base_rules.mk b/core/base_rules.mk index 998cb0d3fd..e7c28ec847 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -1058,6 +1058,10 @@ ALL_MODULES.$(my_register_name).SUPPORTED_VARIANTS := \ $(ALL_MODULES.$(my_register_name).SUPPORTED_VARIANTS) \ $(filter-out $(ALL_MODULES.$(my_register_name).SUPPORTED_VARIANTS),$(my_supported_variant)) +ALL_MODULES.$(my_register_name).ACONFIG_FILES := \ + $(ALL_MODULES.$(my_register_name).ACONFIG_FILES) $(LOCAL_ACONFIG_FILES) + + ########################################################################## ## When compiling against API imported module, use API import stub ## libraries. diff --git a/core/clear_vars.mk b/core/clear_vars.mk index bb7ba1b377..25b26cc7bf 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -9,6 +9,7 @@ LOCAL_AAPT2_ONLY:= LOCAL_AAPT_FLAGS:= LOCAL_AAPT_INCLUDE_ALL_RESOURCES:= LOCAL_AAPT_NAMESPACES:= +LOCAL_ACONFIG_FILES:= LOCAL_ADDITIONAL_CERTIFICATES:= LOCAL_ADDITIONAL_CHECKED_MODULE:= LOCAL_ADDITIONAL_DEPENDENCIES:= diff --git a/core/config.mk b/core/config.mk index 5de5504103..e3f06070a2 100644 --- a/core/config.mk +++ b/core/config.mk @@ -625,6 +625,7 @@ FILESLIST := $(HOST_OUT_EXECUTABLES)/fileslist FILESLIST_UTIL :=$= build/make/tools/fileslist_util.py HOST_INIT_VERIFIER := $(HOST_OUT_EXECUTABLES)/host_init_verifier XMLLINT := $(HOST_OUT_EXECUTABLES)/xmllint +ACONFIG := $(HOST_OUT_EXECUTABLES)/aconfig # SOONG_ZIP is exported by Soong, but needs to be defined early for # $OUT/dexpreopt.global. It will be verified against the Soong version. diff --git a/core/main.mk b/core/main.mk index cbdb68015d..48b4b5e8bb 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1364,6 +1364,7 @@ else ifdef FULL_BUILD product_host_FILES := $(call host-installed-files,$(INTERNAL_PRODUCT)) product_target_FILES := $(call product-installed-files, $(INTERNAL_PRODUCT)) # WARNING: The product_MODULES variable is depended on by external files. + # It contains the list of register names that will be installed on the device product_MODULES := $(_pif_modules) # Verify the artifact path requirements made by included products. diff --git a/core/packaging/flags.mk b/core/packaging/flags.mk new file mode 100644 index 0000000000..4b692be46c --- /dev/null +++ b/core/packaging/flags.mk @@ -0,0 +1,122 @@ +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# This file is included by build/make/core/Makefile, and contains the logic for +# the combined flags files. +# + +# TODO: Should we do all of the images in $(IMAGES_TO_BUILD)? +_FLAG_PARTITIONS := product system system_ext vendor + + +# ----------------------------------------------------------------- +# Release Config Flags + +# Create a summary file of build flags for each partition +# $(1): built build flags json file +# $(2): installed build flags json file +# $(3): flag names +define generate-partition-build-flag-file +$(eval $(strip $(1)): PRIVATE_OUT := $(strip $(1))) +$(eval $(strip $(1)): PRIVATE_FLAG_NAMES := $(strip $(3))) +$(strip $(1)): + mkdir -p $$(dir $$(PRIVATE_OUT)) + echo '{' > $$(PRIVATE_OUT) + echo '"flags": [' >> $$(PRIVATE_OUT) + $$(foreach flag, $$(PRIVATE_FLAG_NAMES), \ + ( \ + printf ' { "name": "%s", "value": "%s", ' \ + '$$(flag)' \ + '$$(_ALL_RELEASE_FLAGS.$$(flag).VALUE)' \ + ; \ + printf '"set": "%s", "default": "%s", "declared": "%s" }' \ + '$$(_ALL_RELEASE_FLAGS.$$(flag).SET_IN)' \ + '$$(_ALL_RELEASE_FLAGS.$$(flag).DEFAULT)' \ + '$$(_ALL_RELEASE_FLAGS.$$(flag).DECLARED_IN)' \ + ; \ + printf '$$(if $$(filter $$(lastword $$(PRIVATE_FLAG_NAMES)),$$(flag)),,$$(comma))\n' ; \ + ) >> $$(PRIVATE_OUT) ; \ + ) + echo "]" >> $$(PRIVATE_OUT) + echo "}" >> $$(PRIVATE_OUT) +$(call copy-one-file, $(1), $(2)) +endef + +$(foreach partition, $(_FLAG_PARTITIONS), \ + $(eval build_flag_summaries.$(partition) := $(PRODUCT_OUT)/$(partition)/etc/build_flags.json) \ + $(eval $(call generate-partition-build-flag-file, \ + $(TARGET_OUT_FLAGS)/$(partition)/build_flags.json, \ + $(build_flag_summaries.$(partition)), \ + $(_ALL_RELEASE_FLAGS.PARTITIONS.$(partition)) \ + ) \ + ) \ +) + + +# ----------------------------------------------------------------- +# Aconfig Flags + +# Create a summary file of build flags for each partition +# $(1): built aconfig flags textprot file (out) +# $(2): installed aconfig flags textprot file (out) +# $(3): input aconfig files for the partition (in) +define generate-partition-aconfig-flag-file +$(eval $(strip $(1)): PRIVATE_OUT := $(strip $(1))) +$(eval $(strip $(1)): PRIVATE_IN := $(strip $(3))) +$(strip $(1)): $(ACONFIG) + mkdir -p $$(dir $$(PRIVATE_OUT)) + $$(if $$(PRIVATE_IN), \ + $$(ACONFIG) dump --format textproto --out $$(PRIVATE_OUT) \ + $$(addprefix --cache ,$$(PRIVATE_IN)), \ + echo "# No aconfig flags" > $$(PRIVATE_OUT) \ + ) +$(call copy-one-file, $(1), $(2)) +endef + + +$(foreach partition, $(_FLAG_PARTITIONS), \ + $(eval aconfig_flag_summaries.$(partition) := $(PRODUCT_OUT)/$(partition)/etc/aconfig_flags.textproto) \ + $(eval $(call generate-partition-aconfig-flag-file, \ + $(TARGET_OUT_FLAGS)/$(partition)/aconfig_flags.textproto, \ + $(aconfig_flag_summaries.$(partition)), \ + $(sort $(foreach m,$(call register-names-for-partition, $(partition)), \ + $(ALL_MODULES.$(m).ACONFIG_FILES) \ + )) \ + )) \ +) + + +# ----------------------------------------------------------------- +# Install the ones we need for the configured product +required_flags_files := \ + $(sort $(foreach partition, $(filter $(IMAGES_TO_BUILD), $(_FLAG_PARTITIONS)), \ + $(build_flag_summaries.$(partition)) \ + $(aconfig_flag_summaries.$(partition)) \ + )) + +ALL_DEFAULT_INSTALLED_MODULES += $(required_flags_files) + +# TODO: Remove +.PHONY: flag-files +flag-files: $(required_flags_files) + + +# Clean up +required_flags_files:= +$(foreach partition, $(_FLAG_PARTITIONS), \ + $(eval build_flag_summaries.$(partition):=) \ + $(eval aconfig_flag_summaries.$(partition):=) \ +) +