2 # Copyright (c) 2015-2017, 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 $(and
$(patsubst 0,,$(value
$(1))),$(patsubst 1,,$(value
$(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 # FIP_ADD_PAYLOAD appends the command line arguments required by fiptool
102 # to package a new payload. Optionally, it adds the dependency on this payload
103 # $(1) = payload filename (i.e. bl31.bin)
104 # $(2) = command line option for the specified payload (i.e. --bl31)
105 # $(3) = fip target dependency (optional) (i.e. bl31)
106 define FIP_ADD_PAYLOAD
107 $(eval FIP_ARGS
+= $(2) $(1))
108 $(eval
$(if
$(3),FIP_DEPS
+= $(3)))
111 # CERT_ADD_CMD_OPT adds a new command line option to the cert_create invocation
112 # $(1) = parameter filename
113 # $(2) = cert_create command line option for the specified parameter
114 # $(3) = input parameter (false if empty)
115 define CERT_ADD_CMD_OPT
116 $(eval
$(if
$(3),CRT_DEPS
+= $(1)))
117 $(eval CRT_ARGS
+= $(2) $(1))
120 # FIP_ADD_IMG allows the platform to specify an image to be packed in the FIP
121 # using a build option. It also adds a dependency on the image file, aborting
122 # the build if the file does not exist.
123 # $(1) = build option to specify the image filename (SCP_BL2, BL33, etc)
124 # $(2) = command line option for fiptool (scp_bl2, bl33, etc)
126 # $(eval $(call FIP_ADD_IMG,BL33,--bl33))
128 CRT_DEPS
+= check_
$(1)
129 FIP_DEPS
+= check_
$(1)
130 $(call FIP_ADD_PAYLOAD
,$(value
$(1)),$(2))
133 $$(if
$(value
$(1)),,$$(error
"Platform '${PLAT}' requires $(1). Please set $(1) to point to the right file"))
136 # FWU_FIP_ADD_PAYLOAD appends the command line arguments required by fiptool
137 # to package a new FWU payload. Optionally, it adds the dependency on this payload
138 # $(1) = payload filename (e.g. ns_bl2u.bin)
139 # $(2) = command line option for the specified payload (e.g. --fwu)
140 # $(3) = fip target dependency (optional) (e.g. ns_bl2u)
141 define FWU_FIP_ADD_PAYLOAD
142 $(eval
$(if
$(3),FWU_FIP_DEPS
+= $(3)))
143 $(eval FWU_FIP_ARGS
+= $(2) $(1))
146 # FWU_CERT_ADD_CMD_OPT adds a new command line option to the cert_create invocation
147 # $(1) = parameter filename
148 # $(2) = cert_create command line option for the specified parameter
149 # $(3) = input parameter (false if empty)
150 define FWU_CERT_ADD_CMD_OPT
151 $(eval
$(if
$(3),FWU_CRT_DEPS
+= $(1)))
152 $(eval FWU_CRT_ARGS
+= $(2) $(1))
155 # FWU_FIP_ADD_IMG allows the platform to pack a binary image in the FWU FIP
156 # $(1) build option to specify the image filename (BL2U, NS_BL2U, etc)
157 # $(2) command line option for fiptool (bl2u, ns_bl2u, etc)
159 # $(eval $(call FWU_FIP_ADD_IMG,BL2U,--bl2u))
160 define FWU_FIP_ADD_IMG
161 FWU_CRT_DEPS
+= check_
$(1)
162 FWU_FIP_DEPS
+= check_
$(1)
163 $(call FWU_FIP_ADD_PAYLOAD
,$(value
$(1)),$(2))
166 $$(if
$(value
$(1)),,$$(error
"Platform '${PLAT}' requires $(1). Please set $(1) to point to the right file"))
169 ################################################################################
170 # Auxiliary macros to build TF images from sources
171 ################################################################################
173 MAKE_DEP
= -Wp
,-MD
,$(DEP
) -MT
$$@
-MP
175 # MAKE_C builds a C source file and generates the dependency file
176 # $(1) = output directory
177 # $(2) = source file (%.c)
178 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
181 $(eval OBJ
:= $(1)/$(patsubst %.c
,%.o
,$(notdir $(2))))
182 $(eval DEP
:= $(patsubst %.o
,%.d
,$(OBJ
)))
183 $(eval IMAGE
:= IMAGE_BL
$(call uppercase
,$(3)))
185 $(OBJ
): $(2) | bl
$(3)_dirs
187 $$(Q
)$$(CC
) $$(TF_CFLAGS
) $$(CFLAGS
) -D
$(IMAGE
) $(MAKE_DEP
) -c
$$< -o
$$@
194 # MAKE_S builds an assembly source file and generates the dependency file
195 # $(1) = output directory
196 # $(2) = assembly file (%.S)
197 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
200 $(eval OBJ
:= $(1)/$(patsubst %.S
,%.o
,$(notdir $(2))))
201 $(eval DEP
:= $(patsubst %.o
,%.d
,$(OBJ
)))
202 $(eval IMAGE
:= IMAGE_BL
$(call uppercase
,$(3)))
204 $(OBJ
): $(2) | bl
$(3)_dirs
206 $$(Q
)$$(AS
) $$(ASFLAGS
) -D
$(IMAGE
) $(MAKE_DEP
) -c
$$< -o
$$@
213 # MAKE_LD generate the linker script using the C preprocessor
214 # $(1) = output linker script
215 # $(2) = input template
216 # $(3) = BL stage (2, 2u, 30, 31, 32, 33)
219 $(eval DEP
:= $(1).d
)
221 $(1): $(2) | bl
$(3)_dirs
223 $$(Q
)$$(CPP
) $$(CPPFLAGS
) -P
-D__ASSEMBLY__
-D__LINKER__
$(MAKE_DEP
) -o
$$@
$$<
230 # MAKE_OBJS builds both C and assembly source files
231 # $(1) = output directory
232 # $(2) = list of source files (both C and assembly)
233 # $(3) = BL stage (2, 30, 31, 32, 33)
235 $(eval C_OBJS
:= $(filter %.c
,$(2)))
236 $(eval REMAIN
:= $(filter-out %.c
,$(2)))
237 $(eval
$(foreach obj
,$(C_OBJS
),$(call MAKE_C
,$(1),$(obj
),$(3))))
239 $(eval S_OBJS
:= $(filter %.S
,$(REMAIN
)))
240 $(eval REMAIN
:= $(filter-out %.S
,$(REMAIN
)))
241 $(eval
$(foreach obj
,$(S_OBJS
),$(call MAKE_S
,$(1),$(obj
),$(3))))
243 $(and
$(REMAIN
),$(error Unexpected source files present
: $(REMAIN
)))
247 # NOTE: The line continuation '\' is required in the next define otherwise we
248 # end up with a line-feed characer at the end of the last c filename.
249 # Also bear this issue in mind if extending the list of supported filetypes.
250 define SOURCES_TO_OBJS
251 $(notdir $(patsubst %.c
,%.o
,$(filter %.c
,$(1)))) \
252 $(notdir $(patsubst %.S
,%.o
,$(filter %.S
,$(1))))
256 # MAKE_TOOL_ARGS macro defines the command line arguments for fiptool for
257 # each BL image. Arguments:
258 # $(1) = BL stage (2, 30, 31, 32, 33)
260 # $(3) = FIP command line option (if empty, image will not be included in the FIP)
261 define MAKE_TOOL_ARGS
262 $(if
$(3),$(eval
$(call FIP_ADD_PAYLOAD
,$(2),--$(3),bl
$(1))))
265 # Allow overriding the timestamp, for example for reproducible builds, or to
266 # synchronize timestamps across multiple projects.
267 # This must be set to a C string (including quotes where applicable).
268 BUILD_MESSAGE_TIMESTAMP ?
= __TIME__
", "__DATE__
270 # MAKE_BL macro defines the targets and options to build each BL image.
272 # $(1) = BL stage (2, 2u, 30, 31, 32, 33)
273 # $(2) = FIP command line option (if empty, image will not be included in the FIP)
275 $(eval BUILD_DIR
:= ${BUILD_PLAT}/bl
$(1))
276 $(eval BL_SOURCES
:= $(BL
$(call uppercase
,$(1))_SOURCES
))
277 $(eval SOURCES
:= $(BL_SOURCES
) $(BL_COMMON_SOURCES
) $(PLAT_BL_COMMON_SOURCES
))
278 $(eval OBJS
:= $(addprefix $(BUILD_DIR
)/,$(call SOURCES_TO_OBJS
,$(SOURCES
))))
279 $(eval LINKERFILE
:= $(call IMG_LINKERFILE
,$(1)))
280 $(eval MAPFILE
:= $(call IMG_MAPFILE
,$(1)))
281 $(eval ELF
:= $(call IMG_ELF
,$(1)))
282 $(eval DUMP
:= $(call IMG_DUMP
,$(1)))
283 $(eval BIN
:= $(call IMG_BIN
,$(1)))
284 $(eval BL_LINKERFILE
:= $(BL
$(call uppercase
,$(1))_LINKERFILE
))
285 # We use sort only to get a list of unique object directory names.
286 # ordering is not relevant but sort removes duplicates.
287 $(eval TEMP_OBJ_DIRS
:= $(sort $(dir ${OBJS} ${LINKERFILE})))
288 # The $(dir ) function leaves a trailing / on the directory names
289 # Rip off the / to match directory names with make rule targets.
290 $(eval OBJ_DIRS
:= $(patsubst %/,%,$(TEMP_OBJ_DIRS
)))
292 # Create generators for object directory structure
294 $(eval
$(call MAKE_PREREQ_DIR
,${BUILD_DIR},))
296 $(eval
$(foreach objd
,${OBJ_DIRS},$(call MAKE_PREREQ_DIR
,${objd},${BUILD_DIR})))
300 # We use order-only prerequisites to ensure that directories are created,
301 # but do not cause re-builds every time a file is written.
302 bl
${1}_dirs
: |
${OBJ_DIRS}
304 $(eval
$(call MAKE_OBJS
,$(BUILD_DIR
),$(SOURCES
),$(1)))
305 $(eval
$(call MAKE_LD
,$(LINKERFILE
),$(BL_LINKERFILE
),$(1)))
307 $(ELF
): $(OBJS
) $(LINKERFILE
) | bl
$(1)_dirs
309 ifdef MAKE_BUILD_STRINGS
310 $(call MAKE_BUILD_STRINGS
, $(BUILD_DIR
)/build_message.o
)
312 @echo
'const char build_message[] = "Built : "$(BUILD_MESSAGE_TIMESTAMP); \
313 const char version_string[] = "${VERSION_STRING}";' | \
314 $$(CC
) $$(TF_CFLAGS
) $$(CFLAGS
) -xc
-c
- -o
$(BUILD_DIR
)/build_message.o
316 $$(Q
)$$(LD
) -o
$$@
$$(LDFLAGS
) -Map
=$(MAPFILE
) --script
$(LINKERFILE
) \
317 $(BUILD_DIR
)/build_message.o
$(OBJS
)
321 $${Q}$${OD} -dx
$$< > $$@
325 $$(Q
)$$(OC
) -O binary
$$< $$@
327 @echo
"Built $$@ successfully"
331 bl
$(1): $(BIN
) $(DUMP
)
335 $(eval
$(call MAKE_TOOL_ARGS
,$(1),$(BIN
),$(2)))