11# Copyright (c) 2019, 2020 Linaro
2+ # Copyright (c) 2020, Nordic Semiconductor ASA
23#
34# SPDX-License-Identifier: Apache-2.0
45
@@ -12,9 +13,11 @@ cmake_minimum_required(VERSION 3.13.1)
1213#
1314# BINARY_DIR: The location where the build outputs will be written
1415# BOARD: The string identifying the board target for TF-M (AN521, etc.)
15- # CFGFILE : The TF-M config file to use, without the .cmake extension
16+ # CMAKE_BUILD_TYPE : The TF-M build type to use, (Debug, Release, etc.)
1617# IPC: Build TFM IPC library. This library allows a non-secure application to
1718# interface to secure domain using IPC.
19+ # ISOLATION_LEVEL: The TF-M isolation level to use
20+ # REGRESSION: Boolean if TF-M build includes building the TF-M regression tests
1821# BL2: Boolean if build uses MCUboot.
1922#
2023# The following output values can also be used:
@@ -26,33 +29,58 @@ cmake_minimum_required(VERSION 3.13.1)
2629# Example usage:
2730#
2831# trusted_firmware_build(BINARY_DIR ${CMAKE_BINARY_DIR}/tfm
29- # BOARD ${TFMBOARD}
30- # CFGFILE "ConfigRegressionIPC"
31- # OUT_VENEERS_FILE VENEERS_FILE
32- # OUT_INCLUDE_PATH TFM_INCLUDE_PATH
33- # BL2 True)
32+ # BOARD ${TFM_TARGET_PLATFORM}
33+ # CMAKE_BUILD_TYPE Release
34+ # IPC
35+ # ISOLATION_LEVEL 2
36+ # REGRESSION
37+ # BL2 True
3438function (trusted_firmware_build)
35- set (options IPC)
36- set (oneValueArgs BINARY_DIR BOARD CFGFILE OUT_VENEERS_FILE OUT_INCLUDE_PATH BL2)
39+ set (options IPC REGRESSION )
40+ set (oneValueArgs BINARY_DIR BOARD OUT_INCLUDE_PATH BL2 ISOLATION_LEVEL CMAKE_BUILD_TYPE )
3741 cmake_parse_arguments (TFM "${options} " "${oneValueArgs} " "" ${ARGN} )
3842
3943 if (DEFINED TFM_BL2)
4044 set (TFM_BL2_ARG "-DBL2=${TFM_BL2} " )
4145 endif ()
4246
43- set (VENEERS_FILE ${TFM_BINARY_DIR} /install /export/tfm/veneers/s_veneers.o)
47+ if (DEFINED TFM_IPC)
48+ set (TFM_IPC_ARG -DTFM_PSA_API=ON )
49+ # PSA API awareness for the Non-Secure application
50+ target_compile_definitions (app PRIVATE "TFM_PSA_API" )
51+ endif ()
52+
53+ if (DEFINED TFM_ISOLATION_LEVEL)
54+ set (TFM_ISOLATION_LEVEL_ARG -DTFM_ISOLATION_LEVEL=${TFM_ISOLATION_LEVEL} )
55+ endif ()
56+
57+ if (DEFINED TFM_REGRESSION)
58+ set (TFM_REGRESSION_ARG -DTEST_S=ON -DTEST_NS=ON )
59+ endif ()
60+
61+ if (DEFINED TFM_CMAKE_BUILD_TYPE)
62+ set (TFM_CMAKE_BUILD_TYPE_ARG -DCMAKE_BUILD_TYPE=${TFM_CMAKE_BUILD_TYPE} )
63+ else ()
64+ set (TFM_CMAKE_BUILD_TYPE_ARG -DCMAKE_BUILD_TYPE=RelWithDebInfo)
65+ endif ()
66+
67+ set (VENEERS_FILE ${TFM_BINARY_DIR} /secure_fw/s_veneers.o)
4468 set (${TFM_OUT_VENEERS_FILE} ${VENEERS_FILE} PARENT_SCOPE)
4569 set (${TFM_OUT_INCLUDE_PATH} ${TFM_BINARY_DIR} /install /export/tfm/include PARENT_SCOPE)
4670
71+ set (PSA_API_NS_PATH ${TFM_BINARY_DIR} /interface /libpsa_api_ns.a)
72+
4773 # Get the toolchain variant
4874 # TODO: Add support for cross-compile toolchain variant
4975 # TODO: Enforce GCC version check against TF-M compiler requirements
5076 if (${ZEPHYR_TOOLCHAIN_VARIANT} STREQUAL "zephyr" )
5177 set (TFM_TOOLCHAIN "GNUARM" )
78+ set (CMAKE_TOOLCHAIN_FILE "trusted-firmware-m/toolchain_GNUARM.cmake" )
5279 set (TFM_TOOLCHAIN_PREFIX "arm-zephyr-eabi" )
5380 set (TFM_TOOLCHAIN_PATH ${ZEPHYR_SDK_INSTALL_DIR} /arm-zephyr-eabi)
5481 elseif (${ZEPHYR_TOOLCHAIN_VARIANT} STREQUAL "gnuarmemb" )
5582 set (TFM_TOOLCHAIN "GNUARM" )
83+ set (CMAKE_TOOLCHAIN_FILE "trusted-firmware-m/toolchain_GNUARM.cmake" )
5684 set (TFM_TOOLCHAIN_PREFIX "arm-none-eabi" )
5785 set (TFM_TOOLCHAIN_PATH ${GNUARMEMB_TOOLCHAIN_PATH} )
5886 else ()
@@ -65,33 +93,37 @@ function(trusted_firmware_build)
6593 tfm
6694 SOURCE_DIR ${ZEPHYR_TFM_MODULE_DIR} /trusted-firmware-m
6795 BINARY_DIR ${TFM_BINARY_DIR}
68- CMAKE_ARGS -DPROJ_CONFIG=${ZEPHYR_TFM_MODULE_DIR} /trusted-firmware-m/configs/${TFM_CFGFILE} .cmake
69- -DTARGET_PLATFORM=${TFM_BOARD}
96+ CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${ZEPHYR_TFM_MODULE_DIR} /${CMAKE_TOOLCHAIN_FILE}
97+ -DTFM_PLATFORM=${TFM_BOARD}
98+ ${TFM_CMAKE_BUILD_TYPE_ARG}
7099 ${TFM_BL2_ARG}
71- -DCOMPILER=${TFM_TOOLCHAIN}
72- -DGNUARM_PREFIX=${TFM_TOOLCHAIN_PREFIX}
73- -DGNUARM_PATH=${TFM_TOOLCHAIN_PATH}
100+ ${TFM_IPC_ARG}
101+ ${TFM_ISOLATION_LEVEL_ARG}
102+ ${TFM_REGRESSION_ARG}
103+ -DTFM_TEST_REPO_PATH=${ZEPHYR_TFM_MODULE_DIR} /tf-m-tests
74104 BUILD_ALWAYS True
75105 USES_TERMINAL_BUILD True
76- BUILD_BYPRODUCTS ${VENEERS_FILE}
106+ BUILD_BYPRODUCTS ${VENEERS_FILE} ${PSA_API_NS_PATH}
77107 )
78108
79- set (TFM_INTERFACE_SOURCE ${ZEPHYR_TFM_MODULE_DIR} /trusted-firmware-m/interface /src)
80-
81109 # IPC mode source dependencies
82- if (TFM_IPC)
83- add_library (tfm_ipc_psa_api
84- ${TFM_INTERFACE_SOURCE} /tfm_psa_ns_api.c
85- ${TFM_INTERFACE_SOURCE} /tfm_crypto_ipc_api.c
86- ${TFM_INTERFACE_SOURCE} /tfm_initial_attestation_ipc_api.c
87- ${TFM_INTERFACE_SOURCE} /tfm_its_ipc_api.c
88- ${TFM_INTERFACE_SOURCE} /tfm_platform_ipc_api.c
89- ${TFM_INTERFACE_SOURCE} /tfm_ps_ipc_api.c
90- ${TFM_INTERFACE_SOURCE} /tfm_ns_interface.c
91- )
92- target_include_directories (tfm_ipc_psa_api PUBLIC ${ZEPHYR_TFM_MODULE_DIR} /trusted-firmware-m/interface /include )
93- target_compile_definitions (tfm_ipc_psa_api PUBLIC TFM_PSA_API TFM_PARTITION_TEST_CORE_IPC)
94- target_link_libraries (tfm_ipc_psa_api PRIVATE zephyr_interface)
95- endif ()
110+ add_library (tfm_api STATIC IMPORTED )
111+ set_target_properties (tfm_api PROPERTIES
112+ IMPORTED_LOCATION ${PSA_API_NS_PATH}
113+ )
114+
115+ add_library (veneer_lib STATIC IMPORTED )
116+ set_target_properties (veneer_lib PROPERTIES
117+ IMPORTED_LOCATION ${VENEERS_FILE}
118+ )
119+
120+ add_dependencies (tfm_api tfm)
121+ file (MAKE_DIRECTORY ${TFM_BINARY_DIR} /generated /interface /include )
122+ target_include_directories (tfm_api INTERFACE
123+ ${ZEPHYR_TFM_MODULE_DIR} /trusted-firmware-m/interface /include
124+ ${TFM_BINARY_DIR} /generated /interface /include
125+ )
126+
127+ target_link_libraries (tfm_api INTERFACE zephyr_interface veneer_lib)
96128
97129endfunction ()
0 commit comments