blob: fbab194f8477370f5e64448f646927976904f314 [file] [log] [blame]
Galanakis, Minos41f85972019-09-30 15:56:40 +01001##################
2Build instructions
3##################
Anton Komlev0dbe8f12022-06-17 16:48:12 +01004
Anton Komlev4b1c05c2023-10-06 20:22:58 +01005.. warning::
Kevin Penga04581e2023-11-20 14:18:49 +08006 The build process was changed a lot in Q3 2023 and included into the release v2.0.
Anton Komlev4b1c05c2023-10-06 20:22:58 +01007 For building instructions for early versions please refer to the documentation of respective
8 versions.
9
10As you know from the :doc:`introduction </introduction/readme>` TF-M implements
11:term:`SPE` with a set of secure services.
12TF-M application as :term:`NSPE` client uses those services through isolation boundary via
13:term:`PSA-FF-M` API.
14Both SPE and NSPE are separate binaries and built independently.
Kevin Peng304e2682023-11-06 14:10:50 +080015SPE and NSPE binaries are combined and signed making the final image for downloading onto targets
16when building NSPE.
17
18.. Note::
19 This document describes the process of building a single SPE alone.
20 Refer to :doc:`Building Tests </building/tests_build_instruction>` on how to build TF-M
21 regression tests and PSA Arch tests to verify TF-M.
Anton Komlev4b1c05c2023-10-06 20:22:58 +010022
Nik Dewallyae923b12024-06-26 15:30:09 +010023TF-M uses `CMake <https://cmake.org/overview/>`__ **v3.21** or higher.
Anton Komlev4b1c05c2023-10-06 20:22:58 +010024Before starting please make sure you have all required software installed and
25configured as explained in the
Anton Komlev3356ba32022-03-31 22:02:11 +010026:doc:`TF-M getting started </getting_started/tfm_getting_started>`.
Anton Komlev4b1c05c2023-10-06 20:22:58 +010027
28.. contents:: Contents
29 :depth: 2
30 :local:
31
32The additional building materials you can find in the following links:TF-M source folder
Anton Komlev91281f02022-04-22 09:24:20 +010033
34.. toctree::
35 :maxdepth: 1
36
Kevin Peng304e2682023-11-06 14:10:50 +080037 Build Tests <tests_build_instruction>
Anton Komlev4b1c05c2023-10-06 20:22:58 +010038 Run TF-M tests and applications <run_tfm_examples_on_arm_platforms>
Anton Komlev0dbe8f12022-06-17 16:48:12 +010039 Building the documentation <documentation_generation>
40 IAR toolchain <tfm_build_instruction_iar>
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020041
Anton Komlev4b1c05c2023-10-06 20:22:58 +010042.. _Building SPE:
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020043
Anton Komlev4b1c05c2023-10-06 20:22:58 +010044*******************
45Building TF-M (SPE)
46*******************
47This build generates the SPE binary and artifacts, necessary for :ref:`Building NSPE`.
Raef Coles1ecb8132020-10-02 15:11:24 +010048
David Wangd6fd6af2021-06-21 17:17:26 +080049.. _Getting the source-code:
50
Anton Komlev4b1c05c2023-10-06 20:22:58 +010051Getting the source code
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020052=======================
53.. code-block:: bash
54
Leonardo Sandovald7f72d52020-07-28 18:02:34 -050055 cd <base folder>
Minos Galanakis0f39fa52020-06-08 16:53:53 +010056 git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
Anton Komlevb8e3af02020-08-28 10:23:57 +010057
Anton Komlev4b1c05c2023-10-06 20:22:58 +010058In this documentation, the cloned ``trusted-firmware-m`` repository will be referenced as
59``<TF-M source dir>``.
60Additionally, TF-M depends on several external projects, handled by CMake automatically but
61you can alter that behaviour using :ref:`Dependency management`.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020062
Minos Galanakisac6b06c2020-03-19 12:57:02 +000063.. Note::
Anton Komlevb8e3af02020-08-28 10:23:57 +010064
Minos Galanakis3b740a12020-10-15 11:10:26 +010065 - For building with Armclang compiler version 6.10.0+, please follow the note
Anton Komlev3356ba32022-03-31 22:02:11 +010066 in :doc:`TF-M getting started </getting_started/tfm_getting_started>`.
Anton Komlevb8e3af02020-08-28 10:23:57 +010067 - For building with the IAR toolchain, please see the notes in
Minos Galanakis3b740a12020-10-15 11:10:26 +010068 :doc:`IAR software requirements <tfm_build_instruction_iar>`
Ken Liu6792e042023-11-13 14:48:00 +080069 - Please use "/" instead of "\\" for paths when running CMAKE commands under
70 Windows Command Prompt.
TTornblomb9e5ed02020-02-13 16:53:15 +010071
Anton Komlev4b1c05c2023-10-06 20:22:58 +010072Configuring
73===========
74TF-M has many config options for configuring and fine-tuning. Please check the
75:ref:`tf-m_configuration` section for the details. The **base** (default) configuration
76contains only essential components such as SPM and HW platform support hence the
77only mandatory argument to TF-M build is a platform name, provided via
78CMake command-line option ``-DTFM_PLATFORM=<platform name>``, it can be:
Anton Komlevb8e3af02020-08-28 10:23:57 +010079
Anton Komlev4b1c05c2023-10-06 20:22:58 +010080- A relative path under ``<TF-M source dir>/platform/ext/target``, for example ``arm/mps2/an521``.
81- An absolute path of target platform, mainly used for out-of-tree platform build.
82- A basename of the target platform folder, for example ``an521``.
Anton Komlevb8e3af02020-08-28 10:23:57 +010083
Anton Komlev4b1c05c2023-10-06 20:22:58 +010084Essential Directories
85---------------------
86There are 3 essential directories used by CMake for building TF-M:
87
88- Source code directory ``<TF-M source dir>``
89- Build directory ``<Build Dir>`` - the location of all intermediate files required to produce
90 a build target.
91- Install directory ``<Artifact Dir>`` - the location of the build output files.
92
93Note::
94 It's recommended to use absolute paths for all directories. Relative paths may not fully work.
95
96.. _Toolchains:
97
98Toolchains
99----------
Anton Komlev25afa332024-12-27 15:19:51 +0000100TF-M supports 4 toolchains for cross-compiling and building the project binaries:
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100101
102- GNU - **default**
103- ArmClang
104- IAR
Anton Komlev25afa332024-12-27 15:19:51 +0000105- LLVM Embedded Toolchain for Arm
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100106
107Each toolchain has a configuration file for the compiler and linker.
Kevin Peng1872b5d2023-11-10 15:13:11 +0800108They are located at the root directory of TF-M.
109Use ``TFM_TOOLCHAIN_FILE`` option to provide the absolute path to the preferred toolchain file,
110or relative path to working directory.
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100111The default **toolchain_GNUARM.cmake** is selected by `config_base.cmake`
112file if the option is omitted.
113
114.. _Build type:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100115
Anton Komlevb8e3af02020-08-28 10:23:57 +0100116Build type
117----------
Dávid Házie50f0a92022-07-06 14:46:01 +0200118By default, a MinSizeRel configuration is built. Alternate build types can be
Chris Brand80266ba2022-01-05 09:14:52 -0800119specified with the ``CMAKE_BUILD_TYPE`` variable. The possible
Anton Komlevb8e3af02020-08-28 10:23:57 +0100120types are:
121
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100122- Debug
123- RelWithDebInfo
124- Release
125- MinSizeRel - **default**
Anton Komlevb8e3af02020-08-28 10:23:57 +0100126
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100127Debug symbols are added by default to all builds, but can be removed from
128*Release* and *MinSizeRel* builds by setting ``TFM_DEBUG_SYMBOLS`` to `OFF`.
Sebastian Bøeb73f1762021-10-28 14:23:13 +0200129
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100130*RelWithDebInfo*, *Release* and *MinSizeRel* all have different
131optimizations turned on and hence will produce smaller, faster code than
132*Debug*. *MinSizeRel* will produce the smallest code and hence is often
133a good idea on RAM or flash-constrained systems.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100134
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100135.. _Output files:
136
137Output files
138------------
139In a successful build, a set of files will be created in the ``<Artifact Dir>``.
140By default, it is ``<Build Dir>\api_ns`` subfolder but you can redirect the
141output to any location using ``CMAKE_INSTALL_PREFIX`` option. It can be an
142absolute path or relative to your current directory. For the contents of the
143artifact directory please refer to :ref:`Artifacts structure`.
144
145Other build parameters
Anton Komlevb8e3af02020-08-28 10:23:57 +0100146----------------------
Anton Komlev2cd91532022-11-17 13:36:55 +0000147The full list of default options is in ``config/config_base.cmake`` and
148explained in :ref:`tfm_cmake_configuration`. Several important options
149are listed below.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100150
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800151+----------------------------+------------------------------------------+---------------+
152| Parameter | Description | Default value |
153+============================+==========================================+===============+
154| BL2 | Build level 2 secure bootloader. | ON |
155+----------------------------+------------------------------------------+---------------+
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800156| PROJECT_CONFIG_HEADER_FILE | User defined header file for TF-M config | |
157+----------------------------+------------------------------------------+---------------+
Nicola Mazzucatoafd24bb2024-02-14 17:27:27 +0000158| TFM_ISOLATION_LEVEL | Set TF-M isolation level. | 1 |
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800159+----------------------------+------------------------------------------+---------------+
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100160| TFM_PROFILE | See :ref:`tf-m_profiles`. | |
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800161+----------------------------+------------------------------------------+---------------+
162
163Project Config Header File
164--------------------------
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100165CMake variable ``PROJECT_CONFIG_HEADER_FILE`` can be set by a user the full path to a
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800166configuration header file, which is used to fine-tune component options. The detailed reference
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100167for the project config header file is in :ref:`Header_configuration`.
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800168
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100169Building binaries
170=================
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800171
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100172The command below shows a general template for building TF-M as a typical CMake project:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100173
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200174.. code-block:: bash
175
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100176 cmake -S <TF-M source dir> -B <Build Dir> -DTFM_PLATFORM=<platform>
177 cmake --build <Build Dir> -- install
Anton Komlevb8e3af02020-08-28 10:23:57 +0100178
179.. Note::
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100180 It is recommended to clean up the build directory before re-build if the config
181 header file is updated. CMake is unable to automatically recognize the
182 dependency when the header file is defined as a macro.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100183
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100184Building default configuration for an521
185----------------------------------------
186
187.. code-block:: bash
188
189 cd <TF-M source dir>
190 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521
191 cmake --build build -- install
192
193The command above is intended to do:
194 - take TF-M sources in the current ``.`` folder
195 - build SPE in the ``build`` folder
196 - for **an521** platform
197 - using GNU toolchain *by default*. Use ``-DTFM_TOOLCHAIN_FILE=<toolchain file>``
198 for alternatives as described in :ref:`Toolchains`
199 - install output files in ``build/api_ns`` folder *by default*. You can specify
200 a different directory using ``-DCMAKE_INSTALL_PREFIX=<Artifact dir>``
201 as described in :ref:`Output files`
202
203.. Note::
Anton Komlevb8e3af02020-08-28 10:23:57 +0100204 It is recommended to build each different build configuration in a separate
205 build directory.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200206
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100207CMake can generate code for many native build systems. TF-M is tested with
208``Unix Makefiles`` (default) and ``Ninja``. The ``-G`` option can specify
209alternative generators. For example for building with Ninja in the Debug
210:ref:`Build type` using ArmClang :ref:`Toolchains` you can use the following:
Leonardo Sandoval49a558c2021-02-03 17:04:22 -0600211
212.. code-block:: bash
Subhasish Ghoshbc849302021-04-08 20:21:20 +0100213
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100214 cd <TF-M source dir>
215 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -GNinja -DTFM_TOOLCHAIN_FILE=toolchain_ARMCLANG.cmake -DCMAKE_BUILD_TYPE=Debug
216 cmake --build build -- install
Leonardo Sandoval49a558c2021-02-03 17:04:22 -0600217
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100218.. _Dependency management:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100219
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100220Dependency management
221=====================
222
223The TF-M build system will fetch all dependencies by default with appropriate
224versions and store them inside the build tree. In this case, the build tree
225location is ``<build_dir>/lib/ext``.
226
227If you have local copies already and wish to avoid having the libraries
228downloaded every time the build directory is deleted, then the following
229variables can be set to the paths to the root directories of the local repos.
230This will disable the automatic downloading for that dependencies and speed up
231development iterations or allow usage of a dependency version different from the
232current one.
233Additionally, these path variables can be set in ``localrepos.cmake``
234file which will be included in a build if it exists.
235This file is ignored in TF-M git settings.
236
237The following table lists the commonly used repos. For others, you can refer to ``lib/ext``.
238
239+----------------+---------------------+-----------------------------------------------------+
240| Dependency | Cmake variable | Git repo URL |
241+================+=====================+=====================================================+
242| Mbed Crypto | MBEDCRYPTO_PATH | https://github.com/ARMmbed/mbedtls |
243+----------------+---------------------+-----------------------------------------------------+
244| MCUboot | MCUBOOT_PATH | https://github.com/mcu-tools/mcuboot |
245+----------------+---------------------+-----------------------------------------------------+
246| QCBOR | QCBOR_PATH | https://github.com/laurencelundblade/QCBOR.git |
247+----------------+---------------------+-----------------------------------------------------+
248
249The recommended versions of the dependencies are listed in ``config/config_base.cmake``.
250
251.. Note::
252
253 - Some repositories might need patches to allow building it as a part of TF-M.
254 While these patches are being upstreamed they are stored in a
255 dependency folder under ``lib/ext/``.
256 In order to use local repositories those patches shall be applied to original source.
257 An alternative is to copy out the auto-downloaded repos under the ``<build_dir>/lib/ext``.
258 They have been applied with patches and can be used directly.
259
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100260Example: building TF-M with local Mbed Crypto repo
261--------------------------------------------------
262
263Preparing a local repository consists of 2 steps: cloning and patching.
264This is only required to be done once. For dependencies without ``.patch``
265files in their ``lib/ext`` directory the only required step is
266cloning the repo and checking out the correct branch.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200267
268.. code-block:: bash
269
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100270 cd <Mbed Crypto base folder>
271 git clone https://github.com/ARMmbed/mbedtls
272 cd mbedtls
Nicola Mazzucatoafd24bb2024-02-14 17:27:27 +0000273 git checkout <MBEDCRYPTO_VERSION> from <TF-M source dir>/config/config_base.cmake>
274 git apply <TF-M source dir>/lib/ext/mbedcrypto/*.patch
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200275
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100276.. Note::
277
278 ``<Mbed Crypto base folder>`` does not need to have any fixed position related
279 to the TF-M repo so alternative method to get prepared dependency repos is to
280 let TF-M download it once and then copy them out of the ``build/lib/ext`` folder.
281
282Now build TF-M binaries
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200283
284.. code-block:: bash
285
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100286 cd <TF-M source dir>
287 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -DMBEDCRYPTO_PATH=<Mbed Crypto base folder>/mbedtls
288 cmake --build build -- install
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200289
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100290.. _Building NSPE:
291
292***************************
293Building Application (NSPE)
294***************************
295
296As a result of :ref:`Building SPE` you will get a set of :ref:`Output files` in
297``<Artifact Dir>`` required for building TF-M application. Essentially, SPE
298exports a binary and a set of C source files for PSA interface and platform.
299Please note that NSPE and SPE are independent projects and can be built using
300different toolchains and toolchain options.
301
302.. _Artifacts structure:
303
304SPE artifacts structure
Kevin Peng23a583c2021-09-08 22:33:33 +0800305=======================
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100306
307SPE components prepared and installed for NSPE usage in ``<Artifact Dir>``
308will have the following structure:
309
310.. code-block:: none
311
312 <Artifact Dir>
313 ├── bin
314 ├── cmake
315 ├── config
316 ├── image_signing
317 ├── interface
318 ├── platform
319 └── CMakeLists.txt
320
321With certain configurations, additional folders may also be installed.
322These folders have the following content:
323
324- **bin** - binary images of SPE, Bootloader(optional) and combined.
325- **cmake** - CMake scripts like SPE configuration and :ref:`NSPE toolchains`.
326- **config** - Configuration files
327- **image_signing** - binary image signing tool and keys.
328- **interface** - PSA interface exposed by SPE.
329- **platform** - source code for a selected hardware platform.
330- **CMakeLists.txt** - CMake script for the artifacts integration in NSPE.
331
Kevin Peng2d170442023-11-20 14:09:07 +0800332The content of ``<Artifact Dir>`` is an exported directory for integration with CMake projects.
333
334.. Note::
335 Attempting to change any file in <Artifact Dir> may cause incompatibility issues.
336 Instead, please change the corresponding file in the <TF-M source dir>.
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100337
338.. _NSPE toolchains:
339
340NSPE toolchains
341===============
342
343SPE prepares and exports CMake toolchain files for building NSPE in all
344supported :ref:`Toolchains` in ``<Artifact Dir>/cmake`` folder.
345Toolchain used to build NSPE can be different from what is used to build SPE.
346
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100347Basic SPE integration
348=====================
Kevin Peng304e2682023-11-06 14:10:50 +0800349Refer to the
Nik Dewallye6cd9da2024-06-14 14:23:12 +0100350`example <https://git.trustedfirmware.org/TF-M/tf-m-extras.git/+/refs/heads/main/examples/tf-m-example-ns-app/>`__
Kevin Peng304e2682023-11-06 14:10:50 +0800351of TF-M applications in **tf-m-extras** repository.
Raef Coles1ecb8132020-10-02 15:11:24 +0100352
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200353--------------
354
Nicola Mazzucatoafd24bb2024-02-14 17:27:27 +0000355*Copyright (c) 2017-2024, Arm Limited. All rights reserved.*
Chris Brand80266ba2022-01-05 09:14:52 -0800356*Copyright (c) 2022, Cypress Semiconductor Corporation. All rights reserved.*