2 # Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
4 # SPDX-License-Identifier: BSD-3-Clause
8 # Trusted Firmware Version
13 # Default goal is build all images
16 # Avoid any implicit propagation of command line variable definitions to
17 # sub-Makefiles, like CFLAGS that we reserved for the firmware images'
18 # usage. Other command line options like "-s" are still propagated as usual.
21 MAKE_HELPERS_DIRECTORY
:= make_helpers
/
22 include ${MAKE_HELPERS_DIRECTORY}build_macros.mk
23 include ${MAKE_HELPERS_DIRECTORY}build_env.mk
25 ################################################################################
26 # Default values for build configurations, and their dependencies
27 ################################################################################
29 include ${MAKE_HELPERS_DIRECTORY}defaults.mk
31 # Assertions enabled for DEBUG builds by default
32 ENABLE_ASSERTIONS
:= ${DEBUG}
33 ENABLE_PMF
:= ${ENABLE_RUNTIME_INSTRUMENTATION}
34 PLAT
:= ${DEFAULT_PLAT}
36 ################################################################################
37 # Checkpatch script options
38 ################################################################################
40 CHECKCODE_ARGS
:= --no-patch
41 # Do not check the coding style on imported library files or documentation files
42 INC_LIB_DIRS_TO_CHECK
:= $(sort $(filter-out \
45 $(wildcard include/lib
/*)))
46 INC_DIRS_TO_CHECK
:= $(sort $(filter-out \
48 $(wildcard include/*)))
49 LIB_DIRS_TO_CHECK
:= $(sort $(filter-out \
54 ROOT_DIRS_TO_CHECK
:= $(sort $(filter-out \
60 CHECK_PATHS
:= ${ROOT_DIRS_TO_CHECK} \
61 ${INC_DIRS_TO_CHECK} \
62 ${INC_LIB_DIRS_TO_CHECK} \
66 ################################################################################
67 # Process build options
68 ################################################################################
74 CHECKCODE_ARGS
+= --no-summary
--terse
80 ifneq ($(findstring s
,$(filter-out --%,$(MAKEFLAGS
))),)
88 $(eval
$(call add_define
,DEBUG
))
93 ifneq ($(findstring clang
,$(notdir $(CC
))),)
96 ASFLAGS
+= -g
-Wa
,--gdwarf-2
99 # Use LOG_LEVEL_INFO by default for debug builds
102 BUILD_TYPE
:= release
103 # Use LOG_LEVEL_NOTICE by default for release builds
107 # Default build string (git branch and commit)
108 ifeq (${BUILD_STRING},)
109 BUILD_STRING
:= $(shell git describe
--always
--dirty
--tags 2> /dev
/null
)
111 VERSION_STRING
:= v
${VERSION_MAJOR}.
${VERSION_MINOR}(${BUILD_TYPE}):${BUILD_STRING}
113 # The cert_create tool cannot generate certificates individually, so we use the
114 # target 'certificates' to create them all
115 ifneq (${GENERATE_COT},0)
116 FIP_DEPS
+= certificates
117 FWU_FIP_DEPS
+= fwu_certificates
120 # Process BRANCH_PROTECTION value and set
121 # Pointer Authentication and Branch Target Identification flags
122 ifeq (${BRANCH_PROTECTION},0)
123 # Default value turns off all types of branch protection
125 else ifneq (${ARCH},aarch64
)
126 $(error BRANCH_PROTECTION requires AArch64
)
127 else ifeq (${BRANCH_PROTECTION},1)
128 # Enables all types of branch protection features
129 BP_OPTION
:= standard
132 else ifeq (${BRANCH_PROTECTION},2)
133 # Return address signing to its standard level
136 else ifeq (${BRANCH_PROTECTION},3)
137 # Extend the signing to include leaf functions
138 BP_OPTION
:= pac-ret
+leaf
141 $(error Unknown BRANCH_PROTECTION value
${BRANCH_PROTECTION})
144 # USE_SPINLOCK_CAS requires AArch64 build
145 ifeq (${USE_SPINLOCK_CAS},1)
146 ifneq (${ARCH},aarch64
)
147 $(error USE_SPINLOCK_CAS requires AArch64
)
149 $(info USE_SPINLOCK_CAS is an experimental feature
)
153 ################################################################################
155 ################################################################################
160 CC
:= ${CROSS_COMPILE}gcc
161 CPP
:= ${CROSS_COMPILE}cpp
162 AS
:= ${CROSS_COMPILE}gcc
163 AR
:= ${CROSS_COMPILE}ar
164 LINKER
:= ${CROSS_COMPILE}ld
165 OC
:= ${CROSS_COMPILE}objcopy
166 OD
:= ${CROSS_COMPILE}objdump
167 NM
:= ${CROSS_COMPILE}nm
168 PP
:= ${CROSS_COMPILE}gcc
-E
171 # Use ${LD}.bfd instead if it exists (as absolute path or together with $PATH).
172 ifneq ($(strip $(wildcard ${LD}.bfd
) \
173 $(foreach dir,$(subst :, ,${PATH}),$(wildcard ${dir}/${LINKER}.bfd
))),)
174 LINKER
:= ${LINKER}.bfd
177 ifeq (${ARM_ARCH_MAJOR},7)
178 target32-directive
= -target arm-none-eabi
179 # Will set march32-directive from platform configuration
181 target32-directive
= -target armv8a-none-eabi
183 # Set the compiler's target architecture profile based on ARM_ARCH_MINOR option
184 ifeq (${ARM_ARCH_MINOR},0)
185 march32-directive
= -march
=armv8-a
186 march64-directive
= -march
=armv8-a
188 march32-directive
= -march
=armv8.
${ARM_ARCH_MINOR}-a
189 march64-directive
= -march
=armv8.
${ARM_ARCH_MINOR}-a
193 ifneq ($(findstring armclang
,$(notdir $(CC
))),)
194 TF_CFLAGS_aarch32
= -target arm-arm-none-eabi
$(march32-directive
)
195 TF_CFLAGS_aarch64
= -target aarch64-arm-none-eabi
$(march64-directive
)
197 AS
= $(CC
) -c
-x assembler-with-cpp
$(TF_CFLAGS_
$(ARCH
))
198 CPP
= $(CC
) -E
$(TF_CFLAGS_
$(ARCH
))
199 PP
= $(CC
) -E
$(TF_CFLAGS_
$(ARCH
))
200 else ifneq ($(findstring clang
,$(notdir $(CC
))),)
201 TF_CFLAGS_aarch32
= $(target32-directive
) $(march32-directive
)
202 TF_CFLAGS_aarch64
= -target aarch64-elf
$(march64-directive
)
204 AS
= $(CC
) -c
-x assembler-with-cpp
$(TF_CFLAGS_
$(ARCH
))
208 TF_CFLAGS_aarch32
= $(march32-directive
)
209 TF_CFLAGS_aarch64
= $(march64-directive
)
213 ifeq (${AARCH32_INSTRUCTION_SET},A32
)
214 TF_CFLAGS_aarch32
+= -marm
215 else ifeq (${AARCH32_INSTRUCTION_SET},T32
)
216 TF_CFLAGS_aarch32
+= -mthumb
218 $(error Error
: Unknown AArch32 instruction set
${AARCH32_INSTRUCTION_SET})
221 TF_CFLAGS_aarch32
+= -mno-unaligned-access
222 TF_CFLAGS_aarch64
+= -mgeneral-regs-only
-mstrict-align
224 ifneq (${BP_OPTION},none
)
225 TF_CFLAGS_aarch64
+= -mbranch-protection
=${BP_OPTION}
228 ASFLAGS_aarch32
= $(march32-directive
)
229 ASFLAGS_aarch64
= $(march64-directive
)
232 WARNING1
+= -Wmissing-declarations
233 WARNING1
+= -Wmissing-format-attribute
234 WARNING1
+= -Wmissing-prototypes
235 WARNING1
+= -Wold-style-definition
236 WARNING1
+= -Wunused-const-variable
238 WARNING2
:= -Waggregate-return
239 WARNING2
+= -Wcast-align
240 WARNING2
+= -Wnested-externs
242 WARNING2
+= -Wlogical-op
243 WARNING2
+= -Wmissing-field-initializers
244 WARNING2
+= -Wsign-compare
246 WARNING3
:= -Wbad-function-cast
247 WARNING3
+= -Wcast-qual
248 WARNING3
+= -Wconversion
251 WARNING3
+= -Wpointer-arith
252 WARNING3
+= -Wredundant-decls
253 WARNING3
+= -Wswitch-default
256 WARNINGS
:= $(WARNING1
)
258 WARNINGS
:= $(WARNING1
) $(WARNING2
)
260 WARNINGS
:= $(WARNING1
) $(WARNING2
) $(WARNING3
)
263 WARNINGS
+= -Wunused
-Wno-unused-parameter \
264 -Wdisabled-optimization \
267 ifeq ($(findstring clang
,$(notdir $(CC
))),)
269 WARNINGS
+= -Wunused-but-set-variable \
270 -Wmaybe-uninitialized \
271 -Wpacked-bitfield-compat \
275 WARNINGS
+= -Wshift-overflow
-Wshift-sign-overflow
282 CPPFLAGS
= ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc \
283 -Wmissing-include-dirs
$(ERRORS
) $(WARNINGS
)
284 ASFLAGS
+= $(CPPFLAGS
) $(ASFLAGS_
$(ARCH
)) \
285 -ffreestanding
-Wa
,--fatal-warnings
286 TF_CFLAGS
+= $(CPPFLAGS
) $(TF_CFLAGS_
$(ARCH
)) \
287 -ffreestanding
-fno-builtin
-Wall
-std
=gnu99 \
288 -Os
-ffunction-sections
-fdata-sections
290 ifeq (${SANITIZE_UB},on
)
291 TF_CFLAGS
+= -fsanitize
=undefined
-fno-sanitize-recover
293 ifeq (${SANITIZE_UB},trap
)
294 TF_CFLAGS
+= -fsanitize
=undefined
-fno-sanitize-recover \
295 -fsanitize-undefined-trap-on-error
298 GCC_V_OUTPUT
:= $(shell $(CC
) -v
2>&1)
300 ifneq ($(findstring armlink
,$(notdir $(LD
))),)
301 TF_LDFLAGS
+= --diag_error
=warning
--lto_level
=O1
302 TF_LDFLAGS
+= --remove
--info=unused
,unusedsymbols
304 TF_LDFLAGS
+= --fatal-warnings
-O1
305 TF_LDFLAGS
+= --gc-sections
307 TF_LDFLAGS
+= $(TF_LDFLAGS_
$(ARCH
))
309 DTC_FLAGS
+= -I dts
-O dtb
310 DTC_CPPFLAGS
+= -nostdinc
-Iinclude
-undef
-x assembler-with-cpp
312 ################################################################################
313 # Common sources and include directories
314 ################################################################################
315 include lib
/compiler-rt
/compiler-rt.mk
317 BL_COMMON_SOURCES
+= common
/bl_common.c \
319 common
/${ARCH}/debug.S \
320 drivers
/console
/multi_console.c \
321 lib
/${ARCH}/cache_helpers.S \
322 lib
/${ARCH}/misc_helpers.S \
323 plat
/common
/plat_bl_common.c \
324 plat
/common
/plat_log_common.c \
325 plat
/common
/${ARCH}/plat_common.c \
326 plat
/common
/${ARCH}/platform_helpers.S \
329 ifeq ($(notdir $(CC
)),armclang
)
330 BL_COMMON_SOURCES
+= lib
/${ARCH}/armclang_printf.S
333 ifeq (${SANITIZE_UB},on
)
334 BL_COMMON_SOURCES
+= plat
/common
/ubsan.c
337 INCLUDES
+= -Iinclude \
338 -Iinclude
/arch
/${ARCH} \
339 -Iinclude
/lib
/cpus
/${ARCH} \
340 -Iinclude
/lib
/el3_runtime
/${ARCH} \
344 include common
/backtrace
/backtrace.mk
346 ################################################################################
347 # Generic definitions
348 ################################################################################
350 include ${MAKE_HELPERS_DIRECTORY}plat_helpers.mk
352 BUILD_BASE
:= .
/build
353 BUILD_PLAT
:= ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
355 SPDS
:= $(sort $(filter-out none
, $(patsubst services
/spd
/%,%,$(wildcard services
/spd
/*))))
357 # Platforms providing their own TBB makefile may override this value
361 ################################################################################
362 # Include SPD Makefile if one has been specified
363 ################################################################################
366 ifeq (${ARCH},aarch32
)
367 $(error
"Error: SPD is incompatible with AArch32.")
369 ifdef EL3_PAYLOAD_BASE
370 $(warning
"SPD and EL3_PAYLOAD_BASE are incompatible build options.")
371 $(warning
"The SPD and its BL32 companion will be present but ignored.")
373 # We expect to locate an spd.mk under the specified SPD directory
374 SPD_MAKE
:= $(wildcard services
/spd
/${SPD}/${SPD}.mk
)
377 $(error Error
: No services
/spd
/${SPD}/${SPD}.mk located
)
379 $(info Including
${SPD_MAKE})
382 # If there's BL32 companion for the chosen SPD, we expect that the SPD's
383 # Makefile would set NEED_BL32 to "yes". In this case, the build system
384 # supports two mutually exclusive options:
385 # * BL32 is built from source: then BL32_SOURCES must contain the list
386 # of source files to build BL32
387 # * BL32 is a prebuilt binary: then BL32 must point to the image file
388 # that will be included in the FIP
389 # If both BL32_SOURCES and BL32 are defined, the binary takes precedence
393 ################################################################################
394 # Include the platform specific Makefile after the SPD Makefile (the platform
395 # makefile may use all previous definitions in this file)
396 ################################################################################
398 include ${PLAT_MAKEFILE_FULL}
400 $(eval
$(call MAKE_PREREQ_DIR
,${BUILD_PLAT}))
402 ifeq (${ARM_ARCH_MAJOR},7)
403 include make_helpers
/armv7-a-cpus.mk
406 ifeq ($(ENABLE_PIE
),1)
408 TF_LDFLAGS
+= -pie
--no-dynamic-linker
410 PIE_FOUND
:= $(findstring --enable-default-pie
,${GCC_V_OUTPUT})
411 ifneq ($(PIE_FOUND
),)
412 TF_CFLAGS
+= -fno-PIE
416 # Include the CPU specific operations makefile, which provides default
417 # values for all CPU errata workarounds and CPU specific optimisations.
418 # This can be overridden by the platform.
419 include lib
/cpus
/cpu-ops.mk
421 ifeq (${ARCH},aarch32
)
424 ################################################################################
425 # Build `AARCH32_SP` as BL32 image for AArch32
426 ################################################################################
427 ifneq (${AARCH32_SP},none
)
428 # We expect to locate an sp.mk under the specified AARCH32_SP directory
429 AARCH32_SP_MAKE
:= $(wildcard bl32
/${AARCH32_SP}/${AARCH32_SP}.mk
)
431 ifeq (${AARCH32_SP_MAKE},)
432 $(error Error
: No bl32
/${AARCH32_SP}/${AARCH32_SP}.mk located
)
435 $(info Including
${AARCH32_SP_MAKE})
436 include ${AARCH32_SP_MAKE}
441 ################################################################################
442 # Include libc if not overridden
443 ################################################################################
444 ifeq (${OVERRIDE_LIBC},0)
445 include lib
/libc
/libc.mk
448 ################################################################################
449 # Check incompatible options
450 ################################################################################
452 ifdef EL3_PAYLOAD_BASE
453 ifdef PRELOADED_BL33_BASE
454 $(warning
"PRELOADED_BL33_BASE and EL3_PAYLOAD_BASE are \
455 incompatible build options. EL3_PAYLOAD_BASE has priority.")
457 ifneq (${GENERATE_COT},0)
458 $(error
"GENERATE_COT and EL3_PAYLOAD_BASE are incompatible build options.")
460 ifneq (${TRUSTED_BOARD_BOOT},0)
461 $(error
"TRUSTED_BOARD_BOOT and EL3_PAYLOAD_BASE are incompatible build options.")
465 ifeq (${NEED_BL33},yes
)
466 ifdef EL3_PAYLOAD_BASE
467 $(warning
"BL33 image is not needed when option \
468 BL33_PAYLOAD_BASE is used and won't be added to the FIP file.")
470 ifdef PRELOADED_BL33_BASE
471 $(warning
"BL33 image is not needed when option \
472 PRELOADED_BL33_BASE is used and won't be added to the FIP \
477 # When building for systems with hardware-assisted coherency, there's no need to
478 # use USE_COHERENT_MEM. Require that USE_COHERENT_MEM must be set to 0 too.
479 ifeq ($(HW_ASSISTED_COHERENCY
)-$(USE_COHERENT_MEM
),1-1)
480 $(error USE_COHERENT_MEM cannot be enabled with HW_ASSISTED_COHERENCY
)
483 #For now, BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is 1.
484 ifeq ($(BL2_AT_EL3
)-$(BL2_IN_XIP_MEM
),0-1)
485 $(error
"BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is enabled")
488 # For RAS_EXTENSION, require that EAs are handled in EL3 first
489 ifeq ($(RAS_EXTENSION
),1)
490 ifneq ($(HANDLE_EA_EL3_FIRST
),1)
491 $(error For RAS_EXTENSION
, HANDLE_EA_EL3_FIRST must also be
1)
495 # When FAULT_INJECTION_SUPPORT is used, require that RAS_EXTENSION is enabled
496 ifeq ($(FAULT_INJECTION_SUPPORT
),1)
497 ifneq ($(RAS_EXTENSION
),1)
498 $(error For FAULT_INJECTION_SUPPORT
, RAS_EXTENSION must also be
1)
502 # DYN_DISABLE_AUTH can be set only when TRUSTED_BOARD_BOOT=1
503 ifeq ($(DYN_DISABLE_AUTH
), 1)
504 ifeq (${TRUSTED_BOARD_BOOT}, 0)
505 $(error
"TRUSTED_BOARD_BOOT must be enabled for DYN_DISABLE_AUTH to be set.")
509 # If pointer authentication is used in the firmware, make sure that all the
510 # registers associated to it are also saved and restored.
511 # Not doing it would leak the value of the keys used by EL3 to EL1 and S-EL1.
512 ifeq ($(ENABLE_PAUTH
),1)
513 ifeq ($(CTX_INCLUDE_PAUTH_REGS
),0)
514 $(error Pointer Authentication requires CTX_INCLUDE_PAUTH_REGS
=1)
518 ifeq ($(CTX_INCLUDE_PAUTH_REGS
),1)
519 ifneq (${ARCH},aarch64
)
520 $(error CTX_INCLUDE_PAUTH_REGS requires AArch64
)
522 $(info CTX_INCLUDE_PAUTH_REGS is an experimental feature
)
526 ifeq ($(ENABLE_PAUTH
),1)
527 $(info Pointer Authentication is an experimental feature
)
530 ifeq ($(ENABLE_BTI
),1)
531 $(info Branch Protection is an experimental feature
)
534 ifeq ($(CTX_INCLUDE_MTE_REGS
),1)
535 ifneq (${ARCH},aarch64
)
536 $(error CTX_INCLUDE_MTE_REGS requires AArch64
)
538 $(info CTX_INCLUDE_MTE_REGS is an experimental feature
)
542 ################################################################################
543 # Process platform overrideable behaviour
544 ################################################################################
546 # Using BL2 implies that a BL33 image also needs to be supplied for the FIP and
547 # Certificate generation tools. This flag can be overridden by the platform.
549 ifdef EL3_PAYLOAD_BASE
550 # If booting an EL3 payload there is no need for a BL33 image
554 ifdef PRELOADED_BL33_BASE
555 # If booting a BL33 preloaded image there is no need of
556 # another one in the FIP file.
564 # If SCP_BL2 is given, we always want FIP to include it.
569 # For AArch32, BL31 is not currently supported.
570 ifneq (${ARCH},aarch32
)
572 # When booting an EL3 payload, there is no need to compile the BL31 image nor
574 ifndef EL3_PAYLOAD_BASE
580 # Process TBB related flags
581 ifneq (${GENERATE_COT},0)
582 # Common cert_create options
583 ifneq (${CREATE_KEYS},0)
584 $(eval CRT_ARGS
+= -n
)
585 $(eval FWU_CRT_ARGS
+= -n
)
586 ifneq (${SAVE_KEYS},0)
587 $(eval CRT_ARGS
+= -k
)
588 $(eval FWU_CRT_ARGS
+= -k
)
591 # Include TBBR makefile (unless the platform indicates otherwise)
592 ifeq (${INCLUDE_TBBR_MK},1)
593 include make_helpers
/tbbr
/tbbr_tools.mk
597 ifneq (${FIP_ALIGN},0)
598 FIP_ARGS
+= --align
${FIP_ALIGN}
601 ################################################################################
602 # Include libraries' Makefile that are used in all BL
603 ################################################################################
605 include lib
/stack_protector
/stack_protector.mk
607 ################################################################################
608 # Auxiliary tools (fiptool, cert_create, etc)
609 ################################################################################
611 # Variables for use with Certificate Generation Tool
612 CRTTOOLPATH ?
= tools
/cert_create
613 CRTTOOL ?
= ${CRTTOOLPATH}/cert_create
${BIN_EXT}
615 # Variables for use with Firmware Image Package
616 FIPTOOLPATH ?
= tools
/fiptool
617 FIPTOOL ?
= ${FIPTOOLPATH}/fiptool
${BIN_EXT}
619 # Variables for use with sptool
620 SPTOOLPATH ?
= tools
/sptool
621 SPTOOL ?
= ${SPTOOLPATH}/sptool
${BIN_EXT}
623 # Variables for use with ROMLIB
624 ROMLIBPATH ?
= lib
/romlib
626 ################################################################################
627 # Include BL specific makefiles
628 ################################################################################
644 ifeq (${NEED_BL31},yes
)
654 ################################################################################
655 # Build options checks
656 ################################################################################
658 $(eval
$(call assert_boolean
,COLD_BOOT_SINGLE_CPU
))
659 $(eval
$(call assert_boolean
,CREATE_KEYS
))
660 $(eval
$(call assert_boolean
,CTX_INCLUDE_AARCH32_REGS
))
661 $(eval
$(call assert_boolean
,CTX_INCLUDE_FPREGS
))
662 $(eval
$(call assert_boolean
,CTX_INCLUDE_PAUTH_REGS
))
663 $(eval
$(call assert_boolean
,CTX_INCLUDE_MTE_REGS
))
664 $(eval
$(call assert_boolean
,DEBUG
))
665 $(eval
$(call assert_boolean
,DYN_DISABLE_AUTH
))
666 $(eval
$(call assert_boolean
,EL3_EXCEPTION_HANDLING
))
667 $(eval
$(call assert_boolean
,ENABLE_AMU
))
668 $(eval
$(call assert_boolean
,ENABLE_ASSERTIONS
))
669 $(eval
$(call assert_boolean
,ENABLE_MPAM_FOR_LOWER_ELS
))
670 $(eval
$(call assert_boolean
,ENABLE_PIE
))
671 $(eval
$(call assert_boolean
,ENABLE_PMF
))
672 $(eval
$(call assert_boolean
,ENABLE_PSCI_STAT
))
673 $(eval
$(call assert_boolean
,ENABLE_RUNTIME_INSTRUMENTATION
))
674 $(eval
$(call assert_boolean
,ENABLE_SPE_FOR_LOWER_ELS
))
675 $(eval
$(call assert_boolean
,ENABLE_SPM
))
676 $(eval
$(call assert_boolean
,ENABLE_SVE_FOR_NS
))
677 $(eval
$(call assert_boolean
,ERROR_DEPRECATED
))
678 $(eval
$(call assert_boolean
,FAULT_INJECTION_SUPPORT
))
679 $(eval
$(call assert_boolean
,GENERATE_COT
))
680 $(eval
$(call assert_boolean
,GICV2_G0_FOR_EL3
))
681 $(eval
$(call assert_boolean
,HANDLE_EA_EL3_FIRST
))
682 $(eval
$(call assert_boolean
,HW_ASSISTED_COHERENCY
))
683 $(eval
$(call assert_boolean
,NS_TIMER_SWITCH
))
684 $(eval
$(call assert_boolean
,OVERRIDE_LIBC
))
685 $(eval
$(call assert_boolean
,PL011_GENERIC_UART
))
686 $(eval
$(call assert_boolean
,PROGRAMMABLE_RESET_ADDRESS
))
687 $(eval
$(call assert_boolean
,PSCI_EXTENDED_STATE_ID
))
688 $(eval
$(call assert_boolean
,RAS_EXTENSION
))
689 $(eval
$(call assert_boolean
,RESET_TO_BL31
))
690 $(eval
$(call assert_boolean
,SAVE_KEYS
))
691 $(eval
$(call assert_boolean
,SEPARATE_CODE_AND_RODATA
))
692 $(eval
$(call assert_boolean
,SPIN_ON_BL1_EXIT
))
693 $(eval
$(call assert_boolean
,SPM_MM
))
694 $(eval
$(call assert_boolean
,TRUSTED_BOARD_BOOT
))
695 $(eval
$(call assert_boolean
,USE_COHERENT_MEM
))
696 $(eval
$(call assert_boolean
,USE_ROMLIB
))
697 $(eval
$(call assert_boolean
,USE_TBBR_DEFS
))
698 $(eval
$(call assert_boolean
,WARMBOOT_ENABLE_DCACHE_EARLY
))
699 $(eval
$(call assert_boolean
,BL2_AT_EL3
))
700 $(eval
$(call assert_boolean
,BL2_IN_XIP_MEM
))
701 $(eval
$(call assert_boolean
,BL2_INV_DCACHE
))
702 $(eval
$(call assert_boolean
,USE_SPINLOCK_CAS
))
704 $(eval
$(call assert_numeric
,ARM_ARCH_MAJOR
))
705 $(eval
$(call assert_numeric
,ARM_ARCH_MINOR
))
706 $(eval
$(call assert_numeric
,BRANCH_PROTECTION
))
709 $(eval
$(call assert_numeric
,KEY_SIZE
))
712 ifeq ($(filter $(SANITIZE_UB
), on off trap
),)
713 $(error
"Invalid value for SANITIZE_UB: can be one of on, off, trap")
716 ################################################################################
717 # Add definitions to the cpp preprocessor based on the current build options.
718 # This is done after including the platform specific makefile to allow the
719 # platform to overwrite the default options
720 ################################################################################
722 $(eval
$(call add_define
,ARM_ARCH_MAJOR
))
723 $(eval
$(call add_define
,ARM_ARCH_MINOR
))
724 $(eval
$(call add_define
,COLD_BOOT_SINGLE_CPU
))
725 $(eval
$(call add_define
,CTX_INCLUDE_AARCH32_REGS
))
726 $(eval
$(call add_define
,CTX_INCLUDE_FPREGS
))
727 $(eval
$(call add_define
,CTX_INCLUDE_PAUTH_REGS
))
728 $(eval
$(call add_define
,EL3_EXCEPTION_HANDLING
))
729 $(eval
$(call add_define
,CTX_INCLUDE_MTE_REGS
))
730 $(eval
$(call add_define
,ENABLE_AMU
))
731 $(eval
$(call add_define
,ENABLE_ASSERTIONS
))
732 $(eval
$(call add_define
,ENABLE_BTI
))
733 $(eval
$(call add_define
,ENABLE_MPAM_FOR_LOWER_ELS
))
734 $(eval
$(call add_define
,ENABLE_PAUTH
))
735 $(eval
$(call add_define
,ENABLE_PIE
))
736 $(eval
$(call add_define
,ENABLE_PMF
))
737 $(eval
$(call add_define
,ENABLE_PSCI_STAT
))
738 $(eval
$(call add_define
,ENABLE_RUNTIME_INSTRUMENTATION
))
739 $(eval
$(call add_define
,ENABLE_SPE_FOR_LOWER_ELS
))
740 $(eval
$(call add_define
,ENABLE_SPM
))
741 $(eval
$(call add_define
,ENABLE_SVE_FOR_NS
))
742 $(eval
$(call add_define
,ERROR_DEPRECATED
))
743 $(eval
$(call add_define
,FAULT_INJECTION_SUPPORT
))
744 $(eval
$(call add_define
,GICV2_G0_FOR_EL3
))
745 $(eval
$(call add_define
,HANDLE_EA_EL3_FIRST
))
746 $(eval
$(call add_define
,HW_ASSISTED_COHERENCY
))
747 $(eval
$(call add_define
,LOG_LEVEL
))
748 $(eval
$(call add_define
,NS_TIMER_SWITCH
))
749 $(eval
$(call add_define
,PL011_GENERIC_UART
))
750 $(eval
$(call add_define
,PLAT_
${PLAT}))
751 $(eval
$(call add_define
,PROGRAMMABLE_RESET_ADDRESS
))
752 $(eval
$(call add_define
,PSCI_EXTENDED_STATE_ID
))
753 $(eval
$(call add_define
,RAS_EXTENSION
))
754 $(eval
$(call add_define
,RESET_TO_BL31
))
755 $(eval
$(call add_define
,SEPARATE_CODE_AND_RODATA
))
756 $(eval
$(call add_define
,RECLAIM_INIT_CODE
))
757 $(eval
$(call add_define
,SPD_
${SPD}))
758 $(eval
$(call add_define
,SPIN_ON_BL1_EXIT
))
759 $(eval
$(call add_define
,SPM_MM
))
760 $(eval
$(call add_define
,TRUSTED_BOARD_BOOT
))
761 $(eval
$(call add_define
,USE_COHERENT_MEM
))
762 $(eval
$(call add_define
,USE_ROMLIB
))
763 $(eval
$(call add_define
,USE_TBBR_DEFS
))
764 $(eval
$(call add_define
,WARMBOOT_ENABLE_DCACHE_EARLY
))
765 $(eval
$(call add_define
,BL2_AT_EL3
))
766 $(eval
$(call add_define
,BL2_IN_XIP_MEM
))
767 $(eval
$(call add_define
,BL2_INV_DCACHE
))
768 $(eval
$(call add_define
,USE_SPINLOCK_CAS
))
770 ifeq (${SANITIZE_UB},trap
)
771 $(eval
$(call add_define
,MONITOR_TRAPS
))
774 # Define the EL3_PAYLOAD_BASE flag only if it is provided.
775 ifdef EL3_PAYLOAD_BASE
776 $(eval
$(call add_define
,EL3_PAYLOAD_BASE
))
778 # Define the PRELOADED_BL33_BASE flag only if it is provided and
779 # EL3_PAYLOAD_BASE is not defined, as it has priority.
780 ifdef PRELOADED_BL33_BASE
781 $(eval
$(call add_define
,PRELOADED_BL33_BASE
))
785 # Define the DYN_DISABLE_AUTH flag only if set.
786 ifeq (${DYN_DISABLE_AUTH},1)
787 $(eval
$(call add_define
,DYN_DISABLE_AUTH
))
790 ifneq ($(findstring armlink
,$(notdir $(LD
))),)
791 $(eval
$(call add_define
,USE_ARM_LINK
))
794 ################################################################################
796 ################################################################################
798 .PHONY
: all msg_start
clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool sptool fip fwu_fip certtool dtbs
804 @echo
"Building ${PLAT}"
806 ifeq (${ERROR_DEPRECATED},0)
807 # Check if deprecated declarations and cpp warnings should be treated as error or not.
808 ifneq ($(findstring clang
,$(notdir $(CC
))),)
809 CPPFLAGS
+= -Wno-error
=deprecated-declarations
811 CPPFLAGS
+= -Wno-error
=deprecated-declarations
-Wno-error
=cpp
813 # __ASSEMBLY__ is deprecated in favor of the compiler-builtin __ASSEMBLER__.
814 ASFLAGS
+= -D__ASSEMBLY__
815 # AARCH32/AARCH64 macros are deprecated in favor of the compiler-builtin __aarch64__.
816 ifeq (${ARCH},aarch32
)
817 $(eval
$(call add_define
,AARCH32
))
819 $(eval
$(call add_define
,AARCH64
))
821 endif # !ERROR_DEPRECATED
823 $(eval
$(call MAKE_LIB_DIRS
))
824 $(eval
$(call MAKE_LIB
,c
))
826 # Expand build macros for the different images
827 ifeq (${NEED_BL1},yes
)
828 $(eval
$(call MAKE_BL
,1))
831 ifeq (${NEED_BL2},yes
)
832 ifeq (${BL2_AT_EL3}, 0)
833 FIP_BL2_ARGS
:= tb-fw
836 $(if
${BL2}, $(eval
$(call TOOL_ADD_IMG
,bl2
,--${FIP_BL2_ARGS})),\
837 $(eval
$(call MAKE_BL
,2,${FIP_BL2_ARGS})))
840 ifeq (${NEED_SCP_BL2},yes
)
841 $(eval
$(call TOOL_ADD_IMG
,scp_bl2
,--scp-fw
))
844 ifeq (${NEED_BL31},yes
)
845 BL31_SOURCES
+= ${SPD_SOURCES}
846 $(if
${BL31}, $(eval
$(call TOOL_ADD_IMG
,bl31
,--soc-fw
)),\
847 $(eval
$(call MAKE_BL
,31,soc-fw
)))
850 # If a BL32 image is needed but neither BL32 nor BL32_SOURCES is defined, the
851 # build system will call TOOL_ADD_IMG to print a warning message and abort the
852 # process. Note that the dependency on BL32 applies to the FIP only.
853 ifeq (${NEED_BL32},yes
)
855 BUILD_BL32
:= $(if
$(BL32
),,$(if
$(BL32_SOURCES
),1))
857 $(if
${BUILD_BL32}, $(eval
$(call MAKE_BL
,32,tos-fw
)),\
858 $(eval
$(call TOOL_ADD_IMG
,bl32
,--tos-fw
)))
861 # Add the BL33 image if required by the platform
862 ifeq (${NEED_BL33},yes
)
863 $(eval
$(call TOOL_ADD_IMG
,bl33
,--nt-fw
))
866 ifeq (${NEED_BL2U},yes
)
867 $(if
${BL2U}, $(eval
$(call TOOL_ADD_IMG
,bl2u
,--ap-fwu-cfg
,FWU_
)),\
868 $(eval
$(call MAKE_BL
,2u,ap-fwu-cfg
,FWU_
)))
871 # Expand build macros for the different images
872 ifeq (${NEED_FDT},yes
)
873 $(eval
$(call MAKE_DTBS
,$(BUILD_PLAT
)/fdts
,$(FDT_SOURCES
)))
878 $(error
"Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/scripts/checkpatch.pl")
880 ifeq (,$(wildcard ${CHECKPATCH}))
881 $(error
"The file CHECKPATCH points to cannot be found, use eg: CHECKPATCH=../linux/scripts/checkpatch.pl")
887 $(call SHELL_REMOVE_DIR
,${BUILD_PLAT})
888 ${Q}${MAKE} --no-print-directory
-C
${FIPTOOLPATH} clean
889 ${Q}${MAKE} PLAT
=${PLAT} --no-print-directory
-C
${CRTTOOLPATH} clean
890 ${Q}${MAKE} --no-print-directory
-C
${ROMLIBPATH} clean
894 $(call SHELL_REMOVE_DIR
,${BUILD_BASE})
895 $(call SHELL_DELETE_ALL
, ${CURDIR}/cscope.
*)
896 ${Q}${MAKE} --no-print-directory
-C
${FIPTOOLPATH} clean
897 ${Q}${MAKE} --no-print-directory
-C
${SPTOOLPATH} clean
898 ${Q}${MAKE} PLAT
=${PLAT} --no-print-directory
-C
${CRTTOOLPATH} clean
899 ${Q}${MAKE} --no-print-directory
-C
${ROMLIBPATH} clean
901 checkcodebase
: locate-checkpatch
902 @echo
" CHECKING STYLE"
903 @if
test -d .git
; then \
904 git ls-files | grep
-E
-v
'libfdt|libc|docs|\.rst' | \
905 while read GIT_FILE
; \
906 do
${CHECKPATCH} ${CHECKCODE_ARGS} -f
$$GIT_FILE ; \
909 find .
-type f
-not
-iwholename
"*.git*" \
910 -not
-iwholename
"*build*" \
911 -not
-iwholename
"*libfdt*" \
912 -not
-iwholename
"*libc*" \
913 -not
-iwholename
"*docs*" \
914 -not
-iwholename
"*.rst" \
915 -exec
${CHECKPATCH} ${CHECKCODE_ARGS} -f
{} \
; ; \
918 checkpatch
: locate-checkpatch
919 @echo
" CHECKING STYLE"
920 @if
test -n
"${CHECKPATCH_OPTS}"; then \
921 echo
" with ${CHECKPATCH_OPTS} option(s)"; \
923 ${Q}COMMON_COMMIT
=$$(git merge-base HEAD
${BASE_COMMIT}); \
924 for commit in
`git rev-list $$COMMON_COMMIT..HEAD`; do \
925 printf
"\n[*] Checking style of '$$commit'\n\n"; \
926 git log
--format
=email
"$$commit~..$$commit" \
927 -- ${CHECK_PATHS} | \
928 ${CHECKPATCH} ${CHECKPATCH_OPTS} - || true
; \
929 git diff
--format
=email
"$$commit~..$$commit" \
930 -- ${CHECK_PATHS} | \
931 ${CHECKPATCH} ${CHECKPATCH_OPTS} - || true
; \
938 ${Q}${MAKE} PLAT
=${PLAT} USE_TBBR_DEFS
=${USE_TBBR_DEFS} --no-print-directory
-C
${CRTTOOLPATH}
940 @echo
"Built $@ successfully"
943 ifneq (${GENERATE_COT},0)
944 certificates
: ${CRT_DEPS} ${CRTTOOL}
945 ${Q}${CRTTOOL} ${CRT_ARGS}
947 @echo
"Built $@ successfully"
948 @echo
"Certificates can be found in ${BUILD_PLAT}"
952 ${BUILD_PLAT}/${FIP_NAME}: ${FIP_DEPS} ${FIPTOOL}
953 ${Q}${FIPTOOL} create
${FIP_ARGS} $@
954 ${Q}${FIPTOOL} info $@
956 @echo
"Built $@ successfully"
959 ifneq (${GENERATE_COT},0)
960 fwu_certificates
: ${FWU_CRT_DEPS} ${CRTTOOL}
961 ${Q}${CRTTOOL} ${FWU_CRT_ARGS}
963 @echo
"Built $@ successfully"
964 @echo
"FWU certificates can be found in ${BUILD_PLAT}"
968 ${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP_DEPS} ${FIPTOOL}
969 ${Q}${FIPTOOL} create
${FWU_FIP_ARGS} $@
970 ${Q}${FIPTOOL} info $@
972 @echo
"Built $@ successfully"
976 fip
: ${BUILD_PLAT}/${FIP_NAME}
977 fwu_fip
: ${BUILD_PLAT}/${FWU_FIP_NAME}
981 ${Q}${MAKE} CPPFLAGS
="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory
-C
${FIPTOOLPATH}
986 ${Q}${MAKE} CPPFLAGS
="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory
-C
${SPTOOLPATH}
989 romlib.bin
: libraries
990 ${Q}${MAKE} PLAT_DIR
=${PLAT_DIR} BUILD_PLAT
=${BUILD_PLAT} ENABLE_BTI
=${ENABLE_BTI} ARM_ARCH_MINOR
=${ARM_ARCH_MINOR} INCLUDES
='${INCLUDES}' DEFINES
='${DEFINES}' --no-print-directory
-C
${ROMLIBPATH} all
994 ${Q}find
${CURDIR} -name
"*.[chsS]" > cscope.files
998 @echo
"usage: ${MAKE} [PLAT=<platform>] [OPTIONS] [TARGET]"
1000 @echo
"PLAT is used to specify which platform you wish to build."
1001 @echo
"If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
1003 @echo
"platform = ${PLATFORM_LIST}"
1005 @echo
"Please refer to the User Guide for a list of all supported options."
1006 @echo
"Note that the build system doesn't track dependencies for build "
1007 @echo
"options. Therefore, if any of the build options are changed "
1008 @echo
"from a previous build, a clean build must be performed."
1010 @echo
"Supported Targets:"
1011 @echo
" all Build all individual bootloader binaries"
1012 @echo
" bl1 Build the BL1 binary"
1013 @echo
" bl2 Build the BL2 binary"
1014 @echo
" bl2u Build the BL2U binary"
1015 @echo
" bl31 Build the BL31 binary"
1016 @echo
" bl32 Build the BL32 binary. If ARCH=aarch32, then "
1017 @echo
" this builds secure payload specified by AARCH32_SP"
1018 @echo
" certificates Build the certificates (requires 'GENERATE_COT=1')"
1019 @echo
" fip Build the Firmware Image Package (FIP)"
1020 @echo
" fwu_fip Build the FWU Firmware Image Package (FIP)"
1021 @echo
" checkcodebase Check the coding style of the entire source tree"
1022 @echo
" checkpatch Check the coding style on changes in the current"
1023 @echo
" branch against BASE_COMMIT (default origin/master)"
1024 @echo
" clean Clean the build for the selected platform"
1025 @echo
" cscope Generate cscope index"
1026 @echo
" distclean Remove all build artifacts for all platforms"
1027 @echo
" certtool Build the Certificate generation tool"
1028 @echo
" fiptool Build the Firmware Image Package (FIP) creation tool"
1029 @echo
" sptool Build the Secure Partition Package creation tool"
1030 @echo
" dtbs Build the Device Tree Blobs (if required for the platform)"
1032 @echo
"Note: most build targets require PLAT to be set to a specific platform."
1034 @echo
"example: build all targets for the FVP platform:"
1035 @echo
" CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"