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