blob: 61b1374a91b0d7f71812b14800a5ccd57f96719a [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::
6 The build process was changed a lot in Q3 2023 and included into the release after v1.9.
7 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
23TF-M uses `CMake <https://cmake.org/overview/>`__ **v3.15** or higher.
24Before 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>`
TTornblomb9e5ed02020-02-13 16:53:15 +010069
Anton Komlev4b1c05c2023-10-06 20:22:58 +010070Configuring
71===========
72TF-M has many config options for configuring and fine-tuning. Please check the
73:ref:`tf-m_configuration` section for the details. The **base** (default) configuration
74contains only essential components such as SPM and HW platform support hence the
75only mandatory argument to TF-M build is a platform name, provided via
76CMake command-line option ``-DTFM_PLATFORM=<platform name>``, it can be:
Anton Komlevb8e3af02020-08-28 10:23:57 +010077
Anton Komlev4b1c05c2023-10-06 20:22:58 +010078- A relative path under ``<TF-M source dir>/platform/ext/target``, for example ``arm/mps2/an521``.
79- An absolute path of target platform, mainly used for out-of-tree platform build.
80- A basename of the target platform folder, for example ``an521``.
Anton Komlevb8e3af02020-08-28 10:23:57 +010081
Anton Komlev4b1c05c2023-10-06 20:22:58 +010082Essential Directories
83---------------------
84There are 3 essential directories used by CMake for building TF-M:
85
86- Source code directory ``<TF-M source dir>``
87- Build directory ``<Build Dir>`` - the location of all intermediate files required to produce
88 a build target.
89- Install directory ``<Artifact Dir>`` - the location of the build output files.
90
91Note::
92 It's recommended to use absolute paths for all directories. Relative paths may not fully work.
93
94.. _Toolchains:
95
96Toolchains
97----------
98TF-M supports 3 toolchains for cross-compiling and building the project binaries:
99
100- GNU - **default**
101- ArmClang
102- IAR
103
104Each toolchain has a configuration file for the compiler and linker.
105Use ``TFM_TOOLCHAIN_FILE`` option to provide a path to a preferred toolchain file or the toolchain
106file name.
107The default **toolchain_GNUARM.cmake** is selected by `config_base.cmake`
108file if the option is omitted.
109
110.. _Build type:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100111
Anton Komlevb8e3af02020-08-28 10:23:57 +0100112Build type
113----------
Dávid Házie50f0a92022-07-06 14:46:01 +0200114By default, a MinSizeRel configuration is built. Alternate build types can be
Chris Brand80266ba2022-01-05 09:14:52 -0800115specified with the ``CMAKE_BUILD_TYPE`` variable. The possible
Anton Komlevb8e3af02020-08-28 10:23:57 +0100116types are:
117
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100118- Debug
119- RelWithDebInfo
120- Release
121- MinSizeRel - **default**
Anton Komlevb8e3af02020-08-28 10:23:57 +0100122
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100123Debug symbols are added by default to all builds, but can be removed from
124*Release* and *MinSizeRel* builds by setting ``TFM_DEBUG_SYMBOLS`` to `OFF`.
Sebastian Bøeb73f1762021-10-28 14:23:13 +0200125
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100126*RelWithDebInfo*, *Release* and *MinSizeRel* all have different
127optimizations turned on and hence will produce smaller, faster code than
128*Debug*. *MinSizeRel* will produce the smallest code and hence is often
129a good idea on RAM or flash-constrained systems.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100130
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100131.. _Output files:
132
133Output files
134------------
135In a successful build, a set of files will be created in the ``<Artifact Dir>``.
136By default, it is ``<Build Dir>\api_ns`` subfolder but you can redirect the
137output to any location using ``CMAKE_INSTALL_PREFIX`` option. It can be an
138absolute path or relative to your current directory. For the contents of the
139artifact directory please refer to :ref:`Artifacts structure`.
140
141Other build parameters
Anton Komlevb8e3af02020-08-28 10:23:57 +0100142----------------------
Anton Komlev2cd91532022-11-17 13:36:55 +0000143The full list of default options is in ``config/config_base.cmake`` and
144explained in :ref:`tfm_cmake_configuration`. Several important options
145are listed below.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100146
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800147+----------------------------+------------------------------------------+---------------+
148| Parameter | Description | Default value |
149+============================+==========================================+===============+
150| BL2 | Build level 2 secure bootloader. | ON |
151+----------------------------+------------------------------------------+---------------+
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800152| PROJECT_CONFIG_HEADER_FILE | User defined header file for TF-M config | |
153+----------------------------+------------------------------------------+---------------+
154| TFM_ISOLATION_LEVEL | Set TFM isolation level. | 1 |
155+----------------------------+------------------------------------------+---------------+
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100156| TFM_PROFILE | See :ref:`tf-m_profiles`. | |
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800157+----------------------------+------------------------------------------+---------------+
158
159Project Config Header File
160--------------------------
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100161CMake variable ``PROJECT_CONFIG_HEADER_FILE`` can be set by a user the full path to a
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800162configuration header file, which is used to fine-tune component options. The detailed reference
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100163for the project config header file is in :ref:`Header_configuration`.
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800164
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100165Building binaries
166=================
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800167
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100168The command below shows a general template for building TF-M as a typical CMake project:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100169
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200170.. code-block:: bash
171
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100172 cmake -S <TF-M source dir> -B <Build Dir> -DTFM_PLATFORM=<platform>
173 cmake --build <Build Dir> -- install
Anton Komlevb8e3af02020-08-28 10:23:57 +0100174
175.. Note::
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100176 It is recommended to clean up the build directory before re-build if the config
177 header file is updated. CMake is unable to automatically recognize the
178 dependency when the header file is defined as a macro.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100179
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100180Building default configuration for an521
181----------------------------------------
182
183.. code-block:: bash
184
185 cd <TF-M source dir>
186 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521
187 cmake --build build -- install
188
189The command above is intended to do:
190 - take TF-M sources in the current ``.`` folder
191 - build SPE in the ``build`` folder
192 - for **an521** platform
193 - using GNU toolchain *by default*. Use ``-DTFM_TOOLCHAIN_FILE=<toolchain file>``
194 for alternatives as described in :ref:`Toolchains`
195 - install output files in ``build/api_ns`` folder *by default*. You can specify
196 a different directory using ``-DCMAKE_INSTALL_PREFIX=<Artifact dir>``
197 as described in :ref:`Output files`
198
199.. Note::
Anton Komlevb8e3af02020-08-28 10:23:57 +0100200 It is recommended to build each different build configuration in a separate
201 build directory.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200202
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100203CMake can generate code for many native build systems. TF-M is tested with
204``Unix Makefiles`` (default) and ``Ninja``. The ``-G`` option can specify
205alternative generators. For example for building with Ninja in the Debug
206:ref:`Build type` using ArmClang :ref:`Toolchains` you can use the following:
Leonardo Sandoval49a558c2021-02-03 17:04:22 -0600207
208.. code-block:: bash
Subhasish Ghoshbc849302021-04-08 20:21:20 +0100209
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100210 cd <TF-M source dir>
211 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -GNinja -DTFM_TOOLCHAIN_FILE=toolchain_ARMCLANG.cmake -DCMAKE_BUILD_TYPE=Debug
212 cmake --build build -- install
Leonardo Sandoval49a558c2021-02-03 17:04:22 -0600213
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100214.. _Dependency management:
Anton Komlevb8e3af02020-08-28 10:23:57 +0100215
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100216Dependency management
217=====================
218
219The TF-M build system will fetch all dependencies by default with appropriate
220versions and store them inside the build tree. In this case, the build tree
221location is ``<build_dir>/lib/ext``.
222
223If you have local copies already and wish to avoid having the libraries
224downloaded every time the build directory is deleted, then the following
225variables can be set to the paths to the root directories of the local repos.
226This will disable the automatic downloading for that dependencies and speed up
227development iterations or allow usage of a dependency version different from the
228current one.
229Additionally, these path variables can be set in ``localrepos.cmake``
230file which will be included in a build if it exists.
231This file is ignored in TF-M git settings.
232
233The following table lists the commonly used repos. For others, you can refer to ``lib/ext``.
234
235+----------------+---------------------+-----------------------------------------------------+
236| Dependency | Cmake variable | Git repo URL |
237+================+=====================+=====================================================+
238| Mbed Crypto | MBEDCRYPTO_PATH | https://github.com/ARMmbed/mbedtls |
239+----------------+---------------------+-----------------------------------------------------+
240| MCUboot | MCUBOOT_PATH | https://github.com/mcu-tools/mcuboot |
241+----------------+---------------------+-----------------------------------------------------+
242| QCBOR | QCBOR_PATH | https://github.com/laurencelundblade/QCBOR.git |
243+----------------+---------------------+-----------------------------------------------------+
244
245The recommended versions of the dependencies are listed in ``config/config_base.cmake``.
246
247.. Note::
248
249 - Some repositories might need patches to allow building it as a part of TF-M.
250 While these patches are being upstreamed they are stored in a
251 dependency folder under ``lib/ext/``.
252 In order to use local repositories those patches shall be applied to original source.
253 An alternative is to copy out the auto-downloaded repos under the ``<build_dir>/lib/ext``.
254 They have been applied with patches and can be used directly.
255
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100256Example: building TF-M with local Mbed Crypto repo
257--------------------------------------------------
258
259Preparing a local repository consists of 2 steps: cloning and patching.
260This is only required to be done once. For dependencies without ``.patch``
261files in their ``lib/ext`` directory the only required step is
262cloning the repo and checking out the correct branch.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200263
264.. code-block:: bash
265
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100266 cd <Mbed Crypto base folder>
267 git clone https://github.com/ARMmbed/mbedtls
268 cd mbedtls
269 git checkout <MBEDCRYPTO_VERSION from <TF-M source dir>/config_base.cmake>
270 git apply <TF-M source dir>/lib/ext/mbedcrypo/*.patch
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200271
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100272.. Note::
273
274 ``<Mbed Crypto base folder>`` does not need to have any fixed position related
275 to the TF-M repo so alternative method to get prepared dependency repos is to
276 let TF-M download it once and then copy them out of the ``build/lib/ext`` folder.
277
278Now build TF-M binaries
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200279
280.. code-block:: bash
281
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100282 cd <TF-M source dir>
283 cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -DMBEDCRYPTO_PATH=<Mbed Crypto base folder>/mbedtls
284 cmake --build build -- install
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200285
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100286.. _Building NSPE:
287
288***************************
289Building Application (NSPE)
290***************************
291
292As a result of :ref:`Building SPE` you will get a set of :ref:`Output files` in
293``<Artifact Dir>`` required for building TF-M application. Essentially, SPE
294exports a binary and a set of C source files for PSA interface and platform.
295Please note that NSPE and SPE are independent projects and can be built using
296different toolchains and toolchain options.
297
298.. _Artifacts structure:
299
300SPE artifacts structure
Kevin Peng23a583c2021-09-08 22:33:33 +0800301=======================
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100302
303SPE components prepared and installed for NSPE usage in ``<Artifact Dir>``
304will have the following structure:
305
306.. code-block:: none
307
308 <Artifact Dir>
309 ├── bin
310 ├── cmake
311 ├── config
312 ├── image_signing
313 ├── interface
314 ├── platform
315 └── CMakeLists.txt
316
317With certain configurations, additional folders may also be installed.
318These folders have the following content:
319
320- **bin** - binary images of SPE, Bootloader(optional) and combined.
321- **cmake** - CMake scripts like SPE configuration and :ref:`NSPE toolchains`.
322- **config** - Configuration files
323- **image_signing** - binary image signing tool and keys.
324- **interface** - PSA interface exposed by SPE.
325- **platform** - source code for a selected hardware platform.
326- **CMakeLists.txt** - CMake script for the artifacts integration in NSPE.
327
Kevin Peng304e2682023-11-06 14:10:50 +0800328The content of ``<Artifact Dir>`` is a prepared directory for integration with CMake projects.
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100329
330.. _NSPE toolchains:
331
332NSPE toolchains
333===============
334
335SPE prepares and exports CMake toolchain files for building NSPE in all
336supported :ref:`Toolchains` in ``<Artifact Dir>/cmake`` folder.
337Toolchain used to build NSPE can be different from what is used to build SPE.
338
Anton Komlev4b1c05c2023-10-06 20:22:58 +0100339Basic SPE integration
340=====================
Kevin Peng304e2682023-11-06 14:10:50 +0800341Refer to the
342`example <https://git.trustedfirmware.org/TF-M/tf-m-extras.git/tree/examples/tf-m-example-ns-app>`__
343of TF-M applications in **tf-m-extras** repository.
Raef Coles1ecb8132020-10-02 15:11:24 +0100344
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200345--------------
346
Xinyu Zhang5f9ffeb2023-03-31 11:09:45 +0800347*Copyright (c) 2017-2023, Arm Limited. All rights reserved.*
Chris Brand80266ba2022-01-05 09:14:52 -0800348*Copyright (c) 2022, Cypress Semiconductor Corporation. All rights reserved.*