4a9677b0d85c424079eb5298b42895b8a3cad1dc
[project/bcm63xx/atf.git] / make_helpers / build_macros.mk
1 #
2 # Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
3 #
4 # SPDX-License-Identifier: BSD-3-Clause
5 #
6
7 # Report an error if the eval make function is not available.
8 $(eval eval_available := T)
9 ifneq (${eval_available},T)
10 $(error This makefile only works with a Make program that supports $$(eval))
11 endif
12
13 # Some utility macros for manipulating awkward (whitespace) characters.
14 blank :=
15 space :=${blank} ${blank}
16
17 # A user defined function to recursively search for a filename below a directory
18 # $1 is the directory root of the recursive search (blank for current directory).
19 # $2 is the file name to search for.
20 define rwildcard
21 $(strip $(foreach d,$(wildcard ${1}*),$(call rwildcard,${d}/,${2}) $(filter $(subst *,%,%${2}),${d})))
22 endef
23
24 # This table is used in converting lower case to upper case.
25 uppercase_table:=a,A b,B c,C d,D e,E f,F g,G h,H i,I j,J k,K l,L m,M n,N o,O p,P q,Q r,R s,S t,T u,U v,V w,W x,X y,Y z,Z
26
27 # Internal macro used for converting lower case to upper case.
28 # $(1) = upper case table
29 # $(2) = String to convert
30 define uppercase_internal
31 $(if $(1),$$(subst $(firstword $(1)),$(call uppercase_internal,$(wordlist 2,$(words $(1)),$(1)),$(2))),$(2))
32 endef
33
34 # A macro for converting a string to upper case
35 # $(1) = String to convert
36 define uppercase
37 $(eval uppercase_result:=$(call uppercase_internal,$(uppercase_table),$(1)))$(uppercase_result)
38 endef
39
40 # Convenience function for adding build definitions
41 # $(eval $(call add_define,FOO)) will have:
42 # -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise
43 define add_define
44 DEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
45 endef
46
47 # Convenience function for adding build definitions
48 # $(eval $(call add_define_val,FOO,BAR)) will have:
49 # -DFOO=BAR
50 define add_define_val
51 DEFINES += -D$(1)=$(2)
52 endef
53
54 # Convenience function for verifying option has a boolean value
55 # $(eval $(call assert_boolean,FOO)) will assert FOO is 0 or 1
56 define assert_boolean
57 $(if $(filter-out 0 1,$($1)),$(error $1 must be boolean))
58 endef
59
60 0-9 := 0 1 2 3 4 5 6 7 8 9
61
62 # Function to verify that a given option $(1) contains a numeric value
63 define assert_numeric
64 $(if $($(1)),,$(error $(1) must not be empty))
65 $(eval __numeric := $($(1)))
66 $(foreach d,$(0-9),$(eval __numeric := $(subst $(d),,$(__numeric))))
67 $(if $(__numeric),$(error $(1) must be numeric))
68 endef
69
70 # IMG_LINKERFILE defines the linker script corresponding to a BL stage
71 # $(1) = BL stage (2, 30, 31, 32, 33)
72 define IMG_LINKERFILE
73 ${BUILD_DIR}/bl$(1).ld
74 endef
75
76 # IMG_MAPFILE defines the output file describing the memory map corresponding
77 # to a BL stage
78 # $(1) = BL stage (2, 30, 31, 32, 33)
79 define IMG_MAPFILE
80 ${BUILD_DIR}/bl$(1).map
81 endef
82
83 # IMG_ELF defines the elf file corresponding to a BL stage
84 # $(1) = BL stage (2, 30, 31, 32, 33)
85 define IMG_ELF
86 ${BUILD_DIR}/bl$(1).elf
87 endef
88
89 # IMG_DUMP defines the symbols dump file corresponding to a BL stage
90 # $(1) = BL stage (2, 30, 31, 32, 33)
91 define IMG_DUMP
92 ${BUILD_DIR}/bl$(1).dump
93 endef
94
95 # IMG_BIN defines the default image file corresponding to a BL stage
96 # $(1) = BL stage (2, 30, 31, 32, 33)
97 define IMG_BIN
98 ${BUILD_PLAT}/bl$(1).bin
99 endef
100
101 # TOOL_ADD_PAYLOAD appends the command line arguments required by fiptool to
102 # package a new payload and/or by cert_create to generate certificate.
103 # Optionally, it adds the dependency on this payload
104 # $(1) = payload filename (i.e. bl31.bin)
105 # $(2) = command line option for the specified payload (i.e. --soc-fw)
106 # $(3) = tool target dependency (optional) (ex. build/fvp/release/bl31.bin)
107 # $(4) = FIP prefix (optional) (if FWU_, target is fwu_fip instead of fip)
108 define TOOL_ADD_PAYLOAD
109 $(4)FIP_ARGS += $(2) $(1)
110 $(if $(3),$(4)FIP_DEPS += $(3))
111 $(4)CRT_ARGS += $(2) $(1)
112 $(if $(3),$(4)CRT_DEPS += $(3))
113 endef
114
115 # TOOL_ADD_IMG_PAYLOAD works like TOOL_ADD_PAYLOAD, but applies image filters
116 # before passing them to host tools if BL*_PRE_TOOL_FILTER is defined.
117 # $(1) = image_type (scp_bl2, bl33, etc.)
118 # $(2) = payload filepath (ex. build/fvp/release/bl31.bin)
119 # $(3) = command line option for the specified payload (ex. --soc-fw)
120 # $(4) = tool target dependency (optional) (ex. build/fvp/release/bl31.bin)
121 # $(5) = FIP prefix (optional) (if FWU_, target is fwu_fip instead of fip)
122
123 define TOOL_ADD_IMG_PAYLOAD
124
125 $(eval PRE_TOOL_FILTER := $($(call uppercase,$(1))_PRE_TOOL_FILTER))
126
127 ifneq ($(PRE_TOOL_FILTER),)
128
129 $(eval PROCESSED_PATH := $(BUILD_PLAT)/$(1).bin$($(PRE_TOOL_FILTER)_SUFFIX))
130
131 $(call $(PRE_TOOL_FILTER)_RULE,$(PROCESSED_PATH),$(2))
132
133 $(PROCESSED_PATH): $(4)
134
135 $(call TOOL_ADD_PAYLOAD,$(PROCESSED_PATH),$(3),$(PROCESSED_PATH),$(5))
136
137 else
138 $(call TOOL_ADD_PAYLOAD,$(2),$(3),$(4),$(5))
139 endif
140 endef
141
142 # CERT_ADD_CMD_OPT adds a new command line option to the cert_create invocation
143 # $(1) = parameter filename
144 # $(2) = cert_create command line option for the specified parameter
145 # $(3) = FIP prefix (optional) (if FWU_, target is fwu_fip instead of fip)
146 define CERT_ADD_CMD_OPT
147 $(3)CRT_ARGS += $(2) $(1)
148 endef
149
150 # TOOL_ADD_IMG allows the platform to specify an external image to be packed
151 # in the FIP and/or for which certificate is generated. It also adds a
152 # dependency on the image file, aborting the build if the file does not exist.
153 # $(1) = image_type (scp_bl2, bl33, etc.)
154 # $(2) = command line option for fiptool (--scp-fw, --nt-fw, etc)
155 # $(3) = FIP prefix (optional) (if FWU_, target is fwu_fip instead of fip)
156 # Example:
157 # $(eval $(call TOOL_ADD_IMG,bl33,--nt-fw))
158 define TOOL_ADD_IMG
159 # Build option to specify the image filename (SCP_BL2, BL33, etc)
160 # This is the uppercase form of the first parameter
161 $(eval _V := $(call uppercase,$(1)))
162
163 $(3)CRT_DEPS += check_$(1)
164 $(3)FIP_DEPS += check_$(1)
165 $(call TOOL_ADD_IMG_PAYLOAD,$(1),$(value $(_V)),$(2),,$(3))
166
167 .PHONY: check_$(1)
168 check_$(1):
169 $$(if $(value $(_V)),,$$(error "Platform '${PLAT}' requires $(_V). Please set $(_V) to point to the right file"))
170 $$(if $(wildcard $(value $(_V))),,$$(error '$(_V)=$(value $(_V))' was specified, but '$(value $(_V))' does not exist))
171 endef
172
173 ################################################################################
174 # Generic image processing filters
175 ################################################################################
176
177 # GZIP
178 define GZIP_RULE
179 $(1): $(2)
180 $(ECHO) " GZIP $$@"
181 $(Q)gzip -n -f -9 $$< --stdout > $$@
182 endef
183
184 GZIP_SUFFIX := .gz
185
186 ################################################################################
187 # Auxiliary macros to build TF images from sources
188 ################################################################################
189
190 MAKE_DEP = -Wp,-MD,$(DEP) -MT $$@ -MP
191
192
193 # MAKE_C_LIB builds a C source file and generates the dependency file
194 # $(1) = output directory
195 # $(2) = source file (%.c)
196 # $(3) = library name
197 define MAKE_C_LIB
198 $(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2))))
199 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
200
201 $(OBJ): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | lib$(3)_dirs
202 $$(ECHO) " CC $$<"
203 $$(Q)$$(CC) $$(TF_CFLAGS) $$(CFLAGS) $(MAKE_DEP) -c $$< -o $$@
204
205 -include $(DEP)
206
207 endef
208
209 # MAKE_S_LIB builds an assembly source file and generates the dependency file
210 # $(1) = output directory
211 # $(2) = source file (%.S)
212 # $(3) = library name
213 define MAKE_S_LIB
214 $(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2))))
215 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
216
217 $(OBJ): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | lib$(3)_dirs
218 $$(ECHO) " AS $$<"
219 $$(Q)$$(AS) $$(ASFLAGS) $(MAKE_DEP) -c $$< -o $$@
220
221 -include $(DEP)
222
223 endef
224
225
226 # MAKE_C builds a C source file and generates the dependency file
227 # $(1) = output directory
228 # $(2) = source file (%.c)
229 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
230 define MAKE_C
231
232 $(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2))))
233 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
234 $(eval IMAGE := IMAGE_BL$(call uppercase,$(3)))
235 $(eval BL_CFLAGS := $(BL$(call uppercase,$(3))_CFLAGS))
236
237 $(OBJ): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | bl$(3)_dirs
238 $$(ECHO) " CC $$<"
239 $$(Q)$$(CC) $$(TF_CFLAGS) $$(CFLAGS) $(BL_CFLAGS) -D$(IMAGE) $(MAKE_DEP) -c $$< -o $$@
240
241 -include $(DEP)
242
243 endef
244
245
246 # MAKE_S builds an assembly source file and generates the dependency file
247 # $(1) = output directory
248 # $(2) = assembly file (%.S)
249 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
250 define MAKE_S
251
252 $(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2))))
253 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
254 $(eval IMAGE := IMAGE_BL$(call uppercase,$(3)))
255
256 $(OBJ): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | bl$(3)_dirs
257 $$(ECHO) " AS $$<"
258 $$(Q)$$(AS) $$(ASFLAGS) -D$(IMAGE) $(MAKE_DEP) -c $$< -o $$@
259
260 -include $(DEP)
261
262 endef
263
264
265 # MAKE_LD generate the linker script using the C preprocessor
266 # $(1) = output linker script
267 # $(2) = input template
268 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
269 define MAKE_LD
270
271 $(eval DEP := $(1).d)
272 $(eval IMAGE := IMAGE_BL$(call uppercase,$(3)))
273
274 $(1): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | bl$(3)_dirs
275 $$(ECHO) " PP $$<"
276 $$(Q)$$(CPP) $$(CPPFLAGS) -P -x assembler-with-cpp -D__LINKER__ $(MAKE_DEP) -D$(IMAGE) -o $$@ $$<
277
278 -include $(DEP)
279
280 endef
281
282 # MAKE_LIB_OBJS builds both C and assembly source files
283 # $(1) = output directory
284 # $(2) = list of source files
285 # $(3) = name of the library
286 define MAKE_LIB_OBJS
287 $(eval C_OBJS := $(filter %.c,$(2)))
288 $(eval REMAIN := $(filter-out %.c,$(2)))
289 $(eval $(foreach obj,$(C_OBJS),$(call MAKE_C_LIB,$(1),$(obj),$(3))))
290
291 $(eval S_OBJS := $(filter %.S,$(REMAIN)))
292 $(eval REMAIN := $(filter-out %.S,$(REMAIN)))
293 $(eval $(foreach obj,$(S_OBJS),$(call MAKE_S_LIB,$(1),$(obj),$(3))))
294
295 $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN)))
296 endef
297
298
299 # MAKE_OBJS builds both C and assembly source files
300 # $(1) = output directory
301 # $(2) = list of source files (both C and assembly)
302 # $(3) = BL stage (2, 30, 31, 32, 33)
303 define MAKE_OBJS
304 $(eval C_OBJS := $(filter %.c,$(2)))
305 $(eval REMAIN := $(filter-out %.c,$(2)))
306 $(eval $(foreach obj,$(C_OBJS),$(call MAKE_C,$(1),$(obj),$(3))))
307
308 $(eval S_OBJS := $(filter %.S,$(REMAIN)))
309 $(eval REMAIN := $(filter-out %.S,$(REMAIN)))
310 $(eval $(foreach obj,$(S_OBJS),$(call MAKE_S,$(1),$(obj),$(3))))
311
312 $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN)))
313 endef
314
315
316 # NOTE: The line continuation '\' is required in the next define otherwise we
317 # end up with a line-feed characer at the end of the last c filename.
318 # Also bear this issue in mind if extending the list of supported filetypes.
319 define SOURCES_TO_OBJS
320 $(notdir $(patsubst %.c,%.o,$(filter %.c,$(1)))) \
321 $(notdir $(patsubst %.S,%.o,$(filter %.S,$(1))))
322 endef
323
324 # Allow overriding the timestamp, for example for reproducible builds, or to
325 # synchronize timestamps across multiple projects.
326 # This must be set to a C string (including quotes where applicable).
327 BUILD_MESSAGE_TIMESTAMP ?= __TIME__", "__DATE__
328
329 .PHONY: libraries
330
331 # MAKE_LIB_DIRS macro defines the target for the directory where
332 # libraries are created
333 define MAKE_LIB_DIRS
334 $(eval LIB_DIR := ${BUILD_PLAT}/lib)
335 $(eval ROMLIB_DIR := ${BUILD_PLAT}/romlib)
336 $(eval LIBWRAPPER_DIR := ${BUILD_PLAT}/libwrapper)
337 $(eval $(call MAKE_PREREQ_DIR,${LIB_DIR},${BUILD_PLAT}))
338 $(eval $(call MAKE_PREREQ_DIR,${ROMLIB_DIR},${BUILD_PLAT}))
339 $(eval $(call MAKE_PREREQ_DIR,${LIBWRAPPER_DIR},${BUILD_PLAT}))
340 endef
341
342 # MAKE_LIB macro defines the targets and options to build each BL image.
343 # Arguments:
344 # $(1) = Library name
345 define MAKE_LIB
346 $(eval BUILD_DIR := ${BUILD_PLAT}/lib$(1))
347 $(eval LIB_DIR := ${BUILD_PLAT}/lib)
348 $(eval ROMLIB_DIR := ${BUILD_PLAT}/romlib)
349 $(eval SOURCES := $(LIB$(call uppercase,$(1))_SRCS))
350 $(eval OBJS := $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
351
352 $(eval $(call MAKE_PREREQ_DIR,${BUILD_DIR},${BUILD_PLAT}))
353 $(eval $(call MAKE_LIB_OBJS,$(BUILD_DIR),$(SOURCES),$(1)))
354
355 .PHONY : lib${1}_dirs
356 lib${1}_dirs: | ${BUILD_DIR} ${LIB_DIR} ${ROMLIB_DIR} ${LIBWRAPPER_DIR}
357 libraries: ${LIB_DIR}/lib$(1).a
358 ifneq ($(findstring armlink,$(notdir $(LD))),)
359 LDPATHS = --userlibpath=${LIB_DIR}
360 LDLIBS += --library=$(1)
361 else
362 LDPATHS = -L${LIB_DIR}
363 LDLIBS += -l$(1)
364 endif
365
366 ifeq ($(USE_ROMLIB),1)
367 LIBWRAPPER = -lwrappers
368 endif
369
370 all: ${LIB_DIR}/lib$(1).a
371
372 ${LIB_DIR}/lib$(1).a: $(OBJS)
373 $$(ECHO) " AR $$@"
374 $$(Q)$$(AR) cr $$@ $$?
375 endef
376
377 # MAKE_BL macro defines the targets and options to build each BL image.
378 # Arguments:
379 # $(1) = BL stage (2, 2u, 30, 31, 32, 33)
380 # $(2) = FIP command line option (if empty, image will not be included in the FIP)
381 # $(3) = FIP prefix (optional) (if FWU_, target is fwu_fip instead of fip)
382 define MAKE_BL
383 $(eval BUILD_DIR := ${BUILD_PLAT}/bl$(1))
384 $(eval BL_SOURCES := $(BL$(call uppercase,$(1))_SOURCES))
385 $(eval SOURCES := $(BL_SOURCES) $(BL_COMMON_SOURCES) $(PLAT_BL_COMMON_SOURCES))
386 $(eval OBJS := $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
387 $(eval LINKERFILE := $(call IMG_LINKERFILE,$(1)))
388 $(eval MAPFILE := $(call IMG_MAPFILE,$(1)))
389 $(eval ELF := $(call IMG_ELF,$(1)))
390 $(eval DUMP := $(call IMG_DUMP,$(1)))
391 $(eval BIN := $(call IMG_BIN,$(1)))
392 $(eval BL_LINKERFILE := $(BL$(call uppercase,$(1))_LINKERFILE))
393 $(eval BL_LIBS := $(BL$(call uppercase,$(1))_LIBS))
394 # We use sort only to get a list of unique object directory names.
395 # ordering is not relevant but sort removes duplicates.
396 $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS} ${LINKERFILE})))
397 # The $(dir ) function leaves a trailing / on the directory names
398 # Rip off the / to match directory names with make rule targets.
399 $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS)))
400
401 # Create generators for object directory structure
402
403 $(eval $(call MAKE_PREREQ_DIR,${BUILD_DIR},${BUILD_PLAT}))
404
405 $(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
406
407 .PHONY : bl${1}_dirs
408
409 # We use order-only prerequisites to ensure that directories are created,
410 # but do not cause re-builds every time a file is written.
411 bl${1}_dirs: | ${OBJ_DIRS}
412
413 $(eval $(call MAKE_OBJS,$(BUILD_DIR),$(SOURCES),$(1)))
414 $(eval $(call MAKE_LD,$(LINKERFILE),$(BL_LINKERFILE),$(1)))
415
416 ifeq ($(USE_ROMLIB),1)
417 $(ELF): romlib.bin
418 endif
419
420 $(ELF): $(OBJS) $(LINKERFILE) | bl$(1)_dirs libraries $(BL_LIBS)
421 $$(ECHO) " LD $$@"
422 ifdef MAKE_BUILD_STRINGS
423 $(call MAKE_BUILD_STRINGS, $(BUILD_DIR)/build_message.o)
424 else
425 @echo 'const char build_message[] = "Built : "$(BUILD_MESSAGE_TIMESTAMP); \
426 const char version_string[] = "${VERSION_STRING}";' | \
427 $$(CC) $$(TF_CFLAGS) $$(CFLAGS) -xc -c - -o $(BUILD_DIR)/build_message.o
428 endif
429 ifneq ($(findstring armlink,$(notdir $(LD))),)
430 $$(Q)$$(LD) -o $$@ $$(TF_LDFLAGS) $$(LDFLAGS) --entry=bl${1}_entrypoint \
431 --predefine="-D__LINKER__=$(__LINKER__)" \
432 --predefine="-DTF_CFLAGS=$(TF_CFLAGS)" \
433 --map --list="$(MAPFILE)" --scatter=${PLAT_DIR}/scat/bl${1}.scat \
434 $(LDPATHS) $(LIBWRAPPER) $(LDLIBS) $(BL_LIBS) \
435 $(BUILD_DIR)/build_message.o $(OBJS)
436 else
437 $$(Q)$$(LD) -o $$@ $$(TF_LDFLAGS) $$(LDFLAGS) -Map=$(MAPFILE) \
438 --script $(LINKERFILE) $(BUILD_DIR)/build_message.o \
439 $(OBJS) $(LDPATHS) $(LIBWRAPPER) $(LDLIBS) $(BL_LIBS)
440 endif
441 ifeq ($(DISABLE_BIN_GENERATION),1)
442 @${ECHO_BLANK_LINE}
443 @echo "Built $$@ successfully"
444 @${ECHO_BLANK_LINE}
445 endif
446
447 $(DUMP): $(ELF)
448 $${ECHO} " OD $$@"
449 $${Q}$${OD} -dx $$< > $$@
450
451 $(BIN): $(ELF)
452 $${ECHO} " BIN $$@"
453 $$(Q)$$(OC) -O binary $$< $$@
454 @${ECHO_BLANK_LINE}
455 @echo "Built $$@ successfully"
456 @${ECHO_BLANK_LINE}
457
458 .PHONY: bl$(1)
459 ifeq ($(DISABLE_BIN_GENERATION),1)
460 bl$(1): $(ELF) $(DUMP)
461 else
462 bl$(1): $(BIN) $(DUMP)
463 endif
464
465 all: bl$(1)
466
467 $(if $(2),$(call TOOL_ADD_IMG_PAYLOAD,bl$(1),$(BIN),--$(2),$(BIN),$(3)))
468
469 endef
470
471 # Convert device tree source file names to matching blobs
472 # $(1) = input dts
473 define SOURCES_TO_DTBS
474 $(notdir $(patsubst %.dts,%.dtb,$(filter %.dts,$(1))))
475 endef
476
477 # MAKE_FDT_DIRS macro creates the prerequisite directories that host the
478 # FDT binaries
479 # $(1) = output directory
480 # $(2) = input dts
481 define MAKE_FDT_DIRS
482 $(eval DTBS := $(addprefix $(1)/,$(call SOURCES_TO_DTBS,$(2))))
483 $(eval TEMP_DTB_DIRS := $(sort $(dir ${DTBS})))
484 # The $(dir ) function leaves a trailing / on the directory names
485 # Rip off the / to match directory names with make rule targets.
486 $(eval DTB_DIRS := $(patsubst %/,%,$(TEMP_DTB_DIRS)))
487
488 $(eval $(foreach objd,${DTB_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
489
490 fdt_dirs: ${DTB_DIRS}
491 endef
492
493 # MAKE_DTB generate the Flattened device tree binary
494 # $(1) = output directory
495 # $(2) = input dts
496 define MAKE_DTB
497
498 # List of DTB file(s) to generate, based on DTS file basename list
499 $(eval DOBJ := $(addprefix $(1)/,$(call SOURCES_TO_DTBS,$(2))))
500 # List of the pre-compiled DTS file(s)
501 $(eval DPRE := $(addprefix $(1)/,$(patsubst %.dts,%.pre.dts,$(notdir $(2)))))
502 # Dependencies of the pre-compiled DTS file(s) on its source and included files
503 $(eval DTSDEP := $(patsubst %.dtb,%.o.d,$(DOBJ)))
504 # Dependencies of the DT compilation on its pre-compiled DTS
505 $(eval DTBDEP := $(patsubst %.dtb,%.d,$(DOBJ)))
506
507 $(DOBJ): $(2) $(filter-out %.d,$(MAKEFILE_LIST)) | fdt_dirs
508 $${ECHO} " CPP $$<"
509 $(eval DTBS := $(addprefix $(1)/,$(call SOURCES_TO_DTBS,$(2))))
510 $$(Q)$$(PP) $$(DTC_CPPFLAGS) -MT $(DTBS) -MMD -MF $(DTSDEP) -o $(DPRE) $$<
511 $${ECHO} " DTC $$<"
512 $$(Q)$$(DTC) $$(DTC_FLAGS) -i fdts -d $(DTBDEP) -o $$@ $(DPRE)
513
514 -include $(DTBDEP)
515 -include $(DTSDEP)
516
517 endef
518
519 # MAKE_DTBS builds flattened device tree sources
520 # $(1) = output directory
521 # $(2) = list of flattened device tree source files
522 define MAKE_DTBS
523 $(eval DOBJS := $(filter %.dts,$(2)))
524 $(eval REMAIN := $(filter-out %.dts,$(2)))
525 $(and $(REMAIN),$(error FDT_SOURCES contain non-DTS files: $(REMAIN)))
526 $(eval $(foreach obj,$(DOBJS),$(call MAKE_DTB,$(1),$(obj))))
527
528 $(eval $(call MAKE_FDT_DIRS,$(1),$(2)))
529
530 dtbs: $(DTBS)
531 all: dtbs
532 endef