1##################
2Build instructions
3##################
4
5.. warning::
6    The build process was changed a lot in Q3 2023 and included into the release v2.0.
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.
15SPE 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.
22
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
26:doc:`TF-M getting started </getting_started/tfm_getting_started>`.
27
28.. contents:: Contents
29    :depth: 2
30    :local:
31
32The additional building materials you can find in the following links:TF-M source folder
33
34.. toctree::
35    :maxdepth: 1
36
37    Build Tests <tests_build_instruction>
38    Run TF-M tests and applications <run_tfm_examples_on_arm_platforms>
39    Building the documentation <documentation_generation>
40    IAR toolchain <tfm_build_instruction_iar>
41
42.. _Building SPE:
43
44*******************
45Building TF-M (SPE)
46*******************
47This build generates the SPE binary and artifacts, necessary for :ref:`Building NSPE`.
48
49.. _Getting the source-code:
50
51Getting the source code
52=======================
53.. code-block:: bash
54
55    cd <base folder>
56    git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
57
58In 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`.
62
63.. Note::
64
65 - For building with Armclang compiler version 6.10.0+, please follow the note
66   in :doc:`TF-M getting started </getting_started/tfm_getting_started>`.
67 - For building with the IAR toolchain, please see the notes in
68   :doc:`IAR software requirements <tfm_build_instruction_iar>`
69 - Please use "/" instead of "\\" for paths when running CMAKE commands under
70   Windows Command Prompt.
71
72Configuring
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:
79
80- 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``.
83
84Essential 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----------
100TF-M supports 3 toolchains for cross-compiling and building the project binaries:
101
102- GNU - **default**
103- ArmClang
104- IAR
105
106Each toolchain has a configuration file for the compiler and linker.
107They are located at the root directory of TF-M.
108Use ``TFM_TOOLCHAIN_FILE`` option to provide the absolute path to the preferred toolchain file,
109or relative path to working directory.
110The default **toolchain_GNUARM.cmake** is selected by `config_base.cmake`
111file if the option is omitted.
112
113.. _Build type:
114
115Build type
116----------
117By default, a MinSizeRel configuration is built. Alternate build types can be
118specified with the ``CMAKE_BUILD_TYPE`` variable. The possible
119types are:
120
121- Debug
122- RelWithDebInfo
123- Release
124- MinSizeRel - **default**
125
126Debug symbols are added by default to all builds, but can be removed from
127*Release* and *MinSizeRel* builds by setting ``TFM_DEBUG_SYMBOLS`` to `OFF`.
128
129*RelWithDebInfo*, *Release* and *MinSizeRel* all have different
130optimizations turned on and hence will produce smaller, faster code than
131*Debug*. *MinSizeRel* will produce the smallest code and hence is often
132a good idea on RAM or flash-constrained systems.
133
134.. _Output files:
135
136Output files
137------------
138In a successful build, a set of files will be created in the ``<Artifact Dir>``.
139By default, it is ``<Build Dir>\api_ns`` subfolder but you can redirect the
140output to any location using ``CMAKE_INSTALL_PREFIX`` option. It can be an
141absolute path or relative to your current directory. For the contents of the
142artifact directory please refer to :ref:`Artifacts structure`.
143
144Other build parameters
145----------------------
146The full list of default options is in ``config/config_base.cmake`` and
147explained in :ref:`tfm_cmake_configuration`. Several important options
148are listed below.
149
150+----------------------------+------------------------------------------+---------------+
151| Parameter                  | Description                              | Default value |
152+============================+==========================================+===============+
153| BL2                        | Build level 2 secure bootloader.         | ON            |
154+----------------------------+------------------------------------------+---------------+
155| PROJECT_CONFIG_HEADER_FILE | User defined header file for TF-M config |               |
156+----------------------------+------------------------------------------+---------------+
157| TFM_ISOLATION_LEVEL        | Set TF-M isolation level.                | 1             |
158+----------------------------+------------------------------------------+---------------+
159| TFM_PROFILE                | See :ref:`tf-m_profiles`.                |               |
160+----------------------------+------------------------------------------+---------------+
161
162Project Config Header File
163--------------------------
164CMake variable ``PROJECT_CONFIG_HEADER_FILE`` can be set by a user the full path to a
165configuration header file, which is used to fine-tune component options. The detailed reference
166for the project config header file is in :ref:`Header_configuration`.
167
168Building binaries
169=================
170
171The command below shows a general template for building TF-M as a typical CMake project:
172
173.. code-block:: bash
174
175    cmake -S <TF-M source dir> -B <Build Dir> -DTFM_PLATFORM=<platform>
176    cmake --build <Build Dir> -- install
177
178.. Note::
179    It is recommended to clean up the build directory before re-build if the config
180    header file is updated. CMake is unable to automatically recognize the
181    dependency when the header file is defined as a macro.
182
183Building default configuration for an521
184----------------------------------------
185
186.. code-block:: bash
187
188    cd <TF-M source dir>
189    cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521
190    cmake --build build -- install
191
192The command above is intended to do:
193  - take TF-M sources in the current ``.`` folder
194  - build SPE in the ``build`` folder
195  - for **an521** platform
196  - using GNU toolchain *by default*. Use ``-DTFM_TOOLCHAIN_FILE=<toolchain file>``
197    for alternatives as described in :ref:`Toolchains`
198  - install output files in ``build/api_ns`` folder *by default*. You can specify
199    a different directory using ``-DCMAKE_INSTALL_PREFIX=<Artifact dir>``
200    as described in :ref:`Output files`
201
202.. Note::
203    It is recommended to build each different build configuration in a separate
204    build directory.
205
206CMake can generate code for many native build systems. TF-M is tested with
207``Unix Makefiles`` (default) and ``Ninja``. The ``-G`` option can specify
208alternative generators. For example for building with Ninja in the Debug
209:ref:`Build type` using ArmClang :ref:`Toolchains` you can use the following:
210
211.. code-block:: bash
212
213    cd <TF-M source dir>
214    cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -GNinja -DTFM_TOOLCHAIN_FILE=toolchain_ARMCLANG.cmake -DCMAKE_BUILD_TYPE=Debug
215    cmake --build build -- install
216
217.. _Dependency management:
218
219Dependency management
220=====================
221
222The TF-M build system will fetch all dependencies by default with appropriate
223versions and store them inside the build tree. In this case, the build tree
224location is ``<build_dir>/lib/ext``.
225
226If you have local copies already and wish to avoid having the libraries
227downloaded every time the build directory is deleted, then the following
228variables can be set to the paths to the root directories of the local repos.
229This will disable the automatic downloading for that dependencies and speed up
230development iterations or allow usage of a dependency version different from the
231current one.
232Additionally, these path variables can be set in ``localrepos.cmake``
233file which will be included in a build if it exists.
234This file is ignored in TF-M git settings.
235
236The following table lists the commonly used repos. For others, you can refer to ``lib/ext``.
237
238+----------------+---------------------+-----------------------------------------------------+
239| Dependency     | Cmake variable      | Git repo URL                                        |
240+================+=====================+=====================================================+
241| Mbed Crypto    | MBEDCRYPTO_PATH     | https://github.com/ARMmbed/mbedtls                  |
242+----------------+---------------------+-----------------------------------------------------+
243| MCUboot        | MCUBOOT_PATH        | https://github.com/mcu-tools/mcuboot                |
244+----------------+---------------------+-----------------------------------------------------+
245| QCBOR          | QCBOR_PATH          | https://github.com/laurencelundblade/QCBOR.git      |
246+----------------+---------------------+-----------------------------------------------------+
247
248The recommended versions of the dependencies are listed in ``config/config_base.cmake``.
249
250.. Note::
251
252 - Some repositories might need patches to allow building it as a part of TF-M.
253   While these patches are being upstreamed they are stored in a
254   dependency folder under ``lib/ext/``.
255   In order to use local repositories those patches shall be applied to original source.
256   An alternative is to copy out the auto-downloaded repos under the ``<build_dir>/lib/ext``.
257   They have been applied with patches and can be used directly.
258
259Example: building TF-M with local Mbed Crypto repo
260--------------------------------------------------
261
262Preparing a local repository consists of 2 steps: cloning and patching.
263This is only required to be done once. For dependencies without ``.patch``
264files in their ``lib/ext`` directory the only required step is
265cloning the repo and checking out the correct branch.
266
267.. code-block:: bash
268
269    cd <Mbed Crypto base folder>
270    git clone https://github.com/ARMmbed/mbedtls
271    cd mbedtls
272    git checkout <MBEDCRYPTO_VERSION> from <TF-M source dir>/config/config_base.cmake>
273    git apply <TF-M source dir>/lib/ext/mbedcrypto/*.patch
274
275.. Note::
276
277   ``<Mbed Crypto base folder>`` does not need to have any fixed position related
278   to the TF-M repo so alternative method to get prepared dependency repos is to
279   let TF-M download it once and then copy them out of the ``build/lib/ext`` folder.
280
281Now build TF-M binaries
282
283.. code-block:: bash
284
285    cd <TF-M source dir>
286    cmake -S . -B build -DTFM_PLATFORM=arm/mps2/an521 -DMBEDCRYPTO_PATH=<Mbed Crypto base folder>/mbedtls
287    cmake --build build -- install
288
289.. _Building NSPE:
290
291***************************
292Building Application (NSPE)
293***************************
294
295As a result of :ref:`Building SPE` you will get a set of :ref:`Output files` in
296``<Artifact Dir>`` required for building TF-M application. Essentially, SPE
297exports a binary and a set of C source files for PSA interface and platform.
298Please note that NSPE and SPE are independent projects and can be built using
299different toolchains and toolchain options.
300
301.. _Artifacts structure:
302
303SPE artifacts structure
304=======================
305
306SPE components prepared and installed for NSPE usage in ``<Artifact Dir>``
307will have the following structure:
308
309.. code-block:: none
310
311    <Artifact Dir>
312    ├── bin
313    ├── cmake
314    ├── config
315    ├── image_signing
316    ├── interface
317    ├── platform
318    └── CMakeLists.txt
319
320With certain configurations, additional folders may also be installed.
321These folders have the following content:
322
323- **bin** - binary images of SPE, Bootloader(optional) and combined.
324- **cmake** - CMake scripts like SPE configuration and :ref:`NSPE toolchains`.
325- **config** - Configuration files
326- **image_signing** - binary image signing tool and keys.
327- **interface** - PSA interface exposed by SPE.
328- **platform** - source code for a selected hardware platform.
329- **CMakeLists.txt** - CMake script for the artifacts integration in NSPE.
330
331The content of ``<Artifact Dir>`` is an exported directory for integration with CMake projects.
332
333.. Note::
334    Attempting to change any file in <Artifact Dir> may cause incompatibility issues.
335    Instead, please change the corresponding file in the <TF-M source dir>.
336
337.. _NSPE toolchains:
338
339NSPE toolchains
340===============
341
342SPE prepares and exports CMake toolchain files for building NSPE in all
343supported :ref:`Toolchains` in ``<Artifact Dir>/cmake`` folder.
344Toolchain used to build NSPE can be different from what is used to build SPE.
345
346Basic SPE integration
347=====================
348Refer to the
349`example <https://git.trustedfirmware.org/TF-M/tf-m-extras.git/tree/examples/tf-m-example-ns-app>`__
350of TF-M applications in **tf-m-extras** repository.
351
352--------------
353
354*Copyright (c) 2017-2024, Arm Limited. All rights reserved.*
355*Copyright (c) 2022, Cypress Semiconductor Corporation. All rights reserved.*
356