2 # Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
4 # SPDX-License-Identifier: BSD-3-Clause
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
))
13 # Some utility macros for manipulating awkward (whitespace) characters.
15 space
:=${blank} ${blank}
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.
21 $(strip $(foreach d
,$(wildcard ${1}*),$(call rwildcard
,${d}/,${2}) $(filter $(subst *,%,%${2}),${d})))
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
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))
34 # A macro for converting a string to upper case
35 # $(1) = String to convert
37 $(eval uppercase_result
:=$(call uppercase_internal
,$(uppercase_table
),$(1)))$(uppercase_result
)
40 # Convenience function for adding build definitions
41 # $(eval $(call add_define,FOO)) will have:
42 # -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise
44 DEFINES
+= -D
$(1)$(if
$(value
$(1)),=$(value
$(1)),)
47 # Convenience function for adding build definitions
48 # $(eval $(call add_define_val,FOO,BAR)) will have:
51 DEFINES
+= -D
$(1)=$(2)
54 # Convenience function for verifying option has a boolean value
55 # $(eval $(call assert_boolean,FOO)) will assert FOO is 0 or 1
57 $(if
$(filter-out 0 1,$($1)),$(error
$1 must be boolean
))
60 0-9 := 0 1 2 3 4 5 6 7 8 9
62 # Function to verify that a given option $(1) contains a numeric value
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
))
70 # IMG_LINKERFILE defines the linker script corresponding to a BL stage
71 # $(1) = BL stage (2, 30, 31, 32, 33)
73 ${BUILD_DIR}/bl
$(1).
ld
76 # IMG_MAPFILE defines the output file describing the memory map corresponding
78 # $(1) = BL stage (2, 30, 31, 32, 33)
80 ${BUILD_DIR}/bl
$(1).map
83 # IMG_ELF defines the elf file corresponding to a BL stage
84 # $(1) = BL stage (2, 30, 31, 32, 33)
86 ${BUILD_DIR}/bl
$(1).elf
89 # IMG_DUMP defines the symbols dump file corresponding to a BL stage
90 # $(1) = BL stage (2, 30, 31, 32, 33)
92 ${BUILD_DIR}/bl
$(1).dump
95 # IMG_BIN defines the default image file corresponding to a BL stage
96 # $(1) = BL stage (2, 30, 31, 32, 33)
98 ${BUILD_PLAT}/bl
$(1).bin
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))
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)
123 define TOOL_ADD_IMG_PAYLOAD
125 $(eval PRE_TOOL_FILTER
:= $($(call uppercase
,$(1))_PRE_TOOL_FILTER
))
127 ifneq ($(PRE_TOOL_FILTER
),)
129 $(eval PROCESSED_PATH
:= $(BUILD_PLAT
)/$(1).bin
$($(PRE_TOOL_FILTER
)_SUFFIX
))
131 $(call
$(PRE_TOOL_FILTER
)_RULE
,$(PROCESSED_PATH
),$(2))
133 $(PROCESSED_PATH
): $(4)
135 $(call TOOL_ADD_PAYLOAD
,$(PROCESSED_PATH
),$(3),$(PROCESSED_PATH
),$(5))
138 $(call TOOL_ADD_PAYLOAD
,$(2),$(3),$(4),$(5))
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)
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)
157 # $(eval $(call TOOL_ADD_IMG,bl33,--nt-fw))
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)))
163 $(3)CRT_DEPS
+= check_
$(1)
164 $(3)FIP_DEPS
+= check_
$(1)
165 $(call TOOL_ADD_IMG_PAYLOAD
,$(1),$(value
$(_V
)),$(2),,$(3))
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
))
173 ################################################################################
174 # Generic image processing filters
175 ################################################################################
181 $(Q
)gzip
-n
-f
-9 $$< --stdout
> $$@
186 ################################################################################
187 # Auxiliary macros to build TF images from sources
188 ################################################################################
190 MAKE_DEP
= -Wp
,-MD
,$(DEP
) -MT
$$@
-MP
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
198 $(eval OBJ
:= $(1)/$(patsubst %.c
,%.o
,$(notdir $(2))))
199 $(eval DEP
:= $(patsubst %.o
,%.d
,$(OBJ
)))
201 $(OBJ
): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | lib
$(3)_dirs
203 $$(Q
)$$(CC
) $$(TF_CFLAGS
) $$(CFLAGS
) $(MAKE_DEP
) -c
$$< -o
$$@
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
214 $(eval OBJ
:= $(1)/$(patsubst %.S
,%.o
,$(notdir $(2))))
215 $(eval DEP
:= $(patsubst %.o
,%.d
,$(OBJ
)))
217 $(OBJ
): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | lib
$(3)_dirs
219 $$(Q
)$$(AS
) $$(ASFLAGS
) $(MAKE_DEP
) -c
$$< -o
$$@
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)
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
))
237 $(OBJ
): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | bl
$(3)_dirs
239 $$(Q
)$$(CC
) $$(TF_CFLAGS
) $$(CFLAGS
) $(BL_CFLAGS
) -D
$(IMAGE
) $(MAKE_DEP
) -c
$$< -o
$$@
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)
252 $(eval OBJ
:= $(1)/$(patsubst %.S
,%.o
,$(notdir $(2))))
253 $(eval DEP
:= $(patsubst %.o
,%.d
,$(OBJ
)))
254 $(eval IMAGE
:= IMAGE_BL
$(call uppercase
,$(3)))
256 $(OBJ
): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | bl
$(3)_dirs
258 $$(Q
)$$(AS
) $$(ASFLAGS
) -D
$(IMAGE
) $(MAKE_DEP
) -c
$$< -o
$$@
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)
271 $(eval DEP
:= $(1).d
)
272 $(eval IMAGE
:= IMAGE_BL
$(call uppercase
,$(3)))
274 $(1): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | bl
$(3)_dirs
276 $$(Q
)$$(CPP
) $$(CPPFLAGS
) -P
-x assembler-with-cpp
-D__LINKER__
$(MAKE_DEP
) -D
$(IMAGE
) -o
$$@
$$<
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
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))))
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))))
295 $(and
$(REMAIN
),$(error Unexpected source files present
: $(REMAIN
)))
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)
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))))
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))))
312 $(and
$(REMAIN
),$(error Unexpected source files present
: $(REMAIN
)))
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))))
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__
331 # MAKE_LIB_DIRS macro defines the target for the directory where
332 # libraries are created
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}))
342 # MAKE_LIB macro defines the targets and options to build each BL image.
344 # $(1) = Library name
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
))))
352 $(eval
$(call MAKE_PREREQ_DIR
,${BUILD_DIR},${BUILD_PLAT}))
353 $(eval
$(call MAKE_LIB_OBJS
,$(BUILD_DIR
),$(SOURCES
),$(1)))
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)
362 LDPATHS
= -L
${LIB_DIR}
366 ifeq ($(USE_ROMLIB
),1)
367 LIBWRAPPER
= -lwrappers
370 all: ${LIB_DIR}/lib
$(1).a
372 ${LIB_DIR}/lib
$(1).a
: $(OBJS
)
374 $$(Q
)$$(AR
) cr
$$@
$$?
377 # MAKE_BL macro defines the targets and options to build each BL image.
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)
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
)))
401 # Create generators for object directory structure
403 $(eval
$(call MAKE_PREREQ_DIR
,${BUILD_DIR},${BUILD_PLAT}))
405 $(eval
$(foreach objd
,${OBJ_DIRS},$(call MAKE_PREREQ_DIR
,${objd},${BUILD_DIR})))
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}
413 $(eval
$(call MAKE_OBJS
,$(BUILD_DIR
),$(SOURCES
),$(1)))
414 $(eval
$(call MAKE_LD
,$(LINKERFILE
),$(BL_LINKERFILE
),$(1)))
416 ifeq ($(USE_ROMLIB
),1)
420 $(ELF
): $(OBJS
) $(LINKERFILE
) | bl
$(1)_dirs libraries
$(BL_LIBS
)
422 ifdef MAKE_BUILD_STRINGS
423 $(call MAKE_BUILD_STRINGS
, $(BUILD_DIR
)/build_message.o
)
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
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
)
437 $$(Q
)$$(LD
) -o
$$@
$$(TF_LDFLAGS
) $$(LDFLAGS
) -Map
=$(MAPFILE
) \
438 --script
$(LINKERFILE
) $(BUILD_DIR
)/build_message.o \
439 $(OBJS
) $(LDPATHS
) $(LIBWRAPPER
) $(LDLIBS
) $(BL_LIBS
)
441 ifeq ($(DISABLE_BIN_GENERATION
),1)
443 @echo
"Built $$@ successfully"
449 $${Q}$${OD} -dx
$$< > $$@
453 $$(Q
)$$(OC
) -O binary
$$< $$@
455 @echo
"Built $$@ successfully"
459 ifeq ($(DISABLE_BIN_GENERATION
),1)
460 bl
$(1): $(ELF
) $(DUMP
)
462 bl
$(1): $(BIN
) $(DUMP
)
467 $(if
$(2),$(call TOOL_ADD_IMG_PAYLOAD
,bl
$(1),$(BIN
),--$(2),$(BIN
),$(3)))
471 # Convert device tree source file names to matching blobs
473 define SOURCES_TO_DTBS
474 $(notdir $(patsubst %.dts
,%.dtb
,$(filter %.dts
,$(1))))
477 # MAKE_FDT_DIRS macro creates the prerequisite directories that host the
479 # $(1) = output directory
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
)))
488 $(eval
$(foreach objd
,${DTB_DIRS},$(call MAKE_PREREQ_DIR
,${objd},${BUILD_DIR})))
490 fdt_dirs
: ${DTB_DIRS}
493 # MAKE_DTB generate the Flattened device tree binary
494 # $(1) = output directory
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
)))
507 $(DOBJ
): $(2) $(filter-out %.d
,$(MAKEFILE_LIST
)) | fdt_dirs
509 $(eval DTBS
:= $(addprefix $(1)/,$(call SOURCES_TO_DTBS
,$(2))))
510 $$(Q
)$$(PP
) $$(DTC_CPPFLAGS
) -MT
$(DTBS
) -MMD
-MF
$(DTSDEP
) -o
$(DPRE
) $$<
512 $$(Q
)$$(DTC
) $$(DTC_FLAGS
) -i fdts
-d
$(DTBDEP
) -o
$$@
$(DPRE
)
519 # MAKE_DTBS builds flattened device tree sources
520 # $(1) = output directory
521 # $(2) = list of flattened device tree source files
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
))))
528 $(eval
$(call MAKE_FDT_DIRS
,$(1),$(2)))