blob: 97afc34d5ee5156b1b72d8d22a8c34518e2f56cb [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001#
Jayanth Dodderi Chidanandce372772023-04-21 11:40:22 +01002# Copyright (c) 2018-2023, Arm Limited. All rights reserved.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7# TFTF Version
8VERSION_MAJOR := 2
Juan Pablo Conde0a0f6742023-05-13 00:20:15 -05009VERSION_MINOR := 9
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020010
Leonardo Sandoval667fd722020-09-11 12:50:19 -050011MAKE_HELPERS_DIRECTORY := make_helpers/
12include ${MAKE_HELPERS_DIRECTORY}build_macros.mk
13
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020014################################################################################
15# Default values for build configurations, and their dependencies
16################################################################################
17
Leonardo Sandoval667fd722020-09-11 12:50:19 -050018include ${MAKE_HELPERS_DIRECTORY}defaults.mk
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020019
20PLAT := ${DEFAULT_PLAT}
21
22# Assertions enabled for DEBUG builds by default
23ENABLE_ASSERTIONS := ${DEBUG}
24
25################################################################################
26# Checkpatch script options
27################################################################################
28
29CHECKCODE_ARGS := --no-patch
30# Do not check the coding style on imported library files or documentation files
31INC_LIB_DIRS_TO_CHECK := $(sort $(filter-out \
Mark Dykese7810b52020-06-03 15:46:55 -050032 include/lib/libfdt \
Ambroise Vincentd6e806d2019-02-11 14:34:26 +000033 include/lib/libc, \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020034 $(wildcard include/lib/*)))
35LIB_DIRS_TO_CHECK := $(sort $(filter-out \
36 lib/compiler-rt \
Mark Dykese7810b52020-06-03 15:46:55 -050037 lib/libfdt% \
Ambroise Vincentd6e806d2019-02-11 14:34:26 +000038 lib/libc, \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020039 $(wildcard lib/*)))
40ROOT_DIRS_TO_CHECK := $(sort $(filter-out \
41 lib \
42 include \
43 docs \
44 %.md \
45 %.rst, \
46 $(wildcard *)))
47CHECK_PATHS := ${ROOT_DIRS_TO_CHECK} \
48 ${INC_LIB_DIRS_TO_CHECK} \
49 ${LIB_DIRS_TO_CHECK}
50
51ifeq (${V},0)
52 Q=@
53else
54 Q=
55endif
56export Q
57
58ifneq (${DEBUG}, 0)
59 BUILD_TYPE := debug
60 # Use LOG_LEVEL_INFO by default for debug builds
61 LOG_LEVEL := 40
62else
63 BUILD_TYPE := release
64 # Use LOG_LEVEL_ERROR by default for release builds
65 LOG_LEVEL := 20
66endif
67
68# Default build string (git branch and commit)
69ifeq (${BUILD_STRING},)
Manish V Badarkhece149412022-05-24 22:54:45 +010070 BUILD_STRING := $(shell git describe --always --dirty --tags 2> /dev/null)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020071endif
72
73VERSION_STRING := v${VERSION_MAJOR}.${VERSION_MINOR}(${PLAT},${BUILD_TYPE}):${BUILD_STRING}
74
75BUILD_BASE := ./build
76BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
77
78PLAT_MAKEFILE := platform.mk
79# Generate the platforms list by recursively searching for all directories
80# under /plat containing a PLAT_MAKEFILE. Append each platform with a `|`
81# char and strip out the final '|'.
82PLATFORMS := $(shell find plat/ -name '${PLAT_MAKEFILE}' -print0 | \
83 sed -r 's%[^\x00]*\/([^/]*)\/${PLAT_MAKEFILE}\x00%\1|%g' | \
84 sed -r 's/\|$$//')
85
Sandrine Bailleuxf8228af2020-04-21 14:45:00 +020086DOCS_PATH := docs
87
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020088ifeq (${PLAT},)
89 $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
90endif
91PLAT_PATH := $(shell find plat/ -wholename '*/${PLAT}')
92PLAT_MAKEFILE_FULL := ${PLAT_PATH}/${PLAT_MAKEFILE}
93ifeq ($(wildcard ${PLAT_MAKEFILE_FULL}),)
94 $(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}")
95endif
96
Arvind Ram Prakash2e1264d2022-05-20 12:27:40 -050097
98EL3_PAYLOAD_PLAT_PATH := $(shell find el3_payload/plat/ -wholename '*/${PLAT}')
99EL3_PAYLOAD_PLAT_MAKEFILE_FULL := ${EL3_PAYLOAD_PLAT_PATH}/${PLAT_MAKEFILE}
100
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200101.PHONY: all
102all: msg_start
103
104.PHONY: msg_start
105msg_start:
106 @echo "Building ${PLAT}"
Sandrine Bailleux043d5362018-10-03 17:05:59 +0200107 @echo "Selected set of tests: ${TESTS}"
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200108
Shruti Guptac973b2a2023-07-12 12:10:54 +0100109# Set flags for Realm Payload Tests
110ifeq (${ENABLE_REALM_PAYLOAD_TESTS},1)
111BRANCH_PROTECTION := 2
112endif
113
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200114# Include test images makefiles.
115include tftf/framework/framework.mk
116include tftf/tests/tests.mk
117include fwu/ns_bl1u/ns_bl1u.mk
118include fwu/ns_bl2u/ns_bl2u.mk
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100119
Daniel Boulbyf6c288e2022-07-25 14:07:57 +0100120# List of secure partitions present.
121SECURE_PARTITIONS :=
122
Olivier Deprez40777f82022-11-09 10:15:28 +0100123# Only platform fvp supports cactus_mm
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100124ifeq (${ARCH}-${PLAT},aarch64-fvp)
Antonio Nino Diazf2218e72019-03-19 10:59:11 +0000125include spm/cactus_mm/cactus_mm.mk
nabkah01002e5692022-10-10 12:36:46 +0100126include realm/realm.mk
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100127endif
128
Daniel Boulbyc19215a2023-05-17 13:50:36 +0100129# cactus and ivy are supported on platforms: fvp, tc
130ifeq (${ARCH}-${PLAT},$(filter ${ARCH}-${PLAT},aarch64-fvp aarch64-tc))
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100131include spm/cactus/cactus.mk
Olivier Deprez2765ebf2020-12-16 15:46:14 +0100132include spm/ivy/ivy.mk
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100133endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200134
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000135################################################################################
136# Include libc
137################################################################################
138include lib/libc/libc.mk
139
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200140# Include platform specific makefile last because:
141# - the platform makefile may use all previous definitions in this file.
142# - the platform makefile may wish overwriting some of them.
143include ${PLAT_MAKEFILE_FULL}
144
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200145.SUFFIXES:
146
147################################################################################
148# Build options checks
149################################################################################
150$(eval $(call assert_boolean,DEBUG))
151$(eval $(call assert_boolean,ENABLE_ASSERTIONS))
152$(eval $(call assert_boolean,FIRMWARE_UPDATE))
153$(eval $(call assert_boolean,FWU_BL_TEST))
154$(eval $(call assert_boolean,NEW_TEST_SESSION))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200155$(eval $(call assert_boolean,USE_NVM))
Shruti Guptac973b2a2023-07-12 12:10:54 +0100156$(eval $(call assert_numeric,BRANCH_PROTECTION))
157$(eval $(call assert_boolean,ENABLE_REALM_PAYLOAD_TESTS))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200158
159################################################################################
Alexei Fedorov7fac1622020-06-19 14:25:43 +0100160# Process build options
161################################################################################
162
163# Process BRANCH_PROTECTION value and set
164# Pointer Authentication and Branch Target Identification flags
165include branch_protection.mk
166
167################################################################################
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200168# Add definitions to the cpp preprocessor based on the current build options.
169# This is done after including the platform specific makefile to allow the
170# platform to overwrite the default options
171################################################################################
172$(eval $(call add_define,TFTF_DEFINES,ARM_ARCH_MAJOR))
173$(eval $(call add_define,TFTF_DEFINES,ARM_ARCH_MINOR))
174$(eval $(call add_define,TFTF_DEFINES,DEBUG))
175$(eval $(call add_define,TFTF_DEFINES,ENABLE_ASSERTIONS))
Alexei Fedorov7fac1622020-06-19 14:25:43 +0100176$(eval $(call add_define,TFTF_DEFINES,ENABLE_BTI))
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +0000177$(eval $(call add_define,TFTF_DEFINES,ENABLE_PAUTH))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200178$(eval $(call add_define,TFTF_DEFINES,LOG_LEVEL))
179$(eval $(call add_define,TFTF_DEFINES,NEW_TEST_SESSION))
180$(eval $(call add_define,TFTF_DEFINES,PLAT_${PLAT}))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200181$(eval $(call add_define,TFTF_DEFINES,USE_NVM))
182
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200183################################################################################
184
185# Assembler, compiler and linker flags shared across all test images.
186COMMON_ASFLAGS :=
187COMMON_CFLAGS :=
188COMMON_LDFLAGS :=
189
190ifeq (${DEBUG},1)
Daniel Boulbyed1f9512022-05-03 16:36:51 +0100191COMMON_CFLAGS += -g -gdwarf-4
192COMMON_ASFLAGS += -g -Wa,--gdwarf-4
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200193endif
194
Joel Hutton6a6f4832019-04-08 15:46:36 +0100195# Set the compiler's target architecture profile based on ARM_ARCH_MINOR option
196ifeq (${ARM_ARCH_MINOR},0)
Alexei Fedorovd92f4ce2020-12-07 18:13:28 +0000197march32-directive = -march=armv${ARM_ARCH_MAJOR}-a
198march64-directive = -march=armv${ARM_ARCH_MAJOR}-a
Joel Hutton6a6f4832019-04-08 15:46:36 +0100199else
Alexei Fedorovd92f4ce2020-12-07 18:13:28 +0000200march32-directive = -march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a
201march64-directive = -march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a
Joel Hutton6a6f4832019-04-08 15:46:36 +0100202endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200203
Alexei Fedorovd92f4ce2020-12-07 18:13:28 +0000204# Get architecture feature modifiers
205arch-features = ${ARM_ARCH_FEATURE}
206
207# Set the compiler's architecture feature modifiers
208ifneq ($(arch-features), none)
209ifeq ($(ARCH), aarch32)
210march32-directive := $(march32-directive)+$(arch-features)
211else
212march64-directive := $(march64-directive)+$(arch-features)
213endif
214# Print features
215$(info Arm Architecture Features specified: $(subst +, ,$(arch-features)))
216endif # arch-features
217
Joel Hutton6a6f4832019-04-08 15:46:36 +0100218COMMON_ASFLAGS_aarch64 := -mgeneral-regs-only ${march64-directive}
219COMMON_CFLAGS_aarch64 := -mgeneral-regs-only -mstrict-align ${march64-directive}
220
221COMMON_ASFLAGS_aarch32 := ${march32-directive}
222COMMON_CFLAGS_aarch32 := ${march32-directive} -mno-unaligned-access
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200223
224COMMON_ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \
225 -Werror -Wmissing-include-dirs \
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000226 -D__ASSEMBLY__ $(COMMON_ASFLAGS_$(ARCH)) \
227 ${INCLUDES}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200228COMMON_CFLAGS += -nostdinc -ffreestanding -Wall -Werror \
229 -Wmissing-include-dirs $(COMMON_CFLAGS_$(ARCH)) \
230 -std=gnu99 -Os
231COMMON_CFLAGS += -ffunction-sections -fdata-sections
232
233# Get the content of CFLAGS user defined value last so they are appended after
234# the options defined in the Makefile
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000235COMMON_CFLAGS += ${CFLAGS} ${INCLUDES}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200236
Karl Meakine69d1282023-03-07 17:10:07 +0000237COMMON_LDFLAGS += ${LDFLAGS} --fatal-warnings -O1 --gc-sections --build-id=none
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200238
239CC := ${CROSS_COMPILE}gcc
240CPP := ${CROSS_COMPILE}cpp
241AS := ${CROSS_COMPILE}gcc
242AR := ${CROSS_COMPILE}ar
243LD := ${CROSS_COMPILE}ld
244OC := ${CROSS_COMPILE}objcopy
245OD := ${CROSS_COMPILE}objdump
246NM := ${CROSS_COMPILE}nm
247PP := ${CROSS_COMPILE}gcc
248
Soby Mathew25d9e2f2023-05-05 10:51:57 +0100249# With ld.bfd version 2.39 and newer new warnings are added. Skip those since we
250# are not loaded by a elf loader.
251COMMON_LDFLAGS += $(call ld_option, --no-warn-rwx-segments)
252
Govindraj Raja1421d772023-05-05 09:15:43 -0500253# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523
254COMMON_CFLAGS += $(call cc_option, --param=min-pagesize=0)
255
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200256################################################################################
257
Mark Dykese7810b52020-06-03 15:46:55 -0500258TFTF_SOURCES := ${FRAMEWORK_SOURCES} ${TESTS_SOURCES} ${PLAT_SOURCES} ${LIBC_SRCS} ${LIBFDT_SRCS}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200259TFTF_INCLUDES += ${PLAT_INCLUDES}
260TFTF_CFLAGS += ${COMMON_CFLAGS}
261TFTF_ASFLAGS += ${COMMON_ASFLAGS}
262TFTF_LDFLAGS += ${COMMON_LDFLAGS}
Mark Dykese7810b52020-06-03 15:46:55 -0500263TFTF_EXTRA_OBJS :=
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200264
Alexei Fedorov7fac1622020-06-19 14:25:43 +0100265ifneq (${BP_OPTION},none)
266TFTF_CFLAGS += -mbranch-protection=${BP_OPTION}
267NS_BL1U_CFLAGS += -mbranch-protection=${BP_OPTION}
268NS_BL2U_CFLAGS += -mbranch-protection=${BP_OPTION}
269CACTUS_MM_CFLAGS += -mbranch-protection=${BP_OPTION}
270CACTUS_CFLAGS += -mbranch-protection=${BP_OPTION}
271IVY_CFLAGS += -mbranch-protection=${BP_OPTION}
AlexeiFedorov193b3562022-12-22 16:50:08 +0000272REALM_CFLAGS += -mbranch-protection=${BP_OPTION}
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +0000273endif
274
Mark Dykese7810b52020-06-03 15:46:55 -0500275ifeq ($(SMC_FUZZING), 1)
276TFTF_EXTRA_OBJS += ${BUILD_PLAT}/smcf/dtb.o
277endif
278
Olivier Deprez231115d2020-02-03 11:27:01 +0100279#####################################################################################
280ifneq ($(findstring gcc,$(notdir $(LD))),)
281 PIE_LDFLAGS += -Wl,-pie -Wl,--no-dynamic-linker
282else
283 PIE_LDFLAGS += -pie --no-dynamic-linker
284endif
285
286#####################################################################################
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000287NS_BL1U_SOURCES += ${PLAT_SOURCES} ${LIBC_SRCS}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200288NS_BL1U_INCLUDES += ${PLAT_INCLUDES}
289NS_BL1U_CFLAGS += ${COMMON_CFLAGS}
290NS_BL1U_ASFLAGS += ${COMMON_ASFLAGS}
291NS_BL1U_LDFLAGS += ${COMMON_LDFLAGS}
292
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000293NS_BL2U_SOURCES += ${PLAT_SOURCES} ${LIBC_SRCS}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200294NS_BL2U_INCLUDES += ${PLAT_INCLUDES}
295NS_BL2U_CFLAGS += ${COMMON_CFLAGS}
296NS_BL2U_ASFLAGS += ${COMMON_ASFLAGS}
297NS_BL2U_LDFLAGS += ${COMMON_LDFLAGS}
298
Antonio Nino Diazf2218e72019-03-19 10:59:11 +0000299CACTUS_MM_SOURCES += ${LIBC_SRCS}
300CACTUS_MM_INCLUDES += ${PLAT_INCLUDES}
301CACTUS_MM_CFLAGS += ${COMMON_CFLAGS}
302CACTUS_MM_ASFLAGS += ${COMMON_ASFLAGS}
303CACTUS_MM_LDFLAGS += ${COMMON_LDFLAGS}
304
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000305CACTUS_SOURCES += ${LIBC_SRCS}
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200306CACTUS_INCLUDES += ${PLAT_INCLUDES}
Olivier Deprez231115d2020-02-03 11:27:01 +0100307CACTUS_CFLAGS += ${COMMON_CFLAGS} -fpie
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200308CACTUS_ASFLAGS += ${COMMON_ASFLAGS}
Olivier Deprez231115d2020-02-03 11:27:01 +0100309CACTUS_LDFLAGS += ${COMMON_LDFLAGS} $(PIE_LDFLAGS)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200310
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000311IVY_SOURCES += ${LIBC_SRCS}
Antonio Nino Diaz0b1ab402018-12-05 15:38:39 +0000312IVY_INCLUDES += ${PLAT_INCLUDES}
Ruari Phipps9f1952c2020-08-24 11:32:32 +0100313IVY_CFLAGS += ${COMMON_CFLAGS} -fpie
Antonio Nino Diaz0b1ab402018-12-05 15:38:39 +0000314IVY_ASFLAGS += ${COMMON_ASFLAGS}
Ruari Phipps9f1952c2020-08-24 11:32:32 +0100315IVY_LDFLAGS += ${COMMON_LDFLAGS} $(PIE_LDFLAGS)
Antonio Nino Diaz0b1ab402018-12-05 15:38:39 +0000316
nabkah01002e5692022-10-10 12:36:46 +0100317REALM_SOURCES += ${LIBC_SRCS}
318REALM_CFLAGS += ${COMMON_CFLAGS} -fpie
319REALM_ASFLAGS += ${COMMON_ASFLAGS}
320REALM_LDFLAGS += ${COMMON_LDFLAGS} $(PIE_LDFLAGS)
321
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200322.PHONY: locate-checkpatch
323locate-checkpatch:
324ifndef CHECKPATCH
325 $(error "Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/script/checkpatch.pl")
326else
327ifeq (,$(wildcard ${CHECKPATCH}))
328 $(error "The file CHECKPATCH points to cannot be found, use eg: CHECKPATCH=../linux/script/checkpatch.pl")
329endif
330endif
331
332.PHONY: clean
333clean:
334 @echo " CLEAN"
335 ${Q}rm -rf ${BUILD_PLAT}
Shriram K86879852022-09-15 15:45:05 +0530336ifneq ($(wildcard ${EL3_PAYLOAD_PLAT_MAKEFILE_FULL}),)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200337 ${MAKE} -C el3_payload clean
Shriram K86879852022-09-15 15:45:05 +0530338endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200339
340.PHONY: realclean distclean
341realclean distclean:
342 @echo " REALCLEAN"
343 ${Q}rm -rf ${BUILD_BASE}
344 ${Q}rm -f ${CURDIR}/cscope.*
Shriram K86879852022-09-15 15:45:05 +0530345ifneq ($(wildcard ${EL3_PAYLOAD_PLAT_MAKEFILE_FULL}),)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200346 ${MAKE} -C el3_payload distclean
Shriram K86879852022-09-15 15:45:05 +0530347endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200348
349.PHONY: checkcodebase
350checkcodebase: locate-checkpatch
351 @echo " CHECKING STYLE"
352 @if test -d .git ; then \
Mark Dykese7810b52020-06-03 15:46:55 -0500353 git ls-files | grep -E -v 'libfdt|libc|docs|\.md|\.rst' | \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200354 while read GIT_FILE ; \
355 do ${CHECKPATCH} ${CHECKCODE_ARGS} -f $$GIT_FILE ; \
356 done ; \
357 else \
358 find . -type f -not -iwholename "*.git*" \
359 -not -iwholename "*build*" \
Mark Dykese7810b52020-06-03 15:46:55 -0500360 -not -iwholename "*libfdt*" \
Ambroise Vincentd6e806d2019-02-11 14:34:26 +0000361 -not -iwholename "*libc*" \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200362 -not -iwholename "*docs*" \
363 -not -iwholename "*.md" \
364 -not -iwholename "*.rst" \
365 -exec ${CHECKPATCH} ${CHECKCODE_ARGS} -f {} \; ; \
366 fi
367
368.PHONY: checkpatch
369checkpatch: locate-checkpatch
370 @echo " CHECKING STYLE"
371 ${Q}COMMON_COMMIT=$$(git merge-base HEAD ${BASE_COMMIT}); \
372 for commit in `git rev-list $$COMMON_COMMIT..HEAD`; do \
373 printf "\n[*] Checking style of '$$commit'\n\n"; \
374 git log --format=email "$$commit~..$$commit" \
375 -- ${CHECK_PATHS} | ${CHECKPATCH} - || true; \
376 git diff --format=email "$$commit~..$$commit" \
377 -- ${CHECK_PATHS} | ${CHECKPATCH} - || true; \
378 done
379
380ifneq (${FIRMWARE_UPDATE},1)
381.PHONY: ns_bl1u ns_bl2u
382ns_bl1u ns_bl2u:
383 @echo "ERROR: Can't build $@ because Firmware Update is not supported \
384 on this platform."
385 @exit 1
386endif
387
388ifneq (${ARCH}-${PLAT},aarch64-fvp)
Antonio Nino Diazf2218e72019-03-19 10:59:11 +0000389.PHONY: cactus_mm
390cactus_mm:
391 @echo "ERROR: $@ is supported only on AArch64 FVP."
392 @exit 1
393
nabkah01002e5692022-10-10 12:36:46 +0100394.PHONY: realm
395realm:
396 @echo "ERROR: $@ is supported only on AArch64 FVP."
397 @exit 1
398
399.PHONY: pack_realm
400pack_realm:
401 @echo "Nothing to be done"
402 @exit 1
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200403endif
404
Daniel Boulbyc19215a2023-05-17 13:50:36 +0100405ifneq (${ARCH}-${PLAT},$(filter ${ARCH}-${PLAT},aarch64-fvp aarch64-tc))
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100406.PHONY: cactus
407cactus:
Daniel Boulbyc19215a2023-05-17 13:50:36 +0100408 @echo "ERROR: $@ is supported only on AArch64 FVP or TC."
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100409 @exit 1
Olivier Deprez2765ebf2020-12-16 15:46:14 +0100410
411.PHONY: ivy
412ivy:
Daniel Boulbyc19215a2023-05-17 13:50:36 +0100413 @echo "ERROR: $@ is supported only on AArch64 FVP or TC."
Olivier Deprez2765ebf2020-12-16 15:46:14 +0100414 @exit 1
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100415endif
416
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200417MAKE_DEP = -Wp,-MD,$(DEP) -MT $$@
418
419define MAKE_C
420
421$(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2))))
422$(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
423
Bence Szépkúti537b3582019-11-29 18:23:56 +0100424$(OBJ) : $(2) | $(AUTOGEN_DIR)/tests_list.h
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200425 @echo " CC $$<"
426 $$(Q)$$(CC) $$($(3)_CFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -DIMAGE_$(3) $(MAKE_DEP) -c $$< -o $$@
427
428-include $(DEP)
429endef
430
431
432define MAKE_S
433
434$(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2))))
435$(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
436
Bence Szépkúti537b3582019-11-29 18:23:56 +0100437$(OBJ) : $(2) | $(AUTOGEN_DIR)/tests_list.h
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200438 @echo " AS $$<"
439 $$(Q)$$(AS) $$($(3)_ASFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -DIMAGE_$(3) $(MAKE_DEP) -c $$< -o $$@
440
441-include $(DEP)
442endef
443
444
445define MAKE_LD
446
447$(eval DEP := $(1).d)
448
Bence Szépkúti537b3582019-11-29 18:23:56 +0100449$(1) : $(2) | $(AUTOGEN_DIR)/tests_list.h
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200450 @echo " PP $$<"
451 $$(Q)$$(AS) $$($(3)_ASFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -P -E $(MAKE_DEP) -o $$@ $$<
452
453-include $(DEP)
454endef
455
456
457define MAKE_OBJS
458 $(eval C_OBJS := $(filter %.c,$(2)))
459 $(eval REMAIN := $(filter-out %.c,$(2)))
460 $(eval $(foreach obj,$(C_OBJS),$(call MAKE_C,$(1),$(obj),$(3))))
461
462 $(eval S_OBJS := $(filter %.S,$(REMAIN)))
463 $(eval REMAIN := $(filter-out %.S,$(REMAIN)))
464 $(eval $(foreach obj,$(S_OBJS),$(call MAKE_S,$(1),$(obj),$(3))))
465
466 $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN)))
467endef
468
469
470# NOTE: The line continuation '\' is required in the next define otherwise we
471# end up with a line-feed characer at the end of the last c filename.
472# Also bare this issue in mind if extending the list of supported filetypes.
473define SOURCES_TO_OBJS
474 $(notdir $(patsubst %.c,%.o,$(filter %.c,$(1)))) \
475 $(notdir $(patsubst %.S,%.o,$(filter %.S,$(1))))
476endef
477
478define uppercase
479$(shell echo $(1) | tr '[:lower:]' '[:upper:]')
480endef
481
482define MAKE_IMG
483 $(eval IMG_PREFIX := $(call uppercase, $(1)))
484 $(eval BUILD_DIR := ${BUILD_PLAT}/$(1))
485 $(eval SOURCES := $(${IMG_PREFIX}_SOURCES))
486 $(eval OBJS := $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
Mark Dykese7810b52020-06-03 15:46:55 -0500487 $(eval OBJS += $(${IMG_PREFIX}_EXTRA_OBJS))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200488 $(eval LINKERFILE := $(BUILD_DIR)/$(1).ld)
489 $(eval MAPFILE := $(BUILD_DIR)/$(1).map)
490 $(eval ELF := $(BUILD_DIR)/$(1).elf)
491 $(eval DUMP := $(BUILD_DIR)/$(1).dump)
492 $(eval BIN := $(BUILD_PLAT)/$(1).bin)
493
494 $(eval $(call MAKE_OBJS,$(BUILD_DIR),$(SOURCES),${IMG_PREFIX}))
495 $(eval $(call MAKE_LD,$(LINKERFILE),$(${IMG_PREFIX}_LINKERFILE),${IMG_PREFIX}))
496
497$(BUILD_DIR) :
498 $$(Q)mkdir -p "$$@"
499
500$(ELF) : $(OBJS) $(LINKERFILE)
501 @echo " LD $$@"
502 @echo 'const char build_message[] = "Built : "__TIME__", "__DATE__; \
503 const char version_string[] = "${VERSION_STRING}";' | \
504 $$(CC) $$(${IMG_PREFIX}_CFLAGS) ${${IMG_PREFIX}_INCLUDES} ${${IMG_PREFIX}_DEFINES} -c -xc - -o $(BUILD_DIR)/build_message.o
505 $$(Q)$$(LD) -o $$@ $$(${IMG_PREFIX}_LDFLAGS) -Map=$(MAPFILE) \
506 -T $(LINKERFILE) $(BUILD_DIR)/build_message.o $(OBJS)
507
508$(DUMP) : $(ELF)
509 @echo " OD $$@"
510 $${Q}$${OD} -dx $$< > $$@
511
512$(BIN) : $(ELF)
513 @echo " BIN $$@"
514 $$(Q)$$(OC) -O binary $$< $$@
515 @echo
516 @echo "Built $$@ successfully"
517 @echo
518
519.PHONY : $(1)
520$(1) : $(BUILD_DIR) $(BIN) $(DUMP)
521
522all : $(1)
523
524endef
525
Shruti Gupta2eb601b2023-03-29 21:35:17 +0100526ifeq (${ARCH},aarch32)
527 ARCH_TESTS_SKIP_LIST := tftf/tests/aarch32_tests_to_skip.txt
528endif
529
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200530$(AUTOGEN_DIR):
531 $(Q)mkdir -p "$@"
532
Shruti Gupta2eb601b2023-03-29 21:35:17 +0100533$(AUTOGEN_DIR)/tests_list.c $(AUTOGEN_DIR)/tests_list.h: $(AUTOGEN_DIR) ${TESTS_FILE} ${PLAT_TESTS_SKIP_LIST} $(ARCH_TESTS_SKIP_LIST)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200534 @echo " AUTOGEN $@"
Jim Ray7ba27bf2023-05-25 14:11:51 -0700535 tools/generate_test_list/generate_test_list.py $(AUTOGEN_DIR)/tests_list.c \
536 $(AUTOGEN_DIR)/tests_list.h ${TESTS_FILE} \
537 --plat-skip-file=$(PLAT_TESTS_SKIP_LIST) \
538 --arch-skip-file=$(ARCH_TESTS_SKIP_LIST)
Mark Dykese7810b52020-06-03 15:46:55 -0500539ifeq ($(SMC_FUZZING), 1)
540 $(Q)mkdir -p ${BUILD_PLAT}/smcf
541 dtc ${SMC_FUZZ_DTS} >> ${BUILD_PLAT}/smcf/dtb
542 $(OC) -I binary -O elf64-littleaarch64 -B aarch64 ${BUILD_PLAT}/smcf/dtb ${BUILD_PLAT}/smcf/dtb.o \
johpow01d5c79cc2021-06-23 16:10:22 -0500543 --redefine-sym _binary___build_$(PLAT)_$(BUILD_TYPE)_smcf_dtb_start=_binary___dtb_start \
544 --redefine-sym _binary___build_$(PLAT)_$(BUILD_TYPE)_smcf_dtb_end=_binary___dtb_end
Mark Dykese7810b52020-06-03 15:46:55 -0500545endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200546
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200547ifeq ($(FIRMWARE_UPDATE), 1)
548 $(eval $(call MAKE_IMG,ns_bl1u))
549 $(eval $(call MAKE_IMG,ns_bl2u))
550endif
551
552ifeq (${ARCH}-${PLAT},aarch64-fvp)
Antonio Nino Diazf2218e72019-03-19 10:59:11 +0000553 $(eval $(call MAKE_IMG,cactus_mm))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200554 $(eval $(call MAKE_IMG,cactus))
Antonio Nino Diaz0b1ab402018-12-05 15:38:39 +0000555 $(eval $(call MAKE_IMG,ivy))
Shruti Guptac973b2a2023-07-12 12:10:54 +0100556endif
557
558ifeq (${ENABLE_REALM_PAYLOAD_TESTS},1)
nabkah01002e5692022-10-10 12:36:46 +0100559 $(eval $(call MAKE_IMG,realm))
560endif
561
Shruti Guptac973b2a2023-07-12 12:10:54 +0100562.PHONY : tftf
563 $(eval $(call MAKE_IMG,tftf))
564
565ifeq (${ENABLE_REALM_PAYLOAD_TESTS},1)
566tftf: realm
567 @echo " PACK REALM PAYLOAD"
568 $(shell dd if=$(BUILD_PLAT)/realm.bin of=$(BUILD_PLAT)/tftf.bin obs=1 \
569 seek=$(TFTF_MAX_IMAGE_SIZE))
570endif
571
nabkah01002e5692022-10-10 12:36:46 +0100572ifeq (${ARCH}-${PLAT},aarch64-fvp)
573.PHONY : pack_realm
Shruti Guptac973b2a2023-07-12 12:10:54 +0100574$(eval $(call MAKE_IMG,realm))
nabkah01002e5692022-10-10 12:36:46 +0100575pack_realm: realm tftf
576 @echo " PACK REALM PAYLOAD"
577 $(shell dd if=$(BUILD_PLAT)/realm.bin of=$(BUILD_PLAT)/tftf.bin obs=1 \
578 seek=$(TFTF_MAX_IMAGE_SIZE))
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200579endif
580
Daniel Boulbyc19215a2023-05-17 13:50:36 +0100581ifeq (${ARCH}-${PLAT},aarch64-tc)
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100582 $(eval $(call MAKE_IMG,cactus))
Olivier Deprez2765ebf2020-12-16 15:46:14 +0100583 $(eval $(call MAKE_IMG,ivy))
Arunachalam Ganapathy1e51c2f2020-09-22 13:28:29 +0100584endif
585
Daniel Boulbyf6c288e2022-07-25 14:07:57 +0100586SP_LAYOUT:
587 ${Q}tools/generate_json/generate_json.sh \
588 $(BUILD_PLAT) $(SECURE_PARTITIONS)
589
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200590# The EL3 test payload is only supported in AArch64. It has an independent build
591# system.
592.PHONY: el3_payload
593ifneq (${ARCH},aarch32)
Arvind Ram Prakash2e1264d2022-05-20 12:27:40 -0500594ifneq ($(wildcard ${EL3_PAYLOAD_PLAT_MAKEFILE_FULL}),)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200595el3_payload: $(BUILD_DIR)
596 ${Q}${MAKE} -C el3_payload PLAT=${PLAT}
597 ${Q}find "el3_payload/build/${PLAT}" -name '*.bin' -exec cp {} "${BUILD_PLAT}" \;
598
599all: el3_payload
600endif
Arvind Ram Prakash2e1264d2022-05-20 12:27:40 -0500601endif
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200602
Sandrine Bailleuxf8228af2020-04-21 14:45:00 +0200603doc:
604 @echo " BUILD DOCUMENTATION"
605 ${Q}${MAKE} --no-print-directory -C ${DOCS_PATH} html
606
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200607.PHONY: cscope
608cscope:
609 @echo " CSCOPE"
610 ${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files
611 ${Q}cscope -b -q -k
612
613.PHONY: help
Leonardo Sandoval770b4312020-09-11 14:44:40 -0500614.SILENT: help
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200615help:
Leonardo Sandoval770b4312020-09-11 14:44:40 -0500616 echo "usage: ${MAKE} PLAT=<${PLATFORMS}> \
Shruti Guptac973b2a2023-07-12 12:10:54 +0100617<all|tftf|ns_bl1u|ns_bl2u|cactus|ivy|el3_payload|distclean|clean|checkcodebase|checkpatch|help_tests>"
Leonardo Sandoval770b4312020-09-11 14:44:40 -0500618 echo ""
619 echo "PLAT is used to specify which platform you wish to build."
620 echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
621 echo ""
622 echo "Supported Targets:"
623 echo " all Build all supported binaries for this platform"
624 echo " (i.e. TFTF and FWU images)"
625 echo " tftf Build the TFTF image"
626 echo " ns_bl1u Build the NS_BL1U image"
627 echo " ns_bl2u Build the NS_BL2U image"
Olivier Deprez40777f82022-11-09 10:15:28 +0100628 echo " cactus Build the Cactus image (FF-A S-EL1 test payload)."
629 echo " cactus_mm Build the Cactus-MM image (SPM-MM S-EL0 test payload)."
630 echo " ivy Build the Ivy image (FF-A S-EL0 test payload)."
Leonardo Sandoval770b4312020-09-11 14:44:40 -0500631 echo " el3_payload Build the EL3 test payload"
632 echo " checkcodebase Check the coding style of the entire source tree"
633 echo " checkpatch Check the coding style on changes in the current"
634 echo " branch against BASE_COMMIT (default origin/master)"
635 echo " doc Build html based documentation using Sphinx tool"
636 echo " clean Clean the build for the selected platform"
637 echo " cscope Generate cscope index"
638 echo " distclean Remove all build artifacts for all platforms"
639 echo " help_tests List all possible sets of tests"
640 echo ""
641 echo "note: most build targets require PLAT to be set to a specific platform."
642 echo ""
643 echo "example: build all targets for the FVP platform:"
644 echo " CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"