1########################################################## 2## Common mk file used for Android to compile and ## 3## integrate OP-TEE related components ## 4## Following flags need to be defined in optee*.mk ## 5## OPTEE_OS_DIR ## 6## OPTEE_TA_TARGETS ## 7## OPTEE_CFG_ARM64_CORE ## 8## OPTEE_PLATFORM ## 9## OPTEE_PLATFORM_FLAVOR ## 10## OPTEE_EXTRA_FLAGS (optional) ## 11## OPTEE_EXTRA_TA_FLAGS (optional) ## 12## And BUILD_OPTEE_MK needs to be defined in optee*.mk ## 13## to point to this file ## 14## ## 15## local_module needs to be defined before including ## 16## this file to build TAs ## 17## ## 18########################################################## 19 20########################################################## 21## define common variables, like TA_DEV_KIT_DIR ## 22########################################################## 23TOP_ROOT_ABS := $(realpath $(TOP)) 24 25PREBUILT_MAKE ?= prebuilts/build-tools/linux-x86/bin/make 26# we need this check because the Pie build does not have 27# this prebuilt make tool 28ifneq (,$(wildcard $(PREBUILT_MAKE))) 29# for master and versions which has prebuilt make 30HOST_MAKE := $(PREBUILT_MAKE) 31 32# The AOSP build tool is not the regular make, 33# that it adds -jN to $(MAKE), and that we should preserve 34# the flag or we would lose parallel build 35# The MAKE is redefined here in AOSP ckati: 36# https://android.googlesource.com/platform/build/kati/+/master/main.cc#100 37ifneq (,$(filter -j%, $(MAKE))) 38HOST_MAKE += $(filter -j%, $(MAKE)) 39endif 40 41else 42# For P and old versions which does not have prebuilt make, 43# let's use MAKE as what we did before 44HOST_MAKE := $(MAKE) 45endif 46 47 48# OPTEE_OUT_DIR could be exported explicitly 49# if PRODUCT_OUT is not the default out directory in aosp workspace 50OPTEE_OUT_DIR ?= $(PRODUCT_OUT)/optee 51ABS_OPTEE_OUT_DIR ?= $(realpath $(PRODUCT_OUT))/optee 52OPTEE_TA_OUT_DIR ?= $(OPTEE_OUT_DIR)/ta 53ABS_OPTEE_TA_OUT_DIR ?= $(ABS_OPTEE_OUT_DIR)/ta 54# Set so that OP-TEE clients can find the installed dev-kit, which 55# depends on platform and its OP-TEE word-size. 56OPTEE_OS_OUT_DIR ?= $(OPTEE_OUT_DIR)/arm-plat-$(OPTEE_PLATFORM) 57ABS_OPTEE_OS_OUT_DIR := $(ABS_OPTEE_OUT_DIR)/arm-plat-$(OPTEE_PLATFORM) 58ifneq ($(local_optee_ta_target),) 59TA_TARGET := $(local_optee_ta_target) 60else 61TA_TARGET := $(OPTEE_TA_TARGETS) 62endif 63TA_DEV_KIT_DIR := $(OPTEE_OS_OUT_DIR)/export-$(TA_TARGET) 64ABS_TA_DEV_KIT_DIR := $(ABS_OPTEE_OS_OUT_DIR)/export-$(TA_TARGET) 65 66CROSS_COMPILE64 ?= $(TOP_ROOT_ABS)/$(TARGET_TOOLS_PREFIX) 67CROSS_COMPILE_LINE := CROSS_COMPILE64="$(CROSS_COMPILE64)" 68ifneq ($(strip $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)),) 69CROSS_COMPILE32 ?= $(TOP_ROOT_ABS)/$($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX) 70CROSS_COMPILE_LINE += CROSS_COMPILE32="$(CROSS_COMPILE32)" 71endif 72 73OPTEE_BIN := $(OPTEE_OS_OUT_DIR)/core/tee.bin 74 75$(OPTEE_BIN) : $(sort $(shell find -L $(OPTEE_OS_DIR))) 76 77OPTEE_TA_DEV_KIT_MK := $(TA_DEV_KIT_DIR)/mk/ta_dev_kit.mk 78 79$(OPTEE_TA_DEV_KIT_MK) : $(sort $(shell find -L $(OPTEE_OS_DIR))) 80 81########################################################### 82## define making rules for $(OPTEE_BIN) target, and add ## 83## condition check to make it only be defined once ## 84## even though this mk file might be included multiple ## 85## times. The process to generate $(OPTEE_BIN) file will ## 86## generate the header files under ## 87## $(TA_DEV_KIT_DIR)/host_include too. ## 88## And the $(OPTEE_BIN) will be used as dependency for ## 89## other projects ## 90########################################################### 91ifneq (true,$(BUILD_OPTEE_OS_DEFINED)) 92BUILD_OPTEE_OS_DEFINED := true 93$(OPTEE_BIN): 94 @echo "Start building optee_os..." 95 +$(HOST_MAKE) -C $(TOP_ROOT_ABS)/$(OPTEE_OS_DIR) \ 96 O=$(ABS_OPTEE_OS_OUT_DIR) \ 97 CFG_USER_TA_TARGETS=$(OPTEE_TA_TARGETS) \ 98 CFG_ARM64_core=$(OPTEE_CFG_ARM64_CORE) \ 99 PLATFORM=$(OPTEE_PLATFORM) \ 100 PLATFORM_FLAVOR=$(OPTEE_PLATFORM_FLAVOR) \ 101 $(CROSS_COMPILE_LINE) \ 102 $(OPTEE_EXTRA_FLAGS) 103 @echo "Finished building optee_os..." 104 105endif 106 107########################################################### 108## similar to the $(OPTEE_BIN) target above, use condition 109## check to make $(OPTEE_TA_DEV_KIT_MK) for different ta 110## targets only be defined once 111########################################################### 112ifeq ($(filter $(TA_TARGET),$(BUILD_TA_DEV_KIT_DEFINED)),) 113BUILD_TA_DEV_KIT_DEFINED := $(TA_TARGET) $(BUILD_TA_DEV_KIT_DEFINED) 114$(OPTEE_TA_DEV_KIT_MK): PRIVATE_TA_TARGET := $(TA_TARGET) 115$(OPTEE_TA_DEV_KIT_MK): 116 @echo "Start building ta_dev_kit ($(PRIVATE_TA_TARGET))..." 117 +$(HOST_MAKE) -C $(TOP_ROOT_ABS)/$(OPTEE_OS_DIR) \ 118 O=$(ABS_OPTEE_OS_OUT_DIR) \ 119 CFG_USER_TA_TARGETS=$(PRIVATE_TA_TARGET) \ 120 CFG_ARM64_core=$(OPTEE_CFG_ARM64_CORE) \ 121 PLATFORM=$(OPTEE_PLATFORM) \ 122 PLATFORM_FLAVOR=$(OPTEE_PLATFORM_FLAVOR) \ 123 $(CROSS_COMPILE_LINE) \ 124 $(OPTEE_EXTRA_FLAGS) ta_dev_kit 125 @echo "Finished building ta_dev_kit ($(PRIVATE_TA_TARGET))..." 126endif 127 128########################################################## 129## Lines for building TAs automatically ## 130## will only be included in Android.mk for TAs ## 131## local_module: ## 132## need to be defined before include for this ## 133########################################################## 134ifneq (false,$(INCLUDE_FOR_BUILD_TA)) 135include $(CLEAR_VARS) 136 137define ta_class 138$(if $(filter %.ta,$1),EXECUTABLES,STATIC_LIBRARIES) 139endef 140 141LOCAL_MODULE := $(local_module) 142LOCAL_PREBUILT_MODULE_FILE := $(OPTEE_TA_OUT_DIR)/$(LOCAL_MODULE) 143LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/optee_armtz 144LOCAL_MODULE_CLASS := $(call ta_class,$(local_module)) 145LOCAL_MODULE_TAGS := optional 146LOCAL_REQUIRED_MODULES := $(local_module_deps) 147 148TA_TMP_DIR := $(addsuffix _$(TA_TARGET), $(subst /,_,$(LOCAL_PATH))) 149TA_TMP_FILE := $(OPTEE_TA_OUT_DIR)/$(TA_TMP_DIR)/$(LOCAL_MODULE) 150$(LOCAL_PREBUILT_MODULE_FILE): $(TA_TMP_FILE) 151 @mkdir -p $(dir $@) 152 cp -vf $< $@ 153 154TA_TMP_FILE_DEPS := 155ifneq ($(local_module_deps),) 156$(foreach dep, $(local_module_deps), $(eval TA_TMP_FILE_DEPS += $(call intermediates-dir-for,$(call ta_class,$(dep)),$(dep))/$(dep))) 157endif 158$(TA_TMP_FILE): $(TA_TMP_FILE_DEPS) 159$(TA_TMP_FILE): PRIVATE_TA_SRC_DIR := $(LOCAL_PATH) 160$(TA_TMP_FILE): PRIVATE_TA_TMP_FILE := $(TA_TMP_FILE) 161$(TA_TMP_FILE): PRIVATE_TA_TMP_DIR := $(TA_TMP_DIR) 162$(TA_TMP_FILE): PRIVATE_TA_DEV_KIT_DIR := $(ABS_TA_DEV_KIT_DIR) 163$(TA_TMP_FILE): $(OPTEE_TA_DEV_KIT_MK) 164 @echo "Start building TA for $(PRIVATE_TA_SRC_DIR) $(PRIVATE_TA_TMP_FILE)..." 165 +$(HOST_MAKE) -C $(TOP_ROOT_ABS)/$(PRIVATE_TA_SRC_DIR) O=$(ABS_OPTEE_TA_OUT_DIR)/$(PRIVATE_TA_TMP_DIR) \ 166 TA_DEV_KIT_DIR=$(PRIVATE_TA_DEV_KIT_DIR) \ 167 $(CROSS_COMPILE_LINE) \ 168 $(OPTEE_EXTRA_TA_FLAGS) 169 @echo "Finished building TA for $(PRIVATE_TA_SRC_DIR) $(PRIVATE_TA_TMP_FILE)..." 170 171include $(BUILD_PREBUILT) 172 173# To get ta elf files for early-ta, 174# copy them to $(PRODUCT_OUT)/unsigned/ on host 175ifeq ($(call ta_class,$(local_module)),EXECUTABLES) 176include $(CLEAR_VARS) 177LOCAL_MODULE := $(local_module).unsigned 178LOCAL_PREBUILT_MODULE_FILE := $(OPTEE_TA_OUT_DIR)/$(LOCAL_MODULE) 179LOCAL_MODULE_PATH := $(PRODUCT_OUT)/unsigned 180LOCAL_MODULE_CLASS := $(call ta_class,$(local_module)) 181LOCAL_MODULE_TAGS := optional 182 183TA_TMP_STRIPPED_ELF_FILE := $(patsubst %.ta,%.stripped.elf,$(TA_TMP_FILE)) 184$(TA_TMP_STRIPPED_ELF_FILE): $(TA_TMP_FILE) 185 186$(LOCAL_PREBUILT_MODULE_FILE): $(TA_TMP_STRIPPED_ELF_FILE) 187 @mkdir -p $(dir $@) 188 cp -vf $< $@ 189 190include $(BUILD_PREBUILT) 191endif # to get ta elf files for early-ta 192 193local_module_deps := 194local_optee_ta_target := 195endif 196