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