1# Get the dir of the ta-dev-kit, requires make version 3.81 or later 2ta-dev-kit-dir := $(patsubst %/,%,$(abspath $(dir $(lastword $(MAKEFILE_LIST)))..)) 3 4.PHONY: all 5all: 6 7include $(ta-dev-kit-dir)/mk/conf.mk 8ta-dev-kit-dir$(sm) := $(ta-dev-kit-dir) 9 10include $(ta-dev-kit-dir$(sm))/mk/macros.mk 11 12ifneq (1, $(words $(BINARY) $(LIBNAME) $(SHLIBNAME))) 13$(error You must specify exactly one of BINARY, LIBNAME or SHLIBNAME) 14endif 15 16ifneq ($O,) 17out-dir := $O 18else 19out-dir := . 20endif 21link-out-dir := $(out-dir) # backward compat 22link-out-dir$(sm) := $(out-dir) 23 24user-ta-uuid := $(BINARY) 25user-ta-version := $(if $(CFG_TA_VERSION),$(CFG_TA_VERSION),0) 26user-ta-ldadd := $(LDADD) 27libname := $(LIBNAME) 28shlibname := $(SHLIBNAME) 29shlibuuid := $(SHLIBUUID) 30 31arch-bits-ta_arm32 := 32 32arch-bits-ta_arm64 := 64 33 34# For convenience 35ifdef CFLAGS 36CFLAGS32 ?= $(CFLAGS) 37CFLAGS64 ?= $(CFLAGS) 38endif 39 40ifneq ($V,1) 41q := @ 42cmd-echo := true 43cmd-echo-silent := echo 44else 45q := 46cmd-echo := echo 47cmd-echo-silent := true 48endif 49 50ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 51ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),) 52cmd-echo-silent := true 53endif 54else # make-3.8x 55ifneq ($(findstring s, $(MAKEFLAGS)),) 56cmd-echo-silent := true 57endif 58endif 59 60cppflags$(sm) := $($(sm)-platform-cppflags) $(CPPFLAGS_$(sm)) 61aflags$(sm) := $($(sm)-platform-aflags) 62cflags$(sm) := $($(sm)-platform-cflags) $(CFLAGS_$(sm)) 63cxxflags$(sm) := $($(sm)-platform-cxxflags) $(CXXFLAGS_$(sm)) 64ifneq (,$(shlibname)) 65# Exception handling is not supported in shared libraries (with GCC it would 66# require to use the shared libgcc, which depend on the GNU libc) 67cxxflags$(sm) += -fno-exceptions 68endif 69 70ifeq ($(CFG_TA_OPTEE_CORE_API_COMPAT_1_1),y) 71cppflags$(sm) += -D__OPTEE_CORE_API_COMPAT_1_1=1 72endif 73CFG_TEE_TA_LOG_LEVEL ?= 2 74cppflags$(sm) += -DTRACE_LEVEL=$(CFG_TEE_TA_LOG_LEVEL) 75 76cppflags$(sm) += -I. -I$(ta-dev-kit-dir$(sm))/include 77 78ifeq ($(CFG_TA_MCOUNT),y) 79cppflags$(sm) += -pg 80endif 81 82ifeq ($(CFG_TA_SANITIZE_UNDEFINED),y) 83cflags$(sm) += -fsanitize=undefined 84endif 85 86ifeq ($(CFG_TA_SANITIZE_KADDRESS),y) 87cflags$(sm) += \ 88 -fsanitize=kernel-address \ 89 -fasan-shadow-offset=$(CFG_USER_ASAN_SHADOW_OFFSET) \ 90 --param=asan-globals=1 \ 91 --param=asan-instrumentation-with-call-threshold=0 \ 92 --param=asan-stack=1 93endif 94 95 96libdirs += $(ta-dev-kit-dir$(sm))/lib 97libnames += utils 98libdeps += $(ta-dev-kit-dir$(sm))/lib/libutils.a 99libnames += utee 100libdeps += $(ta-dev-kit-dir$(sm))/lib/libutee.a 101ifeq ($(CFG_TA_MBEDTLS),y) 102libnames += mbedtls 103libdeps += $(ta-dev-kit-dir$(sm))/lib/libmbedtls.a 104endif 105libnames += dl 106libdeps += $(ta-dev-kit-dir$(sm))/lib/libdl.a 107 108# libutils provides __getauxval symbol which is needed by libgcc 10.x. We can't 109# link libutils after libgcc, because libgcc will replace some symbols provided 110# by libutils, which will cause further linking issues. 111# 112# But if we place libutils before libgcc, linker will not be able to resolve 113# __getauxval. So we need to link with libutils twice: before and after libgcc. 114# Hence it included both in $(libnames) and in $(libnames-after-libgcc) 115libnames-after-libgcc += utils 116libdeps-after-libgcc += $(ta-dev-kit-dir$(sm))/lib/libutils.a 117 118# Pass config variable (CFG_) and (_CFG_) from conf.mk on the command line 119cppflags$(sm) += $(strip \ 120 $(foreach var, $(filter CFG_% _CFG_%,$(.VARIABLES)), \ 121 $(if $(filter y,$($(var))), \ 122 -D$(var)=1, \ 123 $(if $(filter xn x,x$($(var))),,-D$(var)='$($(var))')))) 124 125include $(ta-dev-kit-dir$(sm))/mk/cleandirs.mk 126 127.PHONY: clean 128clean: 129 @$(cmd-echo-silent) ' CLEAN $(out-dir)' 130 ${q}rm -f $(cleanfiles) 131 ${q}dirs="$(call cleandirs-for-rmdir)"; if [ "$$dirs" ]; then $(RMDIR) $$dirs; fi 132 @$(cmd-echo-silent) ' CLEAN $(O)' 133 ${q}if [ -d "$(O)" ]; then $(RMDIR) $(O); fi 134 135include $(ta-dev-kit-dir$(sm))/mk/$(COMPILER_$(sm)).mk 136include $(ta-dev-kit-dir$(sm))/mk/cc-option.mk 137 138subdirs = . 139include $(ta-dev-kit-dir$(sm))/mk/subdir.mk 140 141ifneq ($(user-ta-uuid),) 142# Build target is TA 143spec-out-dir := $(link-out-dir$(sm)) 144spec-srcs += $(ta-dev-kit-dir$(sm))/src/user_ta_header.c 145ifeq ($(sm),ta_arm32) 146spec-srcs += $(ta-dev-kit-dir$(sm))/src/ta_entry_a32.S 147endif 148endif 149 150SCRIPTS_DIR := $(ta-dev-kit-dir)/scripts 151include $(ta-dev-kit-dir$(sm))/mk/compile.mk 152 153ifneq ($(user-ta-uuid),) 154include $(ta-dev-kit-dir$(sm))/mk/link.mk 155endif 156 157ifneq ($(libname),) 158# Build target is static library 159all: $(link-out-dir$(sm))/$(libname).a 160cleanfiles += $(link-out-dir$(sm))/$(libname).a 161 162$(link-out-dir$(sm))/$(libname).a: $(objs) 163 @echo ' AR $@' 164 $(q)rm -f $@ && $(AR$(sm)) rcs $@ $^ 165endif 166 167ifneq (,$(shlibname)) 168include $(ta-dev-kit-dir$(sm))/mk/link_shlib.mk 169endif 170