blob: 9c362f27774e377a8b42ff9939c22da159920b6b [file] [log] [blame]
Anton Hanssonbb76ce82019-02-26 12:34:03 +00001#
2# Copyright (C) 2019 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# ###############################################################
18# This file includes BoardConfig.mk for the device being built,
19# and sanity-checks the variable defined therein.
20# ###############################################################
21
22# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
23# or under vendor/*/$(TARGET_DEVICE). Search in both places, but
24# make sure only one exists.
25# Real boards should always be associated with an OEM vendor.
26ifdef TARGET_DEVICE_DIR
27 ifneq ($(origin TARGET_DEVICE_DIR),command line)
28 $(error TARGET_DEVICE_DIR may not be set manually)
29 endif
30 board_config_mk := $(TARGET_DEVICE_DIR)/BoardConfig.mk
31else
32 board_config_mk := \
33 $(strip $(sort $(wildcard \
34 $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
35 $(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
36 $(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
37 )))
38 ifeq ($(board_config_mk),)
39 $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
40 endif
41 ifneq ($(words $(board_config_mk)),1)
42 $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
43 endif
44 TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
45 .KATI_READONLY := TARGET_DEVICE_DIR
46endif
47include $(board_config_mk)
48ifeq ($(TARGET_ARCH),)
49 $(error TARGET_ARCH not defined by board config: $(board_config_mk))
50endif
51ifneq ($(MALLOC_IMPL),)
52 $(warning *** Unsupported option MALLOC_IMPL defined by board config: $(board_config_mk).)
53 $(error Use `MALLOC_SVELTE := true` to configure jemalloc for low-memory)
54endif
55board_config_mk :=
56
57###########################################
58# Handle BUILD_BROKEN_* settings
59vars := \
60 BUILD_BROKEN_ANDROIDMK_EXPORTS \
61 BUILD_BROKEN_DUP_COPY_HEADERS \
62 BUILD_BROKEN_DUP_RULES \
63 BUILD_BROKEN_PHONY_TARGETS \
64 BUILD_BROKEN_ENG_DEBUG_TAGS
65
66$(foreach var,$(vars),$(eval $(var) := $$(strip $$($(var)))))
67
68$(foreach var,$(vars), \
69 $(if $(filter-out true false,$($(var))), \
70 $(error Valid values of $(var) are "true", "false", and "". Not "$($(var))")))
71
72.KATI_READONLY := $(vars)
73
74ifneq ($(BUILD_BROKEN_ANDROIDMK_EXPORTS),true)
75$(KATI_obsolete_export It is a global setting. See $(CHANGES_URL)#export_keyword)
76endif
77
78###########################################
79# Now we can substitute with the real value of TARGET_COPY_OUT_RAMDISK
80ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
81TARGET_COPY_OUT_RAMDISK := $(TARGET_COPY_OUT_ROOT)
82endif
83
84###########################################
85# Configure whether we're building the system image
86BUILDING_SYSTEM_IMAGE := true
87ifeq ($(PRODUCT_BUILD_SYSTEM_IMAGE),)
88 ifndef PRODUCT_USE_DYNAMIC_PARTITION_SIZE
89 ifndef BOARD_SYSTEMIMAGE_PARTITION_SIZE
90 BUILDING_SYSTEM_IMAGE :=
91 endif
92 endif
93else ifeq ($(PRODUCT_BUILD_SYSTEM_IMAGE),false)
94 BUILDING_SYSTEM_IMAGE :=
95endif
96.KATI_READONLY := BUILDING_SYSTEM_IMAGE
97
98# Are we building a system_other image
99BUILDING_SYSTEM_OTHER_IMAGE :=
100ifeq ($(PRODUCT_BUILD_SYSTEM_OTHER_IMAGE),)
101 ifdef BUILDING_SYSTEM_IMAGE
102 ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
103 BUILDING_SYSTEM_OTHER_IMAGE := true
104 endif
105 endif
106else ifeq ($(PRODUCT_BUILD_SYSTEM_OTHER_IMAGE),true)
107 BUILDING_SYSTEM_OTHER_IMAGE := true
108 ifndef BUILDING_SYSTEM_IMAGE
109 $(error PRODUCT_BUILD_SYSTEM_OTHER_IMAGE = true requires building the system image)
110 endif
111endif
112.KATI_READONLY := BUILDING_SYSTEM_OTHER_IMAGE
113
114# Are we building a cache image
115BUILDING_CACHE_IMAGE :=
116ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),)
117 ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
118 BUILDING_CACHE_IMAGE := true
119 endif
120else ifeq ($(PRODUCT_BUILD_CACHE_IMAGE),true)
121 BUILDING_CACHE_IMAGE := true
122 ifndef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
123 $(error PRODUCT_BUILD_CACHE_IMAGE set to true, but BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE not defined)
124 endif
125endif
126.KATI_READONLY := BUILDING_CACHE_IMAGE
127
128# TODO: Add BUILDING_BOOT_IMAGE / BUILDING_RECOVERY_IMAGE
129# This gets complicated with BOARD_USES_RECOVERY_AS_BOOT, so skipping for now.
130
131# Are we building a ramdisk image
132BUILDING_RAMDISK_IMAGE := true
133ifeq ($(PRODUCT_BUILD_RAMDISK_IMAGE),)
134 # TODO: Be smarter about this. This probably only needs to happen when one of the follow is true:
135 # BUILDING_BOOT_IMAGE
136 # BUILDING_RECOVERY_IMAGE
137else ifeq ($(PRODUCT_BUILD_RAMDISK_IMAGE),false)
138 BUILDING_RAMDISK_IMAGE :=
139endif
140.KATI_READONLY := BUILDING_RAMDISK_IMAGE
141
142# Are we building a userdata image
143BUILDING_USERDATA_IMAGE :=
144ifeq ($(PRODUCT_BUILD_USERDATA_IMAGE),)
145 ifdef BOARD_USERDATAIMAGE_PARTITION_SIZE
146 BUILDING_USERDATA_IMAGE := true
147 endif
148else ifeq ($(PRODUCT_BUILD_USERDATA_IMAGE),true)
149 BUILDING_USERDATA_IMAGE := true
150endif
151.KATI_READONLY := BUILDING_USERDATA_IMAGE
152
153###########################################
154# Now we can substitute with the real value of TARGET_COPY_OUT_VENDOR
155ifeq ($(TARGET_COPY_OUT_VENDOR),$(_vendor_path_placeholder))
156 TARGET_COPY_OUT_VENDOR := system/vendor
157else ifeq ($(filter vendor system/vendor,$(TARGET_COPY_OUT_VENDOR)),)
158 $(error TARGET_COPY_OUT_VENDOR must be either 'vendor' or 'system/vendor', seeing '$(TARGET_COPY_OUT_VENDOR)'.)
159endif
160PRODUCT_COPY_FILES := $(subst $(_vendor_path_placeholder),$(TARGET_COPY_OUT_VENDOR),$(PRODUCT_COPY_FILES))
161
162BOARD_USES_VENDORIMAGE :=
163ifdef BOARD_PREBUILT_VENDORIMAGE
164 BOARD_USES_VENDORIMAGE := true
165endif
166ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
167 BOARD_USES_VENDORIMAGE := true
168endif
169ifeq ($(TARGET_COPY_OUT_VENDOR),vendor)
170 BOARD_USES_VENDORIMAGE := true
171else ifdef BOARD_USES_VENDORIMAGE
172 $(error TARGET_COPY_OUT_VENDOR must be set to 'vendor' to use a vendor image)
173endif
174.KATI_READONLY := BOARD_USES_VENDORIMAGE
175
176BUILDING_VENDOR_IMAGE :=
177ifeq ($(PRODUCT_BUILD_VENDOR_IMAGE),)
178 ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
179 BUILDING_VENDOR_IMAGE := true
180 endif
181else ifeq ($(PRODUCT_BUILD_VENDOR_IMAGE),true)
182 BUILDING_VENDOR_IMAGE := true
183 ifndef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
184 $(error PRODUCT_BUILD_VENDOR_IMAGE set to true, but BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE not defined)
185 endif
186endif
187ifdef BOARD_PREBUILT_VENDORIMAGE
188 BUILDING_VENDOR_IMAGE :=
189endif
190.KATI_READONLY := BUILDING_VENDOR_IMAGE
191
192###########################################
193# Now we can substitute with the real value of TARGET_COPY_OUT_PRODUCT
194ifeq ($(TARGET_COPY_OUT_PRODUCT),$(_product_path_placeholder))
195TARGET_COPY_OUT_PRODUCT := system/product
196else ifeq ($(filter product system/product,$(TARGET_COPY_OUT_PRODUCT)),)
197$(error TARGET_COPY_OUT_PRODUCT must be either 'product' or 'system/product', seeing '$(TARGET_COPY_OUT_PRODUCT)'.)
198endif
199PRODUCT_COPY_FILES := $(subst $(_product_path_placeholder),$(TARGET_COPY_OUT_PRODUCT),$(PRODUCT_COPY_FILES))
200
201BOARD_USES_PRODUCTIMAGE :=
202ifdef BOARD_PREBUILT_PRODUCTIMAGE
203 BOARD_USES_PRODUCTIMAGE := true
204endif
205ifdef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
206 BOARD_USES_PRODUCTIMAGE := true
207endif
208ifeq ($(TARGET_COPY_OUT_PRODUCT),product)
209 BOARD_USES_PRODUCTIMAGE := true
210else ifdef BOARD_USES_PRODUCTIMAGE
211 $(error TARGET_COPY_OUT_PRODUCT must be set to 'product' to use a product image)
212endif
213.KATI_READONLY := BOARD_USES_PRODUCTIMAGE
214
215BUILDING_PRODUCT_IMAGE :=
216ifeq ($(PRODUCT_BUILD_PRODUCT_IMAGE),)
217 ifdef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
218 BUILDING_PRODUCT_IMAGE := true
219 endif
220else ifeq ($(PRODUCT_BUILD_PRODUCT_IMAGE),true)
221 BUILDING_PRODUCT_IMAGE := true
222 ifndef BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
223 $(error PRODUCT_BUILD_PRODUCT_IMAGE set to true, but BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE not defined)
224 endif
225endif
226ifdef BOARD_PREBUILT_PRODUCTIMAGE
227 BUILDING_PRODUCT_IMAGE :=
228endif
229.KATI_READONLY := BUILDING_PRODUCT_IMAGE
230
231###########################################
232# Now we can substitute with the real value of TARGET_COPY_OUT_PRODUCT_SERVICES
233MERGE_PRODUCT_SERVICES_INTO_PRODUCT :=
234ifeq ($(TARGET_COPY_OUT_PRODUCT_SERVICES),$(_product_services_path_placeholder))
235 TARGET_COPY_OUT_PRODUCT_SERVICES := $(TARGET_COPY_OUT_PRODUCT)
236 MERGE_PRODUCT_SERVICES_INTO_PRODUCT := true
237else ifeq ($(TARGET_COPY_OUT_PRODUCT),$(TARGET_COPY_OUT_PRODUCT_SERVICES))
238 MERGE_PRODUCT_SERVICES_INTO_PRODUCT := true
239else ifeq ($(filter product_services system/product_services,$(TARGET_COPY_OUT_PRODUCT_SERVICES)),)
240 $(error TARGET_COPY_OUT_PRODUCT_SERVICES must be either 'product_services',\
241 '$(TARGET_COPY_OUT_PRODUCT)' or 'system/product_services', seeing '$(TARGET_COPY_OUT_PRODUCT_SERVICES)'.)
242endif
243.KATI_READONLY := MERGE_PRODUCT_SERVICES_INTO_PRODUCT
244PRODUCT_COPY_FILES := $(subst $(_product_services_path_placeholder),$(TARGET_COPY_OUT_PRODUCT_SERVICES),$(PRODUCT_COPY_FILES))
245
246BOARD_USES_PRODUCT_SERVICESIMAGE :=
247ifdef BOARD_PREBUILT_PRODUCT_SERVICESIMAGE
248 BOARD_USES_PRODUCT_SERVICESIMAGE := true
249endif
250ifdef BOARD_PRODUCT_SERVICESIMAGE_FILE_SYSTEM_TYPE
251 BOARD_USES_PRODUCT_SERVICESIMAGE := true
252endif
253ifeq ($(TARGET_COPY_OUT_PRODUCT_SERVICES),product_services)
254 BOARD_USES_PRODUCT_SERVICESIMAGE := true
255else ifdef BOARD_USES_PRODUCT_SERVICESIMAGE
256 $(error TARGET_COPY_OUT_PRODUCT_SERVICES must be set to 'product_services' to use a product_services image)
257endif
258
259BUILDING_PRODUCT_SERVICES_IMAGE :=
260ifeq ($(PRODUCT_BUILD_PRODUCT_SERVICES_IMAGE),)
261 ifdef BOARD_PRODUCT_SERVICESIMAGE_FILE_SYSTEM_TYPE
262 BUILDING_PRODUCT_SERVICES_IMAGE := true
263 endif
264else ifeq ($(PRODUCT_BUILD_PRODUCT_SERVICES_IMAGE),true)
265 BUILDING_PRODUCT_SERVICES_IMAGE := true
266 ifndef BOARD_PRODUCT_SERVICESIMAGE_FILE_SYSTEM_TYPE
267 $(error PRODUCT_BUILD_PRODUCT_SERVICES_IMAGE set to true, but BOARD_PRODUCT_SERVICESIMAGE_FILE_SYSTEM_TYPE not defined)
268 endif
269endif
270ifdef BOARD_PREBUILT_PRODUCT_SERVICESIMAGE
271 BUILDING_PRODUCT_SERVICES_IMAGE :=
272endif
273.KATI_READONLY := BUILDING_PRODUCT_SERVICES_IMAGE
274
275###########################################
276# Now we can substitute with the real value of TARGET_COPY_OUT_ODM
277ifeq ($(TARGET_COPY_OUT_ODM),$(_odm_path_placeholder))
278 TARGET_COPY_OUT_ODM := vendor/odm
279else ifeq ($(filter odm vendor/odm,$(TARGET_COPY_OUT_ODM)),)
280 $(error TARGET_COPY_OUT_ODM must be either 'odm' or 'vendor/odm', seeing '$(TARGET_COPY_OUT_ODM)'.)
281endif
282PRODUCT_COPY_FILES := $(subst $(_odm_path_placeholder),$(TARGET_COPY_OUT_ODM),$(PRODUCT_COPY_FILES))
283
284BOARD_USES_ODMIMAGE :=
285ifdef BOARD_PREBUILT_ODMIMAGE
286 BOARD_USES_ODMIMAGE := true
287endif
288ifdef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
289 BOARD_USES_ODMIMAGE := true
290endif
291ifeq ($(TARGET_COPY_OUT_ODM),odm)
292 BOARD_USES_ODMIMAGE := true
293else ifdef BOARD_USES_ODMIMAGE
294 $(error TARGET_COPY_OUT_ODM must be set to 'odm' to use an odm image)
295endif
296
297BUILDING_ODM_IMAGE :=
298ifeq ($(ODM_BUILD_ODM_IMAGE),)
299 ifdef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
300 BUILDING_ODM_IMAGE := true
301 endif
302else ifeq ($(PRODUCT_BUILD_ODM_IMAGE),true)
303 BUILDING_ODM_IMAGE := true
304 ifndef BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
305 $(error PRODUCT_BUILD_ODM_IMAGE set to true, but BOARD_ODMIMAGE_FILE_SYSTEM_TYPE not defined)
306 endif
307endif
308ifdef BOARD_PREBUILT_ODMIMAGE
309 BUILDING_ODM_IMAGE :=
310endif
311.KATI_READONLY := BUILDING_ODM_IMAGE
312
313###########################################
314# Ensure that only TARGET_RECOVERY_UPDATER_LIBS *or* AB_OTA_UPDATER is set.
315TARGET_RECOVERY_UPDATER_LIBS ?=
316AB_OTA_UPDATER ?=
317.KATI_READONLY := TARGET_RECOVERY_UPDATER_LIBS AB_OTA_UPDATER
318ifeq ($(AB_OTA_UPDATER),true)
319 ifneq ($(strip $(TARGET_RECOVERY_UPDATER_LIBS)),)
320 $(error Do not use TARGET_RECOVERY_UPDATER_LIBS when using AB_OTA_UPDATER)
321 endif
322endif
323
324# Check BOARD_VNDK_VERSION
325define check_vndk_version
326 $(eval vndk_path := prebuilts/vndk/v$(1)) \
327 $(if $(wildcard $(vndk_path)/*/Android.bp),,$(error VNDK version $(1) not found))
328endef
329
330ifdef BOARD_VNDK_VERSION
331 ifneq ($(BOARD_VNDK_VERSION),current)
332 $(error BOARD_VNDK_VERSION: Only "current" is implemented)
333 endif
334
335 TARGET_VENDOR_TEST_SUFFIX := /vendor
336else
337 TARGET_VENDOR_TEST_SUFFIX :=
338endif
339
340ifeq (,$(TARGET_BUILD_APPS))
341ifdef PRODUCT_EXTRA_VNDK_VERSIONS
342 $(foreach v,$(PRODUCT_EXTRA_VNDK_VERSIONS),$(call check_vndk_version,$(v)))
343endif
344endif
345
346# Ensure that BOARD_SYSTEMSDK_VERSIONS are all within PLATFORM_SYSTEMSDK_VERSIONS
347_unsupported_systemsdk_versions := $(filter-out $(PLATFORM_SYSTEMSDK_VERSIONS),$(BOARD_SYSTEMSDK_VERSIONS))
348ifneq (,$(_unsupported_systemsdk_versions))
349 $(error System SDK versions '$(_unsupported_systemsdk_versions)' in BOARD_SYSTEMSDK_VERSIONS are not supported.\
350 Supported versions are $(PLATFORM_SYSTEMSDK_VERSIONS))
351endif