diff options
Diffstat (limited to 'core/release_config.mk')
-rw-r--r-- | core/release_config.mk | 158 |
1 files changed, 144 insertions, 14 deletions
diff --git a/core/release_config.mk b/core/release_config.mk index 3e51af5a44..2898868682 100644 --- a/core/release_config.mk +++ b/core/release_config.mk @@ -14,6 +14,16 @@ # ----------------------------------------------------------------- +# Determine which pass this is. +# ----------------------------------------------------------------- +# On the first pass, we are asked for only PRODUCT_RELEASE_CONFIG_MAPS, +# on the second pass, we are asked for whatever else is wanted. +_final_product_config_pass:= +ifneq (PRODUCT_RELEASE_CONFIG_MAPS,$(DUMP_MANY_VARS)) + _final_product_config_pass:=true +endif + +# ----------------------------------------------------------------- # Choose the flag files # ----------------------------------------------------------------- # Release configs are defined in reflease_config_map files, which map @@ -39,8 +49,6 @@ # If this is a google source tree, restrict it to only the one file # which has OWNERS control. If it isn't let others define their own. -# TODO: Remove wildcard for build/release one when all branch manifests -# have updated. config_map_files := $(wildcard build/release/release_config_map.mk) \ $(wildcard vendor/google_shared/build/release/release_config_map.mk) \ $(if $(wildcard vendor/google/release/release_config_map.mk), \ @@ -53,13 +61,118 @@ config_map_files := $(wildcard build/release/release_config_map.mk) \ ) \ ) +protobuf_map_files := build/release/release_config_map.textproto \ + $(wildcard vendor/google_shared/build/release/release_config_map.textproto) \ + $(if $(wildcard vendor/google/release/release_config_map.textproto), \ + vendor/google/release/release_config_map.textproto, \ + $(sort \ + $(wildcard device/*/release/release_config_map.textproto) \ + $(wildcard device/*/*/release/release_config_map.textproto) \ + $(wildcard vendor/*/release/release_config_map.textproto) \ + $(wildcard vendor/*/*/release/release_config_map.textproto) \ + ) \ + ) + +# Remove support for the legacy approach. +_must_protobuf := true + # PRODUCT_RELEASE_CONFIG_MAPS is set by Soong using an initial run of product # config to capture only the list of config maps needed by the build. # Keep them in the order provided, but remove duplicates. +# Treat .mk and .textproto as equal for duplicate elimination, but force +# protobuf if any PRODUCT_RELEASE_CONFIG_MAPS specify .textproto. $(foreach map,$(PRODUCT_RELEASE_CONFIG_MAPS), \ - $(if $(filter $(map),$(config_map_files)),,$(eval config_map_files += $(map))) \ + $(if $(filter $(basename $(map)),$(basename $(config_map_files))),, \ + $(eval config_map_files += $(map))) \ + $(if $(filter $(basename $(map)).textproto,$(map)),$(eval _must_protobuf := true)) \ ) + +# If we are missing the textproto version of any of $(config_map_files), we cannot use protobuf. +_can_protobuf := true +$(foreach map,$(config_map_files), \ + $(if $(wildcard $(basename $(map)).textproto),,$(eval _can_protobuf :=)) \ +) +# If we are missing the mk version of any of $(protobuf_map_files), we must use protobuf. +$(foreach map,$(protobuf_map_files), \ + $(if $(wildcard $(basename $(map)).mk),,$(eval _must_protobuf := true)) \ +) + +ifneq (,$(_must_protobuf)) + ifeq (,$(_can_protobuf)) + # We must use protobuf, but we cannot use protobuf. + $(error release config is a mixture of .scl and .textproto) + endif +endif + +_use_protobuf := +ifneq (,$(_must_protobuf)) + _use_protobuf := true +else + ifneq ($(_can_protobuf),) + # Determine the default + $(foreach map,$(config_map_files), \ + $(if $(wildcard $(dir $(map))/build_config/DEFAULT=proto),$(eval _use_protobuf := true)) \ + $(if $(wildcard $(dir $(map))/build_config/DEFAULT=make),$(eval _use_protobuf := )) \ + ) + # Update for this specific release config only (no inheritance). + $(foreach map,$(config_map_files), \ + $(if $(wildcard $(dir $(map))/build_config/$(TARGET_RELEASE)=proto),$(eval _use_protobuf := true)) \ + $(if $(wildcard $(dir $(map))/build_config/$(TARGET_RELEASE)=make),$(eval _use_protobuf := )) \ + ) + endif +endif + +ifneq (,$(_use_protobuf)) + # The .textproto files are the canonical source of truth. + _args := $(foreach map,$(config_map_files), --map $(map) ) + ifneq (,$(_must_protobuf)) + # Disable the build flag in release-config. + _args += --guard=false + endif + _args += --allow-missing=true + _flags_dir:=$(OUT_DIR)/soong/release-config + _flags_file:=$(_flags_dir)/release_config-$(TARGET_PRODUCT)-$(TARGET_RELEASE).vars + # release-config generates $(_flags_varmk) + _flags_varmk:=$(_flags_file:.vars=.varmk) + $(shell $(OUT_DIR)/release-config $(_args) >$(OUT_DIR)/release-config.out && touch -t 200001010000 $(_flags_varmk)) + $(if $(filter-out 0,$(.SHELLSTATUS)),$(error release-config failed to run)) + ifneq (,$(_final_product_config_pass)) + # Save the final version of the config. + $(shell if ! cmp --quiet $(_flags_varmk) $(_flags_file); then cp $(_flags_varmk) $(_flags_file); fi) + # This will also set ALL_RELEASE_CONFIGS_FOR_PRODUCT and _used_files for us. + $(eval include $(_flags_file)) + $(KATI_extra_file_deps $(OUT_DIR)/release-config $(protobuf_map_files) $(_flags_file)) + else + # This is the first pass of product config. + $(eval include $(_flags_varmk)) + endif + _used_files := + ifeq (,$(_must_protobuf)$(RELEASE_BUILD_FLAGS_IN_PROTOBUF)) + _use_protobuf := + else + _base_all_release := all_release_configs-$(TARGET_PRODUCT) + $(call dist-for-goals,droid,\ + $(_flags_dir)/$(_base_all_release).pb:build_flags/all_release_configs.pb \ + $(_flags_dir)/$(_base_all_release).textproto:build_flags/all_release_configs.textproto \ + $(_flags_dir)/$(_base_all_release).json:build_flags/all_release_configs.json \ + $(_flags_dir)/inheritance_graph-$(TARGET_PRODUCT).dot:build_flags/inheritance_graph-$(TARGET_PRODUCT).dot \ + ) +# These are always created, add an empty rule for them to keep ninja happy. +$(_flags_dir)/inheritance_graph-$(TARGET_PRODUCT).dot: + : created by $(OUT_DIR)/release-config +$(_flags_dir)/$(_base_all_release).pb $(_flags_dir)/$(_base_all_release).textproto $(_flags_dir)/$(_base_all_release).json: + : created by $(OUT_DIR)/release-config + _base_all_release := + endif + _flags_dir:= + _flags_file:= + _flags_varmk:= +endif +ifeq (,$(_use_protobuf)) + # The .mk files are the canonical source of truth. + + # Declare an alias release-config # # This should be used to declare a release as an alias of another, meaning no @@ -105,9 +218,9 @@ define _declare-release-config $(error declare-release-config: config $(strip $(1)) must have release config files, override another release config, or both) \ ) $(if $(strip $(4)),$(eval _all_release_configs.$(strip $(1)).ALIAS := true)) - $(eval _all_release_configs := $(sort $(_all_release_configs) $(strip $(1)))) + $(eval ALL_RELEASE_CONFIGS_FOR_PRODUCT := $(sort $(ALL_RELEASE_CONFIGS_FOR_PRODUCT) $(strip $(1)))) $(if $(strip $(3)), \ - $(if $(filter $(_all_release_configs), $(strip $(3))), + $(if $(filter $(ALL_RELEASE_CONFIGS_FOR_PRODUCT), $(strip $(3))), $(if $(filter $(_all_release_configs.$(strip $(1)).OVERRIDES),$(strip $(3))),, $(eval _all_release_configs.$(strip $(1)).OVERRIDES := $(_all_release_configs.$(strip $(1)).OVERRIDES) $(strip $(3)))), \ $(error No release config $(strip $(3))) \ @@ -133,17 +246,20 @@ $(foreach f, $(config_map_files), \ FLAG_DECLARATION_FILES := # Verify that all inherited/overridden release configs are declared. -$(foreach config,$(_all_release_configs),\ +$(foreach config,$(ALL_RELEASE_CONFIGS_FOR_PRODUCT),\ $(foreach r,$(all_release_configs.$(r).OVERRIDES),\ $(if $(strip $(_all_release_configs.$(r).FILES)$(_all_release_configs.$(r).OVERRIDES)),,\ $(error Release config $(config) [declared in: $(_all_release_configs.$(r).DECLARED_IN)] inherits from non-existent $(r).)\ ))) # Verify that alias configs do not have config files. -$(foreach r,$(_all_release_configs),\ +$(foreach r,$(ALL_RELEASE_CONFIGS_FOR_PRODUCT),\ $(if $(_all_release_configs.$(r).ALIAS),$(if $(_all_release_configs.$(r).FILES),\ $(error Alias release config "$(r)" may not specify release config files $(_all_release_configs.$(r).FILES))\ ))) +# Use makefiles +endif + ifeq ($(TARGET_RELEASE),) # We allow some internal paths to explicitly set TARGET_RELEASE to the # empty string. For the most part, 'make' treats unset and empty string as @@ -151,7 +267,7 @@ ifeq ($(TARGET_RELEASE),) # if the variable was completely unset. TARGET_RELEASE ?= was_unset ifeq ($(TARGET_RELEASE),was_unset) - $(error No release config set for target; please set TARGET_RELEASE, or if building on the command line use 'lunch <target>-<release>-<build_type>', where release is one of: $(_all_release_configs)) + $(error No release config set for target; please set TARGET_RELEASE, or if building on the command line use 'lunch <target>-<release>-<build_type>', where release is one of: $(ALL_RELEASE_CONFIGS_FOR_PRODUCT)) endif # Instead of leaving this string empty, we want to default to a valid # setting. Full builds coming through this path is a bug, but in case @@ -161,12 +277,13 @@ endif # During pass 1 of product config, using a non-existent release config is not an error. # We can safely assume that we are doing pass 1 if DUMP_MANY_VARS=="PRODUCT_RELEASE_CONFIG_MAPS". -ifneq (PRODUCT_RELEASE_CONFIG_MAPS,$(DUMP_MANY_VARS)) - ifeq ($(filter $(_all_release_configs), $(TARGET_RELEASE)),) - $(error No release config found for TARGET_RELEASE: $(TARGET_RELEASE). Available releases are: $(_all_release_configs)) +ifneq (,$(_final_product_config_pass)) + ifeq ($(filter $(ALL_RELEASE_CONFIGS_FOR_PRODUCT), $(TARGET_RELEASE)),) + $(error No release config found for TARGET_RELEASE: $(TARGET_RELEASE). Available releases are: $(ALL_RELEASE_CONFIGS_FOR_PRODUCT)) endif endif +ifeq (,$(_use_protobuf)) # Choose flag files # Don't sort this, use it in the order they gave us. # Do allow duplicate entries, retaining only the first usage. @@ -196,6 +313,9 @@ define _apply-release-config-overrides $(error invalid use of apply-release-config-overrides) endef +# use makefiles +endif + # TODO: Remove this check after enough people have sourced lunch that we don't # need to worry about it trying to do get_build_vars TARGET_RELEASE. Maybe after ~9/2023 ifneq ($(CALLED_FROM_SETUP),true) @@ -207,15 +327,19 @@ TARGET_RELEASE:= endif .KATI_READONLY := TARGET_RELEASE -$(foreach config, $(_all_release_configs), \ +ifeq (,$(_use_protobuf)) +$(foreach config, $(ALL_RELEASE_CONFIGS_FOR_PRODUCT), \ $(eval _all_release_configs.$(config).DECLARED_IN:= ) \ $(eval _all_release_configs.$(config).FILES:= ) \ ) -_all_release_configs:= -config_map_files:= applied_releases:= +# use makefiles +endif +config_map_files:= +protobuf_map_files:= +ifeq (,$(_use_protobuf)) # ----------------------------------------------------------------- # Flag declarations and values # ----------------------------------------------------------------- @@ -252,3 +376,9 @@ filename_to_starlark:= # outside of the source tree. $(call run-starlark,$(OUT_DIR)/release_config_entrypoint.scl,$(OUT_DIR)/release_config_entrypoint.scl,--allow_external_entrypoint) +# use makefiles +endif +_can_protobuf := +_must_protobuf := +_use_protobuf := + |