Merge pull request #926 from EvanLloyd/win_make_4
[project/bcm63xx/atf.git] / make_helpers / build_macros.mk
1 #
2 # Copyright (c) 2015-2017, 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 $(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(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 # 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)))
109 endef
110
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))
118 endef
119
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)
125 # Example:
126 # $(eval $(call FIP_ADD_IMG,BL33,--bl33))
127 define FIP_ADD_IMG
128 CRT_DEPS += check_$(1)
129 FIP_DEPS += check_$(1)
130 $(call FIP_ADD_PAYLOAD,$(value $(1)),$(2))
131
132 check_$(1):
133 $$(if $(value $(1)),,$$(error "Platform '${PLAT}' requires $(1). Please set $(1) to point to the right file"))
134 endef
135
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))
144 endef
145
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))
153 endef
154
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)
158 # Example:
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))
164
165 check_$(1):
166 $$(if $(value $(1)),,$$(error "Platform '${PLAT}' requires $(1). Please set $(1) to point to the right file"))
167 endef
168
169 ################################################################################
170 # Auxiliary macros to build TF images from sources
171 ################################################################################
172
173 MAKE_DEP = -Wp,-MD,$(DEP) -MT $$@ -MP
174
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)
179 define MAKE_C
180
181 $(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2))))
182 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
183 $(eval IMAGE := IMAGE_BL$(call uppercase,$(3)))
184
185 $(OBJ): $(2) | bl$(3)_dirs
186 @echo " CC $$<"
187 $$(Q)$$(CC) $$(TF_CFLAGS) $$(CFLAGS) -D$(IMAGE) $(MAKE_DEP) -c $$< -o $$@
188
189 -include $(DEP)
190
191 endef
192
193
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)
198 define MAKE_S
199
200 $(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2))))
201 $(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
202 $(eval IMAGE := IMAGE_BL$(call uppercase,$(3)))
203
204 $(OBJ): $(2) | bl$(3)_dirs
205 @echo " AS $$<"
206 $$(Q)$$(AS) $$(ASFLAGS) -D$(IMAGE) $(MAKE_DEP) -c $$< -o $$@
207
208 -include $(DEP)
209
210 endef
211
212
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)
217 define MAKE_LD
218
219 $(eval DEP := $(1).d)
220
221 $(1): $(2) | bl$(3)_dirs
222 @echo " PP $$<"
223 $$(Q)$$(CPP) $$(CPPFLAGS) -P -D__ASSEMBLY__ -D__LINKER__ $(MAKE_DEP) -o $$@ $$<
224
225 -include $(DEP)
226
227 endef
228
229
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)
234 define MAKE_OBJS
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))))
238
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))))
242
243 $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN)))
244 endef
245
246
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))))
253 endef
254
255
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)
259 # $(2) = Binary file
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))))
263 endef
264
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__
269
270 # MAKE_BL macro defines the targets and options to build each BL image.
271 # Arguments:
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)
274 define MAKE_BL
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)))
291
292 # Create generators for object directory structure
293
294 $(eval $(call MAKE_PREREQ_DIR,${BUILD_DIR},))
295
296 $(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
297
298 .PHONY : bl${1}_dirs
299
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}
303
304 $(eval $(call MAKE_OBJS,$(BUILD_DIR),$(SOURCES),$(1)))
305 $(eval $(call MAKE_LD,$(LINKERFILE),$(BL_LINKERFILE),$(1)))
306
307 $(ELF): $(OBJS) $(LINKERFILE) | bl$(1)_dirs
308 @echo " LD $$@"
309 ifdef MAKE_BUILD_STRINGS
310 $(call MAKE_BUILD_STRINGS, $(BUILD_DIR)/build_message.o)
311 else
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
315 endif
316 $$(Q)$$(LD) -o $$@ $$(LDFLAGS) -Map=$(MAPFILE) --script $(LINKERFILE) \
317 $(BUILD_DIR)/build_message.o $(OBJS)
318
319 $(DUMP): $(ELF)
320 @echo " OD $$@"
321 $${Q}$${OD} -dx $$< > $$@
322
323 $(BIN): $(ELF)
324 @echo " BIN $$@"
325 $$(Q)$$(OC) -O binary $$< $$@
326 @${ECHO_BLANK_LINE}
327 @echo "Built $$@ successfully"
328 @${ECHO_BLANK_LINE}
329
330 .PHONY: bl$(1)
331 bl$(1): $(BIN) $(DUMP)
332
333 all: bl$(1)
334
335 $(eval $(call MAKE_TOOL_ARGS,$(1),$(BIN),$(2)))
336
337 endef
338