Skip to content

Commit b671cf7

Browse files
tejlmandcarlescufi
authored andcommitted
cmake: tfm: support for custom CMake args when building TF-M
This commit allows a subsystem to specify additional CMake flags to be given to the TF-M build. The additional CMake flags can be provided through the TFM_CMAKE_OPTIONS property on the zephyr_property_target. Using the zephyr_property_target allows Zephyr modules to append extra TFM_CMAKE_OPTIONS regardless of the CMake processing order. It splits the ExternalProject_Add into a two step process with the CMake invocation executed using add_custom_target() and the build process using ExternalProject_Add(). The reason for this split is because CMake generator expressions passed through ExternalProject_Add to CMake will quoted so that `$<TARGET_PROPERTY:<tgt>,<prop>>` becomes `"-DFOO=bar -DBAR=foo"` instead of `-DFOO=bar -DBAR=foo` which again results in CMake failures. Signed-off-by: Torsten Rasmussen <[email protected]>
1 parent 8b285fc commit b671cf7

File tree

2 files changed

+63
-16
lines changed

2 files changed

+63
-16
lines changed

modules/trusted-firmware-m/CMakeLists.txt

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ set(TFM_VALID_PARTITIONS
3636
# TF-M regression tests
3737
# BL2: Boolean if the TF-M build uses MCUboot. Default: True
3838
# ENABLED_PARTITIONS: List of TFM partitions to enable.
39+
# CMAKE_ARGS: Additional CMake flags to be used when building TF-M
40+
# This is a list of flags, such as
41+
# `CMAKE_ARGS -DARG0=val0 -DARG1=val1`
42+
# or a generator expression, such as:
43+
# `CMAKE_ARGS $<TARGET_PROPERTY:target,property>
3944
#
4045
# Example usage:
4146
#
@@ -160,30 +165,44 @@ function(trusted_firmware_build)
160165
message(FATAL_ERROR "Unsupported ZEPHYR_TOOLCHAIN_VARIANT: ${ZEPHYR_TOOLCHAIN_VARIANT}")
161166
endif()
162167

168+
file(MAKE_DIRECTORY ${TFM_BINARY_DIR})
169+
add_custom_target(tfm_cmake
170+
COMMAND ${CMAKE_COMMAND}
171+
-G${CMAKE_GENERATOR}
172+
-DTFM_TOOLCHAIN_FILE=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/${TFM_TOOLCHAIN_FILE}
173+
-DTFM_PLATFORM=${TFM_BOARD}
174+
-DCROSS_COMPILE=${TFM_TOOLCHAIN_PATH}/${TFM_TOOLCHAIN_PREFIX}
175+
${TFM_CMAKE_BUILD_TYPE_ARG}
176+
-DBL2=${TFM_BL2}
177+
${TFM_IPC_ARG}
178+
${TFM_ISOLATION_LEVEL_ARG}
179+
${TFM_REGRESSION_S_ARG}
180+
${TFM_REGRESSION_NS_ARG}
181+
${TFM_PROFILE_ARG}
182+
${MCUBOOT_IMAGE_NUM_ARG}
183+
${PSA_TEST_ARG}
184+
${TFM_CMAKE_ARGS}
185+
-DTFM_TEST_REPO_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/tf-m-tests
186+
-DMCUBOOT_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/../tfm-mcuboot
187+
-DPSA_ARCH_TESTS_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/psa-arch-tests
188+
${TFM_PARTITIONS_ARGS}
189+
${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/trusted-firmware-m
190+
WORKING_DIRECTORY ${TFM_BINARY_DIR}
191+
COMMAND_EXPAND_LISTS
192+
)
193+
163194
include(ExternalProject)
164195

165196
ExternalProject_Add(
166197
tfm
167198
SOURCE_DIR ${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/trusted-firmware-m
168199
BINARY_DIR ${TFM_BINARY_DIR}
169-
CMAKE_ARGS -DTFM_TOOLCHAIN_FILE=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/${TFM_TOOLCHAIN_FILE}
170-
-DTFM_PLATFORM=${TFM_BOARD}
171-
-DCROSS_COMPILE=${TFM_TOOLCHAIN_PATH}/${TFM_TOOLCHAIN_PREFIX}
172-
${TFM_CMAKE_BUILD_TYPE_ARG}
173-
-DBL2=${TFM_BL2}
174-
${TFM_IPC_ARG}
175-
${TFM_ISOLATION_LEVEL_ARG}
176-
${TFM_REGRESSION_S_ARG}
177-
${TFM_REGRESSION_NS_ARG}
178-
${TFM_PROFILE_ARG}
179-
${MCUBOOT_IMAGE_NUM_ARG}
180-
${PSA_TEST_ARG}
181-
-DTFM_TEST_REPO_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/tf-m-tests
182-
-DMCUBOOT_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/../tfm-mcuboot
183-
-DPSA_ARCH_TESTS_PATH=${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/psa-arch-tests
184-
${TFM_PARTITIONS_ARGS}
200+
CONFIGURE_COMMAND ""
201+
BUILD_COMMAND ${CMAKE_COMMAND} --build .
202+
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
185203
BUILD_ALWAYS True
186204
USES_TERMINAL_BUILD True
205+
DEPENDS tfm_cmake
187206
BUILD_BYPRODUCTS ${BUILD_BYPRODUCTS}
188207
)
189208

@@ -299,6 +318,7 @@ if (CONFIG_BUILD_WITH_TFM)
299318
${TFM_IPC_ARG}
300319
${TFM_REGRESSION_S_ARG}
301320
${TFM_REGRESSION_NS_ARG}
321+
CMAKE_ARGS $<GENEX_EVAL:$<TARGET_PROPERTY:zephyr_property_target,TFM_CMAKE_OPTIONS>>
302322
ENABLED_PARTITIONS ${TFM_ENABLED_PARTITIONS_ARG}
303323
${TFM_PSA_TEST_ARG}
304324
CMAKE_BUILD_TYPE ${TFM_CMAKE_BUILD_TYPE}

samples/tfm_integration/tfm_integration.rst

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,30 @@ contains all the binaries, bl2, tfm_s, and the zephyr app.
172172

173173
.. _PSA Certified Level 1:
174174
https://www.psacertified.org/security-certification/psa-certified-level-1/
175+
176+
Custom CMake arguments
177+
======================
178+
179+
When building a Zephyr application with TF-M it might be necessary to control
180+
the CMake arguments passed to the TF-M build.
181+
182+
Zephyr TF-M build offers several Kconfig options for controlling the build, but
183+
doesn't cover every CMake argument supported by the TF-M build system.
184+
185+
The ``TFM_CMAKE_OPTIONS`` property on the ``zephyr_property_target`` can be used
186+
to pass custom CMake arguments to the TF-M build system.
187+
188+
To pass the CMake argument ``-DFOO=bar`` to the TF-M build system, place the
189+
following CMake snippet in your CMakeLists.txt file.
190+
191+
.. code-block:: cmake
192+
193+
set_property(TARGET zephyr_property_target
194+
APPEND PROPERTY TFM_CMAKE_OPTIONS
195+
-DFOO=bar
196+
)
197+
198+
.. note::
199+
The ``TFM_CMAKE_OPTIONS`` is a list so it is possible to append multiple
200+
options. Also CMake generator expressions are supported, such as
201+
``$<1:-DFOO=bar>``

0 commit comments

Comments
 (0)