1# 2# Copyright (C) 2020 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# sysprop.mk defines rules for generating <partition>/[etc/]build.prop files 18 19# ----------------------------------------------------------------- 20# property_overrides_split_enabled 21property_overrides_split_enabled := 22ifeq ($(BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED), true) 23 property_overrides_split_enabled := true 24endif 25 26POST_PROCESS_PROPS := $(HOST_OUT_EXECUTABLES)/post_process_props$(HOST_EXECUTABLE_SUFFIX) 27 28# Emits a set of sysprops common to all partitions to a file. 29# $(1): Partition name 30# $(2): Output file name 31define generate-common-build-props 32 echo "####################################" >> $(2);\ 33 echo "# from generate-common-build-props" >> $(2);\ 34 echo "# These properties identify this partition image." >> $(2);\ 35 echo "####################################" >> $(2);\ 36 echo "ro.product.$(1).brand=$(PRODUCT_BRAND)" >> $(2);\ 37 echo "ro.product.$(1).device=$(TARGET_DEVICE)" >> $(2);\ 38 echo "ro.product.$(1).manufacturer=$(PRODUCT_MANUFACTURER)" >> $(2);\ 39 echo "ro.product.$(1).model=$(PRODUCT_MODEL)" >> $(2);\ 40 echo "ro.product.$(1).name=$(TARGET_PRODUCT)" >> $(2);\ 41 if [ -n "$(strip $(PRODUCT_MODEL_FOR_ATTESTATION))" ]; then \ 42 echo "ro.product.model_for_attestation=$(PRODUCT_MODEL_FOR_ATTESTATION)" >> $(2);\ 43 fi; \ 44 if [ -n "$(strip $(PRODUCT_BRAND_FOR_ATTESTATION))" ]; then \ 45 echo "ro.product.brand_for_attestation=$(PRODUCT_BRAND_FOR_ATTESTATION)" >> $(2);\ 46 fi; \ 47 if [ -n "$(strip $(PRODUCT_NAME_FOR_ATTESTATION))" ]; then \ 48 echo "ro.product.name_for_attestation=$(PRODUCT_NAME_FOR_ATTESTATION)" >> $(2);\ 49 fi; \ 50 if [ -n "$(strip $(PRODUCT_DEVICE_FOR_ATTESTATION))" ]; then \ 51 echo "ro.product.device_for_attestation=$(PRODUCT_DEVICE_FOR_ATTESTATION)" >> $(2);\ 52 fi; \ 53 if [ -n "$(strip $(PRODUCT_MANUFACTURER_FOR_ATTESTATION))" ]; then \ 54 echo "ro.product.manufacturer_for_attestation=$(PRODUCT_MANUFACTURER_FOR_ATTESTATION)" >> $(2);\ 55 fi; \ 56 $(if $(filter true,$(ZYGOTE_FORCE_64)),\ 57 $(if $(filter vendor,$(1)),\ 58 echo "ro.$(1).product.cpu.abilist=$(TARGET_CPU_ABI_LIST_64_BIT)" >> $(2);\ 59 echo "ro.$(1).product.cpu.abilist32=" >> $(2);\ 60 echo "ro.$(1).product.cpu.abilist64=$(TARGET_CPU_ABI_LIST_64_BIT)" >> $(2);\ 61 )\ 62 ,\ 63 $(if $(filter system vendor odm,$(1)),\ 64 echo "ro.$(1).product.cpu.abilist=$(TARGET_CPU_ABI_LIST)" >> $(2);\ 65 echo "ro.$(1).product.cpu.abilist32=$(TARGET_CPU_ABI_LIST_32_BIT)" >> $(2);\ 66 echo "ro.$(1).product.cpu.abilist64=$(TARGET_CPU_ABI_LIST_64_BIT)" >> $(2);\ 67 )\ 68 )\ 69 echo "ro.$(1).build.date=`$(DATE_FROM_FILE)`" >> $(2);\ 70 echo "ro.$(1).build.date.utc=`$(DATE_FROM_FILE) +%s`" >> $(2);\ 71 # Allow optional assignments for ARC forward-declarations (b/249168657) 72 # TODO: Remove any tag-related inconsistencies once the goals from 73 # go/arc-android-sigprop-changes have been achieved. 74 echo "ro.$(1).build.fingerprint?=$(BUILD_FINGERPRINT_FROM_FILE)" >> $(2);\ 75 echo "ro.$(1).build.id?=$(BUILD_ID)" >> $(2);\ 76 echo "ro.$(1).build.tags?=$(BUILD_VERSION_TAGS)" >> $(2);\ 77 echo "ro.$(1).build.type=$(TARGET_BUILD_VARIANT)" >> $(2);\ 78 echo "ro.$(1).build.version.incremental=$(BUILD_NUMBER_FROM_FILE)" >> $(2);\ 79 echo "ro.$(1).build.version.release=$(PLATFORM_VERSION_LAST_STABLE)" >> $(2);\ 80 echo "ro.$(1).build.version.release_or_codename=$(PLATFORM_VERSION)" >> $(2);\ 81 echo "ro.$(1).build.version.sdk=$(PLATFORM_SDK_VERSION)" >> $(2);\ 82 echo "ro.$(1).build.version.sdk_full=$(PLATFORM_SDK_VERSION_FULL)" >> $(2);\ 83 84endef 85 86# Rule for generating <partition>/[etc/]build.prop file 87# 88# $(1): partition name 89# $(2): path to the output 90# $(3): path to the input *.prop files. The contents of the files are directly 91# emitted to the output 92# $(4): list of variable names each of which contains name=value pairs 93# $(5): optional list of prop names to force remove from the output. Properties from both 94# $(3) and (4) are affected 95# $(6): optional list of files to append at the end. The content of each file is emitted 96# to the output 97# $(7): optional flag to skip common properties generation 98define build-properties 99ALL_DEFAULT_INSTALLED_MODULES += $(2) 100 101$(eval # Properties can be assigned using `prop ?= value` or `prop = value` syntax.) 102$(eval # Eliminate spaces around the ?= and = separators.) 103$(foreach name,$(strip $(4)),\ 104 $(eval _temp := $$(call collapse-pairs,$$($(name)),?=))\ 105 $(eval _resolved_$(name) := $$(call collapse-pairs,$$(_temp),=))\ 106) 107 108$(eval # Implement the legacy behavior when BUILD_BROKEN_DUP_SYSPROP is on.) 109$(eval # Optional assignments are all converted to normal assignments and) 110$(eval # when their duplicates the first one wins) 111$(if $(filter true,$(BUILD_BROKEN_DUP_SYSPROP)),\ 112 $(foreach name,$(strip $(4)),\ 113 $(eval _temp := $$(subst ?=,=,$$(_resolved_$(name))))\ 114 $(eval _resolved_$(name) := $$(call uniq-pairs-by-first-component,$$(_resolved_$(name)),=))\ 115 )\ 116 $(eval _option := --allow-dup)\ 117) 118 119$(2): $(POST_PROCESS_PROPS) $(INTERNAL_BUILD_ID_MAKEFILE) $(3) $(6) $(BUILT_KERNEL_VERSION_FILE_FOR_UFFD_GC) 120 $(hide) echo Building $$@ 121 $(hide) mkdir -p $$(dir $$@) 122 $(hide) rm -f $$@ && touch $$@ 123ifneq ($(strip $(7)), true) 124 $(hide) $$(call generate-common-build-props,$(call to-lower,$(strip $(1))),$$@) 125endif 126 # Make and Soong use different intermediate files to build vendor/build.prop. 127 # Although the sysprop contents are same, the absolute paths of android-info.prop are different. 128 # Print the filename for the intermediate files (files in OUT_DIR). 129 # This helps with validating mk->soong migration of android partitions. 130 $(hide) $(foreach file,$(strip $(3)),\ 131 if [ -f "$(file)" ]; then\ 132 echo "" >> $$@;\ 133 echo "####################################" >> $$@;\ 134 $(if $(filter $(OUT_DIR)/%,$(file)), \ 135 echo "# from $(notdir $(file))" >> $$@;\ 136 ,\ 137 echo "# from $(file)" >> $$@;\ 138 )\ 139 echo "####################################" >> $$@;\ 140 cat $(file) >> $$@;\ 141 fi;) 142 $(hide) $(foreach name,$(strip $(4)),\ 143 echo "" >> $$@;\ 144 echo "####################################" >> $$@;\ 145 echo "# from variable $(name)" >> $$@;\ 146 echo "####################################" >> $$@;\ 147 $$(foreach line,$$(_resolved_$(name)),\ 148 echo "$$(line)" >> $$@;\ 149 )\ 150 ) 151 $(hide) $(POST_PROCESS_PROPS) $$(_option) \ 152 --sdk-version $(PLATFORM_SDK_VERSION) \ 153 --kernel-version-file-for-uffd-gc "$(BUILT_KERNEL_VERSION_FILE_FOR_UFFD_GC)" \ 154 $$@ $(5) 155 $(hide) $(foreach file,$(strip $(6)),\ 156 if [ -f "$(file)" ]; then\ 157 cat $(file) >> $$@;\ 158 fi;) 159 $(hide) echo "# end of file" >> $$@ 160 161$(call declare-1p-target,$(2)) 162endef 163 164KNOWN_OEM_THUMBPRINT_PROPERTIES := \ 165 ro.product.brand \ 166 ro.product.name \ 167 ro.product.device 168OEM_THUMBPRINT_PROPERTIES := $(filter $(KNOWN_OEM_THUMBPRINT_PROPERTIES),\ 169 $(PRODUCT_OEM_PROPERTIES)) 170KNOWN_OEM_THUMBPRINT_PROPERTIES:= 171 172# ----------------------------------------------------------------- 173# system/build.prop 174# 175# system/build.prop is built by Soong. See system-build.prop module in 176# build/soong/Android.bp. 177 178INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop 179 180# ----------------------------------------------------------------- 181# vendor/build.prop 182# 183_prop_files_ := $(if $(TARGET_VENDOR_PROP),\ 184 $(TARGET_VENDOR_PROP),\ 185 $(wildcard $(TARGET_DEVICE_DIR)/vendor.prop)) 186 187android_info_prop := $(call intermediates-dir-for,ETC,android_info_prop)/android-info.prop 188$(android_info_prop): $(INSTALLED_ANDROID_INFO_TXT_TARGET) 189 cat $< | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' > $@ 190 191_prop_files_ += $(android_info_prop) 192 193ifdef property_overrides_split_enabled 194# Order matters here. When there are duplicates, the last one wins. 195# TODO(b/117892318): don't allow duplicates so that the ordering doesn't matter 196_prop_vars_ := \ 197 ADDITIONAL_VENDOR_PROPERTIES \ 198 PRODUCT_VENDOR_PROPERTIES 199 200# TODO(b/117892318): deprecate this 201_prop_vars_ += \ 202 PRODUCT_DEFAULT_PROPERTY_OVERRIDES \ 203 PRODUCT_PROPERTY_OVERRIDES 204else 205_prop_vars_ := 206endif 207 208INSTALLED_VENDOR_BUILD_PROP_TARGET := $(TARGET_OUT_VENDOR)/build.prop 209$(eval $(call build-properties,\ 210 vendor,\ 211 $(INSTALLED_VENDOR_BUILD_PROP_TARGET),\ 212 $(_prop_files_),\ 213 $(_prop_vars_),\ 214 $(PRODUCT_VENDOR_PROPERTY_BLACKLIST),\ 215 $(empty),\ 216 $(empty))) 217 218$(eval $(call declare-1p-target,$(INSTALLED_VENDOR_BUILD_PROP_TARGET))) 219 220# ----------------------------------------------------------------- 221# product/etc/build.prop 222# 223# product/etc/build.prop is built by Soong. See product-build.prop module in 224# build/soong/Android.bp. 225 226INSTALLED_PRODUCT_BUILD_PROP_TARGET := $(TARGET_OUT_PRODUCT)/etc/build.prop 227 228# ---------------------------------------------------------------- 229# odm/etc/build.prop 230# 231# odm/etc/build.prop is built by Soong. See odm-build.prop module in 232# build/soong/Android.bp. 233 234INSTALLED_ODM_BUILD_PROP_TARGET := $(TARGET_OUT_ODM)/etc/build.prop 235 236# ---------------------------------------------------------------- 237# vendor_dlkm/etc/build.prop 238# odm_dlkm/etc/build.prop 239# system_dlkm/build.prop 240# These are built by Soong. See build/soong/Android.bp 241 242INSTALLED_VENDOR_DLKM_BUILD_PROP_TARGET := $(TARGET_OUT_VENDOR_DLKM)/etc/build.prop 243INSTALLED_ODM_DLKM_BUILD_PROP_TARGET := $(TARGET_OUT_ODM_DLKM)/etc/build.prop 244INSTALLED_SYSTEM_DLKM_BUILD_PROP_TARGET := $(TARGET_OUT_SYSTEM_DLKM)/etc/build.prop 245ALL_DEFAULT_INSTALLED_MODULES += \ 246 $(INSTALLED_VENDOR_DLKM_BUILD_PROP_TARGET) \ 247 $(INSTALLED_ODM_DLKM_BUILD_PROP_TARGET) \ 248 $(INSTALLED_SYSTEM_DLKM_BUILD_PROP_TARGET) \ 249 250# ----------------------------------------------------------------- 251# system_ext/etc/build.prop 252# 253# system_ext/etc/build.prop is built by Soong. See system-build.prop module in 254# build/soong/Android.bp. 255 256INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET := $(TARGET_OUT_SYSTEM_EXT)/etc/build.prop 257 258RAMDISK_BUILD_PROP_REL_PATH := system/etc/ramdisk/build.prop 259ifeq (true,$(BOARD_USES_RECOVERY_AS_BOOT)) 260INSTALLED_RAMDISK_BUILD_PROP_TARGET := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/$(RAMDISK_BUILD_PROP_REL_PATH) 261else 262INSTALLED_RAMDISK_BUILD_PROP_TARGET := $(TARGET_RAMDISK_OUT)/$(RAMDISK_BUILD_PROP_REL_PATH) 263endif 264 265ALL_INSTALLED_BUILD_PROP_FILES := \ 266 $(INSTALLED_BUILD_PROP_TARGET) \ 267 $(INSTALLED_VENDOR_BUILD_PROP_TARGET) \ 268 $(INSTALLED_PRODUCT_BUILD_PROP_TARGET) \ 269 $(INSTALLED_ODM_BUILD_PROP_TARGET) \ 270 $(INSTALLED_VENDOR_DLKM_BUILD_PROP_TARGET) \ 271 $(INSTALLED_ODM_DLKM_BUILD_PROP_TARGET) \ 272 $(INSTALLED_SYSTEM_DLKM_BUILD_PROP_TARGET) \ 273 $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET) \ 274 $(INSTALLED_RAMDISK_BUILD_PROP_TARGET) 275 276# $1 installed file path, e.g. out/target/product/vsoc_x86_64/system/build.prop 277define is-build-prop 278$(if $(findstring $1,$(ALL_INSTALLED_BUILD_PROP_FILES)),Y) 279endef 280