xref: /optee_os/mk/aosp_optee.mk (revision 3f6ed0a62ed0264f05743f692202e7fc1b98d6c7)
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 := $(ABS_OPTEE_OS_OUT_DIR)/export-$(TA_TARGET)
64
65CROSS_COMPILE64 ?= $(TOP_ROOT_ABS)/$(TARGET_TOOLS_PREFIX)
66CROSS_COMPILE_LINE := CROSS_COMPILE64="$(CROSS_COMPILE64)"
67ifneq ($(strip $($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)),)
68CROSS_COMPILE32 ?= $(TOP_ROOT_ABS)/$($(combo_2nd_arch_prefix)TARGET_TOOLS_PREFIX)
69CROSS_COMPILE_LINE += CROSS_COMPILE32="$(CROSS_COMPILE32)"
70endif
71
72OPTEE_BIN := $(OPTEE_OS_OUT_DIR)/core/tee.bin
73
74$(OPTEE_BIN) : $(sort $(shell find -L $(OPTEE_OS_DIR)))
75
76###########################################################
77## define making rules for $(OPTEE_BIN) target, and add  ##
78## condition check to make it only be defined once       ##
79## even though this mk file might be included multiple   ##
80## times. The process to generate $(OPTEE_BIN) file will ##
81## generate the header files under                       ##
82## $(TA_DEV_KIT_DIR)/host_include too.                   ##
83## And the $(OPTEE_BIN) will be used as dependency for   ##
84## other projects                                        ##
85###########################################################
86ifneq (true,$(BUILD_OPTEE_OS_DEFINED))
87BUILD_OPTEE_OS_DEFINED := true
88$(OPTEE_BIN):
89	@echo "Start building optee_os..."
90	+$(HOST_MAKE) -C $(TOP_ROOT_ABS)/$(OPTEE_OS_DIR) \
91		O=$(ABS_OPTEE_OS_OUT_DIR) \
92		CFG_USER_TA_TARGETS=$(OPTEE_TA_TARGETS) \
93		CFG_ARM64_core=$(OPTEE_CFG_ARM64_CORE) \
94		PLATFORM=$(OPTEE_PLATFORM) \
95		PLATFORM_FLAVOR=$(OPTEE_PLATFORM_FLAVOR) \
96		$(CROSS_COMPILE_LINE) \
97		$(OPTEE_EXTRA_FLAGS)
98	@echo "Finished building optee_os..."
99
100endif
101
102##########################################################
103## Lines for building TAs automatically                 ##
104## will only be included in Android.mk for TAs          ##
105## local_module:                                        ##
106##     need to be defined before include for this       ##
107##########################################################
108ifneq (false,$(INCLUDE_FOR_BUILD_TA))
109include $(CLEAR_VARS)
110
111define ta_class
112$(if $(filter %.ta,$1),EXECUTABLES,STATIC_LIBRARIES)
113endef
114
115LOCAL_MODULE := $(local_module)
116LOCAL_PREBUILT_MODULE_FILE := $(OPTEE_TA_OUT_DIR)/$(LOCAL_MODULE)
117LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/optee_armtz
118LOCAL_MODULE_CLASS := $(call ta_class,$(local_module))
119LOCAL_MODULE_TAGS := optional
120LOCAL_REQUIRED_MODULES := $(local_module_deps)
121
122TA_TMP_DIR := $(addsuffix _$(TA_TARGET), $(subst /,_,$(LOCAL_PATH)))
123TA_TMP_FILE := $(OPTEE_TA_OUT_DIR)/$(TA_TMP_DIR)/$(LOCAL_MODULE)
124$(LOCAL_PREBUILT_MODULE_FILE): $(TA_TMP_FILE)
125	@mkdir -p $(dir $@)
126	cp -vf $< $@
127
128TA_TMP_FILE_DEPS :=
129ifneq ($(local_module_deps),)
130$(foreach dep, $(local_module_deps), $(eval TA_TMP_FILE_DEPS += $(call intermediates-dir-for,$(call ta_class,$(dep)),$(dep))/$(dep)))
131endif
132$(TA_TMP_FILE): $(TA_TMP_FILE_DEPS)
133$(TA_TMP_FILE): PRIVATE_TA_SRC_DIR := $(LOCAL_PATH)
134$(TA_TMP_FILE): PRIVATE_TA_TMP_FILE := $(TA_TMP_FILE)
135$(TA_TMP_FILE): PRIVATE_TA_TMP_DIR := $(TA_TMP_DIR)
136$(TA_TMP_FILE): PRIVATE_TA_DEV_KIT_DIR := $(TA_DEV_KIT_DIR)
137$(TA_TMP_FILE): $(OPTEE_BIN)
138	@echo "Start building TA for $(PRIVATE_TA_SRC_DIR) $(PRIVATE_TA_TMP_FILE)..."
139	+$(HOST_MAKE) -C $(TOP_ROOT_ABS)/$(PRIVATE_TA_SRC_DIR) O=$(ABS_OPTEE_TA_OUT_DIR)/$(PRIVATE_TA_TMP_DIR) \
140		TA_DEV_KIT_DIR=$(PRIVATE_TA_DEV_KIT_DIR) \
141		$(CROSS_COMPILE_LINE) \
142		$(OPTEE_EXTRA_TA_FLAGS)
143	@echo "Finished building TA for $(PRIVATE_TA_SRC_DIR) $(PRIVATE_TA_TMP_FILE)..."
144
145include $(BUILD_PREBUILT)
146local_module_deps :=
147local_optee_ta_target :=
148endif
149