blob: 9299a86c5982367198a6a90dd6f6467552e71b71 [file] [log] [blame]
Pascal Brandd6536da2015-09-01 10:38:43 +02001#
2# Common definition to all platforms
3#
4
Roland Nagy206aa462020-06-24 18:04:45 +02005# Set a variable or error out if it was previously set to a different value
6# The reason message (3rd parameter) is optional
7# Example:
8# $(call force,CFG_FOO,foo,required by CFG_BAR)
9define force
10$(eval $(call _force,$(1),$(2),$(3)))
11endef
12
13define _force
14ifdef $(1)
15ifneq ($($(1)),$(2))
16ifneq (,$(3))
17_reason := $$(_empty) [$(3)]
18endif
19$$(error $(1) is set to '$($(1))' (from $(origin $(1))) but its value must be '$(2)'$$(_reason))
20endif
21endif
22$(1) := $(2)
23endef
24
Jens Wiklander650f2982017-04-05 10:08:59 +020025SHELL := bash
Pascal Brand070d9552015-09-01 15:33:22 +020026BASH ?= bash
Imre Kisdc34f492023-04-11 16:53:06 +020027PYTHON3 ?= python3
Pascal Brandd6536da2015-09-01 10:38:43 +020028ROOT ?= $(shell pwd)/..
29
Jens Wiklander68f7f8d2021-06-07 16:02:24 +000030UNAME_M := $(shell uname -m)
Philip Attfield3f9250f2016-09-14 07:43:32 +020031BUILD_PATH ?= $(ROOT)/build
Pascal Brandd6536da2015-09-01 10:38:43 +020032LINUX_PATH ?= $(ROOT)/linux
Ruchika Gupta02eaba72021-06-14 20:54:40 +053033UBOOT_PATH ?= $(ROOT)/u-boot
Sadiq Hussain3412e522022-02-10 10:34:09 +053034BENCHMARK_APP_PATH ?= $(ROOT)/optee_benchmark
Pascal Brandd6536da2015-09-01 10:38:43 +020035OPTEE_OS_PATH ?= $(ROOT)/optee_os
36OPTEE_CLIENT_PATH ?= $(ROOT)/optee_client
Pascal Brandd6536da2015-09-01 10:38:43 +020037OPTEE_TEST_PATH ?= $(ROOT)/optee_test
Igor Opaniuk584efe52017-08-07 01:41:48 +030038OPTEE_EXAMPLES_PATH ?= $(ROOT)/optee_examples
Rong Fan19a58f02021-09-10 04:38:25 -070039OPTEE_RUST_PATH ?= $(ROOT)/optee_rust
Jens Wiklander88d027c2018-05-09 10:12:03 +020040BUILDROOT_TARGET_ROOT ?= $(ROOT)/out-br/target
Pascal Brandd6536da2015-09-01 10:38:43 +020041
Etienne Carrierecc23f6b2016-10-21 10:16:00 +020042# default high verbosity. slow uarts shall specify lower if prefered
Pascal Brand23ef2052016-03-09 15:25:01 +010043CFG_TEE_CORE_LOG_LEVEL ?= 3
44
Igor Opaniuk27edfc72016-10-25 18:33:54 +030045# default disable latency benchmarks (over all OP-TEE layers)
Igor Opaniuk36ff2a32018-01-04 11:40:10 +020046CFG_TEE_BENCHMARK ?= n
Igor Opaniuk27edfc72016-10-25 18:33:54 +030047
Jerome Forissier1c146e42020-11-10 17:24:05 +010048# optee_test
49WITH_TLS_TESTS ?= y
Jerome Forissier0170c6c2020-11-10 17:24:05 +010050ifneq ($(COMPILER),clang)
51# assuming GCC toolchain from toolchain.mk
52WITH_CXX_TESTS ?= y
53endif
Jerome Forissier1c146e42020-11-10 17:24:05 +010054
Pascal Brandd6536da2015-09-01 10:38:43 +020055CCACHE ?= $(shell which ccache) # Don't remove this comment (space is needed)
56
Roland Nagy206aa462020-06-24 18:04:45 +020057# QEMU shared folders settings
58#
59# TL;DR:
60# 1) make QEMU_VIRTFS_AUTOMOUNT=y run
61# will mount the project's root on the host as /mnt/host in QEMU.
62# 2) mkdir -p /tmp/qemu-data-tee && make QEMU_PSS_AUTOMOUNT=y run
63# will mount the host directory /tmp/qemu-data-tee as /data/tee
64# in QEMU, thus creating persistent secure storage.
65
66ifeq ($(QEMU_VIRTFS_AUTOMOUNT),y)
67$(call force,QEMU_VIRTFS_ENABLE,y,required by QEMU_VIRTFS_AUTOMOUNT)
68endif
69
70ifeq ($(QEMU_PSS_AUTOMOUNT),y)
71$(call force,QEMU_PSS_ENABLE,y,required by QEMU_PSS_AUTOMOUNT)
72endif
73
74ifeq ($(QEMU_PSS_ENABLE),y)
75$(call force,QEMU_VIRTFS_ENABLE,y,required by QEMU_PSS_ENABLE)
76endif
77
Igor Opaniuk97d05292016-10-26 14:46:14 +030078# Accessing a shared folder on the host from QEMU:
79# # Set QEMU_VIRTFS_ENABLE to 'y' and adjust QEMU_VIRTFS_HOST_DIR
80# # Then in QEMU, run:
81# # $ mount -t 9p -o trans=virtio host <mount_point>
Roland Nagy206aa462020-06-24 18:04:45 +020082# # Or enable QEMU_VIRTFS_AUTOMOUNT
83QEMU_VIRTFS_ENABLE ?= n
Igor Opaniuk97d05292016-10-26 14:46:14 +030084QEMU_VIRTFS_HOST_DIR ?= $(ROOT)
Pascal Brand6044eb52016-02-23 15:48:31 +010085
Roland Nagy206aa462020-06-24 18:04:45 +020086# Persistent Secure Storage via shared folder
87# # Set QEMU_PSS_ENABLE to 'y' and adjust QEMU_PSS_HOST_DIR
88# # Then in QEMU, run:
89# # $ mount -t 9p -o trans=virtio secure /data/tee
90# # Or enable QEMU_PSS_AUTOMOUNT
91QEMU_PSS_ENABLE ?= n
92QEMU_PSS_HOST_DIR ?= /tmp/qemu-data-tee
93
94# Warning: when these variables are modified, you must remake the buildroot
95# target directory. This can be done without rebuilding everything as follows:
96# rm -rf ../out-br/target; find ../out-br/ -name .stamp_target_installed | xargs rm
97# make <flags> run
98QEMU_VIRTFS_AUTOMOUNT ?= n
99QEMU_PSS_AUTOMOUNT ?= n
100# Mount point for the shared directory inside QEMU
101# Used by the post-build script, this is written to /etc/fstab as the mount
102# point of the shared directory
103QEMU_VIRTFS_MOUNTPOINT ?= /mnt/host
104
105# End of QEMU shared folder settings
106
Igor Opaniukbbcf27d2017-09-13 13:12:51 +0300107################################################################################
108# Mandatory for autotools (for specifying --host)
109################################################################################
110ifeq ($(COMPILE_NS_USER),64)
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000111ifeq ($(UNAME_M),x86_64)
Igor Opaniukbbcf27d2017-09-13 13:12:51 +0300112MULTIARCH := aarch64-linux-gnu
Sumit Garg495dc6a2021-12-23 14:45:36 +0530113else ifeq ($(UNAME_M),aarch64)
114MULTIARCH := aarch64-linux
Igor Opaniukbbcf27d2017-09-13 13:12:51 +0300115else
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000116MULTIARCH := aarch64-linux
117endif
118else
119ifeq ($(UNAME_M),x86_64)
Igor Opaniukbbcf27d2017-09-13 13:12:51 +0300120MULTIARCH := arm-linux-gnueabihf
Sumit Garg495dc6a2021-12-23 14:45:36 +0530121else ifeq ($(UNAME_M),aarch64)
122MULTIARCH := arm-linux-gnueabihf
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000123else
124MULTIARCH := arm-linux
125endif
Igor Opaniukbbcf27d2017-09-13 13:12:51 +0300126endif
127
Pascal Brand6044eb52016-02-23 15:48:31 +0100128################################################################################
129# Check coherency of compilation mode
130################################################################################
131
132ifneq ($(COMPILE_NS_USER),)
133ifeq ($(COMPILE_NS_KERNEL),)
134$(error COMPILE_NS_KERNEL must be defined as COMPILE_NS_USER=$(COMPILE_NS_USER) is defined)
135endif
136ifeq (,$(filter $(COMPILE_NS_USER),32 64))
137$(error COMPILE_NS_USER=$(COMPILE_NS_USER) - Should be 32 or 64)
138endif
139endif
140
141ifneq ($(COMPILE_NS_KERNEL),)
142ifeq ($(COMPILE_NS_USER),)
143$(error COMPILE_NS_USER must be defined as COMPILE_NS_KERNEL=$(COMPILE_NS_KERNEL) is defined)
144endif
145ifeq (,$(filter $(COMPILE_NS_KERNEL),32 64))
146$(error COMPILE_NS_KERNEL=$(COMPILE_NS_KERNEL) - Should be 32 or 64)
147endif
148endif
149
150ifeq ($(COMPILE_NS_KERNEL),32)
151ifneq ($(COMPILE_NS_USER),32)
152$(error COMPILE_NS_USER=$(COMPILE_NS_USER) - Should be 32 as COMPILE_NS_KERNEL=$(COMPILE_NS_KERNEL))
153endif
154endif
155
156ifneq ($(COMPILE_S_USER),)
157ifeq ($(COMPILE_S_KERNEL),)
158$(error COMPILE_S_KERNEL must be defined as COMPILE_S_USER=$(COMPILE_S_USER) is defined)
159endif
160ifeq (,$(filter $(COMPILE_S_USER),32 64))
161$(error COMPILE_S_USER=$(COMPILE_S_USER) - Should be 32 or 64)
162endif
163endif
164
165ifneq ($(COMPILE_S_KERNEL),)
166OPTEE_OS_COMMON_EXTRA_FLAGS ?= O=out/arm
167OPTEE_OS_BIN ?= $(OPTEE_OS_PATH)/out/arm/core/tee.bin
Jens Wiklanderf7b35092017-09-01 09:05:32 +0200168OPTEE_OS_HEADER_V2_BIN ?= $(OPTEE_OS_PATH)/out/arm/core/tee-header_v2.bin
169OPTEE_OS_PAGER_V2_BIN ?= $(OPTEE_OS_PATH)/out/arm/core/tee-pager_v2.bin
170OPTEE_OS_PAGEABLE_V2_BIN ?= $(OPTEE_OS_PATH)/out/arm/core/tee-pageable_v2.bin
Pascal Brand6044eb52016-02-23 15:48:31 +0100171ifeq ($(COMPILE_S_USER),)
172$(error COMPILE_S_USER must be defined as COMPILE_S_KERNEL=$(COMPILE_S_KERNEL) is defined)
173endif
174ifeq (,$(filter $(COMPILE_S_KERNEL),32 64))
175$(error COMPILE_S_KERNEL=$(COMPILE_S_KERNEL) - Should be 32 or 64)
176endif
177endif
178
179ifeq ($(COMPILE_S_KERNEL),32)
180ifneq ($(COMPILE_S_USER),32)
181$(error COMPILE_S_USER=$(COMPILE_S_USER) - Should be 32 as COMPILE_S_KERNEL=$(COMPILE_S_KERNEL))
182endif
183endif
184
185
186################################################################################
187# set the compiler when COMPILE_xxx are defined
188################################################################################
Jens Wiklander92582b52018-03-14 09:49:29 +0100189
190
191ifeq ($(COMPILE_LEGACY),)
Pascal Brandefe56592016-03-03 10:46:52 +0100192CROSS_COMPILE_NS_USER ?= "$(CCACHE)$(AARCH$(COMPILE_NS_USER)_CROSS_COMPILE)"
193CROSS_COMPILE_NS_KERNEL ?= "$(CCACHE)$(AARCH$(COMPILE_NS_KERNEL)_CROSS_COMPILE)"
194CROSS_COMPILE_S_USER ?= "$(CCACHE)$(AARCH$(COMPILE_S_USER)_CROSS_COMPILE)"
195CROSS_COMPILE_S_KERNEL ?= "$(CCACHE)$(AARCH$(COMPILE_S_KERNEL)_CROSS_COMPILE)"
Jens Wiklander92582b52018-03-14 09:49:29 +0100196else
197CROSS_COMPILE_NS_USER ?= "$(CCACHE)$(LEGACY_AARCH$(COMPILE_NS_USER)_CROSS_COMPILE)"
198CROSS_COMPILE_NS_KERNEL ?= "$(CCACHE)$(LEGACY_AARCH$(COMPILE_NS_KERNEL)_CROSS_COMPILE)"
199CROSS_COMPILE_S_USER ?= "$(CCACHE)$(LEGACY_AARCH$(COMPILE_S_USER)_CROSS_COMPILE)"
200CROSS_COMPILE_S_KERNEL ?= "$(CCACHE)$(LEGACY_AARCH$(COMPILE_S_KERNEL)_CROSS_COMPILE)"
201endif
Pascal Brand6044eb52016-02-23 15:48:31 +0100202
203ifeq ($(COMPILE_S_USER),32)
Pascal Brand6044eb52016-02-23 15:48:31 +0100204OPTEE_OS_TA_DEV_KIT_DIR ?= $(OPTEE_OS_PATH)/out/arm/export-ta_arm32
Jens Wiklander1e36c122023-03-29 14:31:02 +0200205OPTEE_OS_COMMON_EXTRA_FLAGS += CFG_USER_TA_TARGETS=ta_arm32
Pascal Brand6044eb52016-02-23 15:48:31 +0100206endif
207ifeq ($(COMPILE_S_USER),64)
Pascal Brand6044eb52016-02-23 15:48:31 +0100208OPTEE_OS_TA_DEV_KIT_DIR ?= $(OPTEE_OS_PATH)/out/arm/export-ta_arm64
Jens Wiklander1e36c122023-03-29 14:31:02 +0200209OPTEE_OS_COMMON_EXTRA_FLAGS += CFG_USER_TA_TARGETS=ta_arm64
Pascal Brand6044eb52016-02-23 15:48:31 +0100210endif
211
Pascal Brand6044eb52016-02-23 15:48:31 +0100212ifeq ($(COMPILE_S_KERNEL),64)
Pascal Brand6044eb52016-02-23 15:48:31 +0100213OPTEE_OS_COMMON_EXTRA_FLAGS += CFG_ARM64_core=y
Jerome Forissier6347ed92020-08-27 14:45:11 +0200214else
215OPTEE_OS_COMMON_EXTRA_FLAGS += CFG_ARM64_core=n
Pascal Brand6044eb52016-02-23 15:48:31 +0100216endif
217
218
Pascal Brandd6536da2015-09-01 10:38:43 +0200219################################################################################
Pascal Brand070d9552015-09-01 15:33:22 +0200220# defines, macros, configuration etc
221################################################################################
222define KERNEL_VERSION
Jerome Forissierae45fbf2015-09-04 09:40:17 +0200223$(shell cd $(LINUX_PATH) && $(MAKE) --no-print-directory kernelversion)
Pascal Brand070d9552015-09-01 15:33:22 +0200224endef
Victor Chong3bcef442017-08-07 10:57:55 +0100225
226# Read stdin, expand ${VAR} environment variables, output to stdout
227# http://superuser.com/a/302847
228define expand-env-var
229awk '{while(match($$0,"[$$]{[^}]*}")) {var=substr($$0,RSTART+2,RLENGTH -3);gsub("[$$]{"var"}",ENVIRON[var])}}1'
230endef
231
Pascal Brand070d9552015-09-01 15:33:22 +0200232DEBUG ?= 0
233
Jerome Forissier7ee482e2020-01-07 18:05:55 +0100234# Macro to check if a compiler supports a given option
235# For example: $(call cc-option,gcc,-Wno-error=stringop-truncation,)
236# ...will return -Wno-error=stringop-truncation if gcc supports it, empty
237# otherwise.
238__cc-option = $(if $(shell $(1) $(2) -c -x c /dev/null -o /dev/null 2>&1 >/dev/null),$(3),$(2))
239_cc-opt-cached-var-name = cached-cc-option$(subst =,~,$(strip $(2)))$(subst $(empty) $(empty),,$(1))
240define _cc-option
241$(eval _cached := $(call _cc-opt-cached-var-name,$1,$2))
242$(eval $(_cached) := $(if $(filter $(origin $(_cached)),undefined),$(call __cc-option,$(1),$(2),$(3)),$($(_cached))))
243$($(_cached))
244endef
245cc-option = $(strip $(call _cc-option,$(1),$(2),$(3)))
246
Pascal Brand070d9552015-09-01 15:33:22 +0200247################################################################################
Pascal Brandcb452602015-10-13 10:46:33 +0200248# default target is all
249################################################################################
Victor Chong46f85852017-08-09 08:26:41 +0100250.PHONY: all
Pascal Brandcb452602015-10-13 10:46:33 +0200251all:
252
253################################################################################
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100254# Build root
255################################################################################
256BUILDROOT_ARCH=aarch$(COMPILE_NS_USER)
Jerome Forissier129d3df2018-08-21 09:54:43 +0200257ifeq ($(GDBSERVER),y)
258BUILDROOT_TOOLCHAIN=toolchain-br # Use toolchain supplied by buildroot
259DEFCONFIG_GDBSERVER=--br-defconfig build/br-ext/configs/gdbserver.conf
260else
261# Local toolchains (downloaded by "make toolchains")
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000262ifeq ($(UNAME_M),x86_64)
Jens Wiklander92582b52018-03-14 09:49:29 +0100263ifeq ($(COMPILE_LEGACY),)
264BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)
265else
266BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)-legacy
267endif
Sumit Garg495dc6a2021-12-23 14:45:36 +0530268else ifeq ($(UNAME_M),aarch64)
269ifeq ($(COMPILE_NS_USER),64)
270BUILDROOT_TOOLCHAIN=toolchain-aarch64-sdk
271else
272BUILDROOT_TOOLCHAIN=toolchain-aarch32
273endif
Jens Wiklander68f7f8d2021-06-07 16:02:24 +0000274else
275BUILDROOT_TOOLCHAIN=toolchain-aarch$(COMPILE_NS_USER)-sdk
276endif
Jerome Forissier129d3df2018-08-21 09:54:43 +0200277endif
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200278
Ruchika Guptaf3ca6b22021-06-15 15:38:33 +0530279ifeq ($(XEN_BOOT),y)
Jerome Forissier9b6a7a22022-05-06 16:31:05 +0200280DEFCONFIG_XEN=--br-defconfig build/br-ext/configs/xen.conf
281# The version of Xen provided by Buildroot needs a few patches to work with
282# OP-TEE
Jerome Forissier8b808912022-05-04 00:12:28 +0200283BR2_GLOBAL_PATCH_DIR=../build/br-ext/patches
Ruchika Guptaf3ca6b22021-06-15 15:38:33 +0530284endif
285
Jerome Forissiere9bff1c2022-02-14 14:12:54 +0100286BR2_PER_PACKAGE_DIRECTORIES ?= y
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200287BR2_PACKAGE_LIBOPENSSL ?= y
288BR2_PACKAGE_MMC_UTILS ?= y
289BR2_PACKAGE_OPENSSL ?= y
Etienne Carrieree1ece832019-06-06 11:42:07 +0200290BR2_PACKAGE_OPTEE_BENCHMARK_EXT ?= $(CFG_TEE_BENCHMARK)
291BR2_PACKAGE_OPTEE_BENCHMARK_EXT_SITE ?= $(BENCHMARK_APP_PATH)
292BR2_PACKAGE_OPTEE_CLIENT_EXT_SITE ?= $(OPTEE_CLIENT_PATH)
293BR2_PACKAGE_OPTEE_EXAMPLES_EXT ?= y
294BR2_PACKAGE_OPTEE_EXAMPLES_EXT_CROSS_COMPILE ?= $(CROSS_COMPILE_S_USER)
295BR2_PACKAGE_OPTEE_EXAMPLES_EXT_SDK ?= $(OPTEE_OS_TA_DEV_KIT_DIR)
296BR2_PACKAGE_OPTEE_EXAMPLES_EXT_SITE ?= $(OPTEE_EXAMPLES_PATH)
Rong Fan19a58f02021-09-10 04:38:25 -0700297OPTEE_RUST_ENABLE ?= n
298ifeq ($(OPTEE_RUST_ENABLE),y)
299BR2_PACKAGE_OPTEE_RUST_EXAMPLES_EXT ?= y
300BR2_PACKAGE_OPTEE_RUST_EXAMPLES_EXT_CROSS_COMPILE ?= $(CROSS_COMPILE_S_USER)
301BR2_PACKAGE_OPTEE_RUST_EXAMPLES_EXT_SITE ?= $(OPTEE_RUST_PATH)
Yuan Zhuang38a80b02023-02-14 12:45:19 +0000302BR2_PACKAGE_OPTEE_RUST_EXAMPLES_TC_PATH_ENV = $(ROOT)/toolchains/aarch64/bin:$(HOME)/.cargo/bin:$(PATH)
Rong Fan19a58f02021-09-10 04:38:25 -0700303endif
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200304# The OPTEE_OS package builds nothing, it just installs files into the
305# root FS when applicable (for example: shared libraries)
Etienne Carrieree1ece832019-06-06 11:42:07 +0200306BR2_PACKAGE_OPTEE_OS_EXT ?= y
307BR2_PACKAGE_OPTEE_OS_EXT_SDK ?= $(OPTEE_OS_TA_DEV_KIT_DIR)
308BR2_PACKAGE_OPTEE_OS_EXT_SITE ?= $(CURDIR)/br-ext/package/optee_os_ext
309BR2_PACKAGE_OPTEE_TEST_EXT ?= y
310BR2_PACKAGE_OPTEE_TEST_EXT_CROSS_COMPILE ?= $(CROSS_COMPILE_S_USER)
311BR2_PACKAGE_OPTEE_TEST_EXT_SDK ?= $(OPTEE_OS_TA_DEV_KIT_DIR)
312BR2_PACKAGE_OPTEE_TEST_EXT_SITE ?= $(OPTEE_TEST_PATH)
Jens Wiklander68a25e02020-06-23 15:09:20 +0200313BR2_PACKAGE_OPTEE_TEST_EXT_GP_PACKAGE := $(GP_PACKAGE)
Jerome Forissier1c146e42020-11-10 17:24:05 +0100314BR2_PACKAGE_OPTEE_TEST_EXT_WITH_TLS_TESTS := $(WITH_TLS_TESTS)
Jerome Forissier0170c6c2020-11-10 17:24:05 +0100315BR2_PACKAGE_OPTEE_TEST_EXT_WITH_CXX_TESTS := $(WITH_CXX_TESTS)
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200316BR2_PACKAGE_STRACE ?= y
Ruchika Gupta4dc75122021-06-18 12:57:52 +0530317ifeq ($(XEN_BOOT),y)
318BR2_TARGET_GENERIC_GETTY_PORT ?= "console"
319else
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200320BR2_TARGET_GENERIC_GETTY_PORT ?= $(if $(CFG_NW_CONSOLE_UART),ttyAMA$(CFG_NW_CONSOLE_UART),ttyAMA0)
Ruchika Gupta4dc75122021-06-18 12:57:52 +0530321endif
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200322
Etienne Carriere487e6e42019-10-14 20:35:39 +0200323# Embed opensc for pkcs11-tool
324BR2_PACKAGE_OPENSC ?= y
325
Sumit Garg45cf44c2021-12-24 17:02:25 +0530326# Embed keyutils for trusted-keys
327BR2_PACKAGE_KEYUTILS ?= y
328
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200329# All BR2_* variables from the makefile or the environment are appended to
330# ../out-br/extra.conf. All values are quoted "..." except y and n.
331double-quote = "#" # This really sets the variable to " and avoids upsetting vim's syntax highlighting
332streq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
333y-or-n = $(or $(call streq,y,$(1)),$(call streq,n,$(1)))
334append-var_ = echo '$(1)=$(3)'$($(1))'$(3)' >>$(2);
335append-var = $(call append-var_,$(1),$(2),$(if $(call y-or-n,$($(1))),,$(double-quote)))
336append-br2-vars = $(foreach var,$(filter BR2_%,$(.VARIABLES)),$(call append-var,$(var),$(1)))
337
Jerome Forissier243e5702022-08-19 13:12:24 +0000338ifneq (y,$(BR2_PER_PACKAGE_DIRECTORIES))
339br-make-flags := -j1
340endif
341
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100342.PHONY: buildroot
Rong Fan19a58f02021-09-10 04:38:25 -0700343buildroot: optee-os optee-rust
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100344 @mkdir -p ../out-br
345 @rm -f ../out-br/build/optee_*/.stamp_*
346 @rm -f ../out-br/extra.conf
Jerome Forissier7fbd6ce2019-09-03 11:12:45 +0200347 @$(call append-br2-vars,../out-br/extra.conf)
Imre Kisdc34f492023-04-11 16:53:06 +0200348 @(cd .. && $(PYTHON3) build/br-ext/scripts/make_def_config.py \
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100349 --br buildroot --out out-br --br-ext build/br-ext \
350 --top-dir "$(ROOT)" \
351 --br-defconfig build/br-ext/configs/optee_$(BUILDROOT_ARCH) \
352 --br-defconfig build/br-ext/configs/optee_generic \
Jens Wiklander92582b52018-03-14 09:49:29 +0100353 --br-defconfig build/br-ext/configs/$(BUILDROOT_TOOLCHAIN) \
Jerome Forissier129d3df2018-08-21 09:54:43 +0200354 $(DEFCONFIG_GDBSERVER) \
Jerome Forissier9b6a7a22022-05-06 16:31:05 +0200355 $(DEFCONFIG_XEN) \
Javier Almansa Sobrinocf568482020-02-26 11:51:45 +0000356 $(DEFCONFIG_TSS) \
357 $(DEFCONFIG_TPM_MODULE) \
358 $(DEFCONFIG_FTPM) \
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100359 --br-defconfig out-br/extra.conf \
360 --make-cmd $(MAKE))
Jerome Forissier243e5702022-08-19 13:12:24 +0000361 @$(MAKE) $(br-make-flags) -C ../out-br all
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100362
363.PHONY: buildroot-clean
364buildroot-clean:
365 @test ! -d $(ROOT)/out-br || $(MAKE) -C $(ROOT)/out-br clean
366
367.PHONY: buildroot-cleaner
368buildroot-cleaner:
369 @rm -rf $(ROOT)/out-br
370
Ruchika Guptaf3ca6b22021-06-15 15:38:33 +0530371.PHONY: buildroot-domu
372buildroot-domu: optee-os
373 @mkdir -p ../out-br-domu
374 @rm -f ../out-br-domu/build/optee_*/.stamp_*
375 @rm -f ../out-br-domu/extra.conf
376 @$(call append-br2-vars,../out-br-domu/extra.conf)
Imre Kisdc34f492023-04-11 16:53:06 +0200377 @(cd .. && $(PYTHON3) build/br-ext/scripts/make_def_config.py \
Ruchika Guptaf3ca6b22021-06-15 15:38:33 +0530378 --br buildroot --out out-br-domu --br-ext build/br-ext \
379 --top-dir "$(ROOT)" \
380 --br-defconfig build/br-ext/configs/optee_$(BUILDROOT_ARCH) \
381 --br-defconfig build/br-ext/configs/optee_generic \
382 --br-defconfig build/br-ext/configs/$(BUILDROOT_TOOLCHAIN) \
383 $(DEFCONFIG_GDBSERVER) \
384 --br-defconfig out-br-domu/extra.conf \
385 --make-cmd $(MAKE))
Jerome Forissier243e5702022-08-19 13:12:24 +0000386 @$(MAKE) $(br-make-flags) -C ../out-br-domu all
Ruchika Guptaf3ca6b22021-06-15 15:38:33 +0530387
388.PHONY: buildroot-domu-clean
389buildroot-domu-clean:
390 @test ! -d $(ROOT)/out-br-domu || $(MAKE) -C $(ROOT)/out-br-domu clean
391
392.PHONY: buildroot-domu-cleaner
393buildroot-domu-cleaner:
394 @rm -rf $(ROOT)/out-br-domu
395
Jens Wiklander07f2aed2018-02-07 13:42:18 +0100396################################################################################
Pascal Brande3d85982015-09-10 17:20:42 +0200397# Linux
398################################################################################
Igor Opaniuk27edfc72016-10-25 18:33:54 +0300399ifeq ($(CFG_TEE_BENCHMARK),y)
400LINUX_DEFCONFIG_BENCH ?= $(CURDIR)/kconfigs/tee_bench.conf
401endif
402
Pascal Brande3d85982015-09-10 17:20:42 +0200403LINUX_COMMON_FLAGS ?= LOCALVERSION= CROSS_COMPILE=$(CROSS_COMPILE_NS_KERNEL)
404
Victor Chong46f85852017-08-09 08:26:41 +0100405.PHONY: linux-common
Pascal Brande3d85982015-09-10 17:20:42 +0200406linux-common: linux-defconfig
407 $(MAKE) -C $(LINUX_PATH) $(LINUX_COMMON_FLAGS)
408
Jerome Forissiere1002382015-11-26 11:36:00 +0100409$(LINUX_PATH)/.config: $(LINUX_DEFCONFIG_COMMON_FILES)
410 cd $(LINUX_PATH) && \
411 ARCH=$(LINUX_DEFCONFIG_COMMON_ARCH) \
Ibai Erkiaga264c7d42021-08-20 14:32:13 +0100412 CROSS_COMPILE=$(CROSS_COMPILE_NS_KERNEL) \
Igor Opaniuk27edfc72016-10-25 18:33:54 +0300413 scripts/kconfig/merge_config.sh $(LINUX_DEFCONFIG_COMMON_FILES) \
414 $(LINUX_DEFCONFIG_BENCH)
Jerome Forissiere1002382015-11-26 11:36:00 +0100415
Victor Chong46f85852017-08-09 08:26:41 +0100416.PHONY: linux-defconfig-clean-common
Pascal Brande3d85982015-09-10 17:20:42 +0200417linux-defconfig-clean-common:
Victor Chong87f5fcf2015-11-26 10:52:52 +0900418 rm -f $(LINUX_PATH)/.config
Pascal Brande3d85982015-09-10 17:20:42 +0200419
Victor Chong46f85852017-08-09 08:26:41 +0100420# LINUX_CLEAN_COMMON_FLAGS should be defined in specific makefiles (hikey.mk,...)
421.PHONY: linux-clean-common
Pascal Brande3d85982015-09-10 17:20:42 +0200422linux-clean-common: linux-defconfig-clean
423 $(MAKE) -C $(LINUX_PATH) $(LINUX_CLEAN_COMMON_FLAGS) clean
424
Victor Chong46f85852017-08-09 08:26:41 +0100425# LINUX_CLEANER_COMMON_FLAGS should be defined in specific makefiles (hikey.mk,...)
426.PHONY: linux-cleaner-common
Pascal Brande3d85982015-09-10 17:20:42 +0200427linux-cleaner-common: linux-defconfig-clean
Victor Chong87f5fcf2015-11-26 10:52:52 +0900428 $(MAKE) -C $(LINUX_PATH) $(LINUX_CLEANER_COMMON_FLAGS) distclean
Pascal Brande3d85982015-09-10 17:20:42 +0200429
Pascal Brand440ef9c2015-09-08 16:01:58 +0200430################################################################################
Pascal Brand9a0f50f2015-09-08 15:34:17 +0200431# EDK2 / Tianocore
432################################################################################
Victor Chong46f85852017-08-09 08:26:41 +0100433.PHONY: edk2-common
Joakim Bechab622612017-11-15 10:45:28 +0100434edk2-common:
Joakim Bechc94e95a2017-11-25 11:06:50 +0100435 $(call edk2-env) && \
436 export PACKAGES_PATH=$(EDK2_PATH):$(EDK2_PLATFORMS_PATH) && \
Joakim Bechab622612017-11-15 10:45:28 +0100437 source $(EDK2_PATH)/edksetup.sh && \
438 $(MAKE) -j1 -C $(EDK2_PATH)/BaseTools && \
439 $(call edk2-call) all
Pascal Brand9a0f50f2015-09-08 15:34:17 +0200440
Victor Chong46f85852017-08-09 08:26:41 +0100441.PHONY: edk2-clean-common
Pascal Brand9a0f50f2015-09-08 15:34:17 +0200442edk2-clean-common:
Joakim Bechc94e95a2017-11-25 11:06:50 +0100443 $(call edk2-env) && \
Jerome Forissier9a1e0282021-03-17 10:49:11 +0100444 export PACKAGES_PATH=$(EDK2_PATH):$(EDK2_PLATFORMS_PATH) && \
Joakim Bechab622612017-11-15 10:45:28 +0100445 source $(EDK2_PATH)/edksetup.sh && \
446 $(MAKE) -j1 -C $(EDK2_PATH)/BaseTools clean && \
447 $(call edk2-call) cleanall
Victor Chong46f85852017-08-09 08:26:41 +0100448
Igor Opaniuk97d05292016-10-26 14:46:14 +0300449################################################################################
450# QEMU / QEMUv8
451################################################################################
Jerome Forissier1dace422021-02-01 09:16:22 +0100452QEMU_CONFIGURE_PARAMS_COMMON = --cc="$(CCACHE)gcc" --extra-cflags="-Wno-error" \
453 --disable-docs
Albert Schwarzkopfd6b17812019-12-22 23:40:59 +0100454QEMU_EXTRA_ARGS +=\
455 -object rng-random,filename=/dev/urandom,id=rng0 \
456 -device virtio-rng-pci,rng=rng0,max-bytes=1024,period=1000
Pascal Brand9a0f50f2015-09-08 15:34:17 +0200457
Igor Opaniuk97d05292016-10-26 14:46:14 +0300458ifeq ($(QEMU_VIRTFS_ENABLE),y)
Jerome Forissier23b41312016-11-12 16:02:01 +0100459QEMU_CONFIGURE_PARAMS_COMMON += --enable-virtfs
Igor Opaniuk97d05292016-10-26 14:46:14 +0300460QEMU_EXTRA_ARGS +=\
461 -fsdev local,id=fsdev0,path=$(QEMU_VIRTFS_HOST_DIR),security_model=none \
462 -device virtio-9p-device,fsdev=fsdev0,mount_tag=host
Roland Nagy206aa462020-06-24 18:04:45 +0200463ifeq ($(QEMU_PSS_ENABLE),y)
464QEMU_EXTRA_ARGS +=\
Christoph Gellner4e1b0bd2021-06-24 14:32:37 +0200465 -fsdev local,id=fsdev1,path=$(QEMU_PSS_HOST_DIR),security_model=mapped-xattr \
Roland Nagy206aa462020-06-24 18:04:45 +0200466 -device virtio-9p-device,fsdev=fsdev1,mount_tag=secure
467endif
Igor Opaniuk97d05292016-10-26 14:46:14 +0300468endif
Igor Opaniuk0aea4ef2017-01-13 12:52:00 +0200469
Jerome Forissier129d3df2018-08-21 09:54:43 +0200470ifeq ($(GDBSERVER),y)
471HOSTFWD := ,hostfwd=tcp::12345-:12345
472endif
Jerome Forissier5e35a052018-08-21 10:01:32 +0200473# Enable QEMU SLiRP user networking
Jerome Forissier129d3df2018-08-21 09:54:43 +0200474QEMU_EXTRA_ARGS +=\
475 -netdev user,id=vmnic$(HOSTFWD) -device virtio-net-device,netdev=vmnic
Jerome Forissierefd56292017-01-31 17:46:10 +0100476
477define run-help
478 @echo
479 @echo \* QEMU is now waiting to start the execution
480 @echo \* Start execution with either a \'c\' followed by \<enter\> in the QEMU console or
481 @echo \* attach a debugger and continue from there.
482 @echo \*
483 @echo \* To run OP-TEE tests, use the xtest command in the \'Normal World\' terminal
484 @echo \* Enter \'xtest -h\' for help.
485 @echo
486endef
487
Jerome Forissier5b585252017-08-03 13:22:21 +0200488ifneq (, $(LAUNCH_TERMINAL))
Alex Bennée07580602017-07-07 14:26:51 +0100489define launch-terminal
490 @nc -z 127.0.0.1 $(1) || \
Jerome Forissier1f9ad6d2021-08-09 15:30:13 +0200491 $(LAUNCH_TERMINAL) "$(BUILD_PATH)/soc_term.py $(1)" &
Alex Bennée07580602017-07-07 14:26:51 +0100492endef
493else
Jerome Forissierefd56292017-01-31 17:46:10 +0100494gnome-terminal := $(shell command -v gnome-terminal 2>/dev/null)
César Pastorinid8081742023-03-23 08:36:52 -0400495konsole := $(shell command -v konsole 2>/dev/null)
Jerome Forissierefd56292017-01-31 17:46:10 +0100496xterm := $(shell command -v xterm 2>/dev/null)
497ifdef gnome-terminal
Jerome Forissierefd56292017-01-31 17:46:10 +0100498define launch-terminal
499 @nc -z 127.0.0.1 $(1) || \
Mark-PK Tsai0ef63b32022-07-01 17:09:42 +0800500 $(gnome-terminal) -t $(2) -x $(BUILD_PATH)/soc_term.py $(1) &
Jerome Forissierefd56292017-01-31 17:46:10 +0100501endef
502else
César Pastorinid8081742023-03-23 08:36:52 -0400503ifdef konsole
504define launch-terminal
505 @nc -z 127.0.0.1 $(1) || \
506 $(konsole) --new-tab -p tabtitle=$(2) -e $(BUILD_PATH)/soc_term.py $(1) &
507endef
508else
Jerome Forissierefd56292017-01-31 17:46:10 +0100509ifdef xterm
510define launch-terminal
511 @nc -z 127.0.0.1 $(1) || \
Jerome Forissier1f9ad6d2021-08-09 15:30:13 +0200512 $(xterm) -title $(2) -e $(BASH) -c "$(BUILD_PATH)/soc_term.py $(1)" &
Jerome Forissierefd56292017-01-31 17:46:10 +0100513endef
514else
César Pastorinid8081742023-03-23 08:36:52 -0400515check-terminal := @echo "Error: could not find gnome-terminal, konsole nor xterm" ; false
516endif
Jerome Forissierefd56292017-01-31 17:46:10 +0100517endif
518endif
Alex Bennée07580602017-07-07 14:26:51 +0100519endif
Jerome Forissierefd56292017-01-31 17:46:10 +0100520
521define wait-for-ports
522 @while ! nc -z 127.0.0.1 $(1) || ! nc -z 127.0.0.1 $(2); do sleep 1; done
523endef
524
Pascal Brand9a0f50f2015-09-08 15:34:17 +0200525################################################################################
Pascal Brand070d9552015-09-01 15:33:22 +0200526# OP-TEE
527################################################################################
Pascal Brand6044eb52016-02-23 15:48:31 +0100528OPTEE_OS_COMMON_FLAGS ?= \
529 $(OPTEE_OS_COMMON_EXTRA_FLAGS) \
Etienne Carriere3768a2b2019-05-14 17:13:19 +0200530 PLATFORM=$(OPTEE_OS_PLATFORM) \
Pascal Brand6044eb52016-02-23 15:48:31 +0100531 CROSS_COMPILE=$(CROSS_COMPILE_S_USER) \
Jerome Forissierae45fbf2015-09-04 09:40:17 +0200532 CROSS_COMPILE_core=$(CROSS_COMPILE_S_KERNEL) \
Jerome Forissiere67d8792019-09-06 17:40:03 +0200533 CROSS_COMPILE_ta_arm64="$(CCACHE)$(AARCH64_CROSS_COMPILE)" \
534 CROSS_COMPILE_ta_arm32="$(CCACHE)$(AARCH32_CROSS_COMPILE)" \
Pascal Brand23ef2052016-03-09 15:25:01 +0100535 CFG_TEE_CORE_LOG_LEVEL=$(CFG_TEE_CORE_LOG_LEVEL) \
Igor Opaniuk27edfc72016-10-25 18:33:54 +0300536 DEBUG=$(DEBUG) \
Sumit Garg45cf44c2021-12-24 17:02:25 +0530537 CFG_TEE_BENCHMARK=$(CFG_TEE_BENCHMARK) \
538 CFG_IN_TREE_EARLY_TAS=trusted_keys/f04a0fe7-1f5d-4b9b-abf7-619b85b4ce8c
Jerome Forissierae45fbf2015-09-04 09:40:17 +0200539
Victor Chong46f85852017-08-09 08:26:41 +0100540.PHONY: optee-os-common
Pascal Brand070d9552015-09-01 15:33:22 +0200541optee-os-common:
Jerome Forissierae45fbf2015-09-04 09:40:17 +0200542 $(MAKE) -C $(OPTEE_OS_PATH) $(OPTEE_OS_COMMON_FLAGS)
543
Victor Chong46f85852017-08-09 08:26:41 +0100544.PHONY: optee-os-clean-common
Etienne Carrierefa9d0572021-04-08 12:38:39 +0200545optee-os-clean-common:
Etienne Carriere3768a2b2019-05-14 17:13:19 +0200546 $(MAKE) -C $(OPTEE_OS_PATH) $(OPTEE_OS_COMMON_FLAGS) clean
Javier Almansa Sobrinocf568482020-02-26 11:51:45 +0000547
548################################################################################
Rong Fan19a58f02021-09-10 04:38:25 -0700549# OP-TEE Rust
550################################################################################
551.PHONY: optee-rust
Jerome Forissier0e1fa8d2022-06-02 18:50:49 +0200552optee-rust: $(OPTEE_RUST_PATH)/.done
553
554$(OPTEE_RUST_PATH)/.done:
Rong Fan19a58f02021-09-10 04:38:25 -0700555ifeq ($(OPTEE_RUST_ENABLE),y)
Jerome Forissierbcfa3f52022-09-12 17:41:35 +0200556 @(export OPTEE_DIR=$(ROOT) && \
557 export CARGO_NET_GIT_FETCH_WITH_CLI=true && \
558 cd $(OPTEE_RUST_PATH) && ./setup.sh && touch .done)
Rong Fan19a58f02021-09-10 04:38:25 -0700559endif
560
Jerome Forissier0e1fa8d2022-06-02 18:50:49 +0200561optee-rust-clean:
562 rm -f $(OPTEE_RUST_PATH)/.done
563
Rong Fan19a58f02021-09-10 04:38:25 -0700564################################################################################
Javier Almansa Sobrinocf568482020-02-26 11:51:45 +0000565# fTPM Rules
566################################################################################
567
568# The fTPM implementation is based on ARM32 architecture whereas the rest of the
569# system is built to run on 64-bit mode (COMPILE_S_USER = 64). Therefore set
570# TA_DEV_KIT_DIR manually to the arm32 OPTEE toolkit rather than relying on
571# OPTEE_OS_TA_DEV_KIT_DIR variable.
572FTPM_FLAGS ?= \
573 TA_CPU=cortex-a9 \
574 TA_CROSS_COMPILE=$(AARCH32_CROSS_COMPILE) \
575 TA_DEV_KIT_DIR=$(OPTEE_OS_PATH)/out/arm/export-ta_arm32 \
576 CFG_TA_DEBUG=y CFG_TEE_TA_LOG_LEVEL=4 CFG_TA_MEASURED_BOOT=y
577
578.PHONY: ftpm
579ftpm:
Balint Dobszay35e60992022-06-10 16:19:10 +0200580ifeq ($(MEASURED_BOOT_FTPM),y)
Javier Almansa Sobrinocf568482020-02-26 11:51:45 +0000581ftpm: optee-os
582 $(FTPM_FLAGS) $(MAKE) -C $(FTPM_PATH)
583endif
584
585.PHONY: ftpm-clean
586ftpm-clean:
Balint Dobszay35e60992022-06-10 16:19:10 +0200587ifeq ($(MEASURED_BOOT_FTPM),y)
Javier Almansa Sobrinocf568482020-02-26 11:51:45 +0000588ftpm-clean:
589 -$(FTPM_FLAGS) $(MAKE) -C $(FTPM_PATH) clean
590endif