blob: 805482b8c415adc9f851dbf8b7002f750e14ce5b [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001.. SPDX-License-Identifier: BSD-3-Clause
2.. SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
3
4
5.. _build_options_examples:
6
7#####################
8RMM Build Examples
9#####################
10
11The |RMM| supports a wide range of build configuration options. Some of these options
12are more regularly exercised by developers, while others are for **advanced** and
13**experimental** usage only.
14
15|RMM| can be built using either GNU(GCC) or :ref:`LLVM(Clang)<llvm_build>`
16toolchain. See :ref:`this section<getting_started_toolchain>` for toolchain
17setup and the supported versions.
18
19The build is performed in 2 stages:
20
21**Configure Stage:** In this stage, a default config file can be specified which configures
22a sane config for the chosen platform. If this default config needs to be modified, it is
23recommended to first perform a default config and then modify using the cmake ncurses as
24shown in :ref:`CMake UI Example<build_config_example>`.
25
26**Build Stage:** In this stage, the source build is performed by specifying the `--build` option.
27See any of the commands below for an example.
28
29.. note::
30
31 It is recommended to clean build if any of the build options are changed from previous build.
32
33Below are some of the typical build and configuration examples frequently used in |RMM| development
34for the FVP Platform. Detailed configuration options are described :ref:`here<build_options_table>`.
35
36RMM also supports a ``fake_host`` build which can be used to build RMM for test
37and code analysis on the host machine. See
38:ref:`this section here<fake_host_build>` for more details.
39
401. Perform an initial default build with minimum configuration options:
41
42Build using gnu toolchain
43
44.. code-block:: bash
45
46 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
47 cmake --build ${RMM_BUILD_DIR}
48
49Build using LLVM toolchain
50
51.. code-block:: bash
52
53 cmake -DRMM_CONFIG=fvp_defcfg -DRMM_TOOLCHAIN=llvm -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
54 cmake --build ${RMM_BUILD_DIR}
55
56.. _build_config_example:
57
582. Perform an initial default config, then modify using ccmake ncurses UI:
59
60.. code-block:: bash
61
62 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
63 ccmake -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
64 cmake --build ${RMM_BUILD_DIR}
65
663. Perform a debug build and specify a log level:
67
68.. code-block:: bash
69
70 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DLOG_LEVEL=50
71 cmake --build ${RMM_BUILD_DIR}
72
734. Perform a documentation build:
74
75.. code-block:: bash
76
Soby Mathewb4c6df42022-11-09 11:13:29 +000077 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR} -DRMM_DOCS=ON
78 cmake --build ${RMM_BUILD_DIR} -- docs
79
805. Perform a clean verbose build:
81
82.. code-block:: bash
83
84 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
85 cmake --build ${RMM_BUILD_DIR} --clean-first --verbose
86
876. Perform a build with Ninja Genenerator:
88
89.. code-block:: bash
90
91 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -G "Ninja" -DLOG_LEVEL=50
92 cmake --build ${RMM_BUILD_DIR}
93
947. Perform a build with Ninja Multi Config Genenerator:
95
96.. code-block:: bash
97
98 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR} -G "Ninja Multi-Config" -DLOG_LEVEL=50
99 cmake --build ${RMM_BUILD_DIR} --config ${BUILD_TYPE}
100
1018. Perform a Cppcheck static analysis:
102
103.. code-block:: bash
104
Soby Mathew7faa95e2023-11-22 17:04:10 +0000105 cmake -DRMM_CONFIG=fvp_defcfg -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
Soby Mathewb4c6df42022-11-09 11:13:29 +0000106 cmake --build ${RMM_BUILD_DIR} -- cppcheck
107 cat ${BUILD_DIR}/tools/cppcheck/cppcheck.xml
108
Soby Mathew7faa95e2023-11-22 17:04:10 +00001099. Perform a Cppcheck static analysis with MISRA:
Soby Mathewb4c6df42022-11-09 11:13:29 +0000110
111.. code-block:: bash
112
Soby Mathew7faa95e2023-11-22 17:04:10 +0000113 cmake -DRMM_CONFIG=fvp_defcfg -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
114 cmake --build ${RMM_BUILD_DIR} -- cppcheck-misra
115 cat ${BUILD_DIR}/tools/cppcheck/cppcheck_misra.xml
Soby Mathewb4c6df42022-11-09 11:13:29 +0000116
11710. Perform a checkpatch analysis:
118
119Run checkpatch on commits in the current branch against BASE_COMMIT (default origin/master):
120
121.. code-block:: bash
122
123 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
124 cmake --build ${RMM_BUILD_DIR} -- checkpatch
125
126Run checkpatch on entire codebase:
127
128.. code-block:: bash
129
130 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
131 cmake --build ${RMM_BUILD_DIR} -- checkcodebase
132
13311. Perform a checkspdx analysis:
134
135Run checkspdx on commits in the current branch against BASE_COMMIT (default origin/master):
136
137.. code-block:: bash
138
139 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
140 cmake --build ${RMM_BUILD_DIR} -- checkspdx-patch
141
142Run checkspdx on entire codebase:
143
144.. code-block:: bash
145
146 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
147 cmake --build ${RMM_BUILD_DIR} -- checkspdx-codebase
148
14913. Check header file include order:
150
151Run checkincludes-patch on commits in the current branch against BASE_COMMIT (default origin/master):
152
153.. code-block:: bash
154
155 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
156 cmake --build ${RMM_BUILD_DIR} -- checkincludes-patch
157
158Run checkincludes on entire codebase:
159
160.. code-block:: bash
161
162 cmake -DRMM_CONFIG=fvp_defcfg -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
163 cmake --build ${RMM_BUILD_DIR} -- checkincludes-codebase
164
Chuyue Luo88c07192023-09-25 16:11:36 +010016514. Perform a clang-tidy analysis:
166
167Run clang-tidy on commits in the current branch against BASE_COMMIT (default
168origin/master):
169
170.. code-block:: bash
171
172 cmake -DRMM_CONFIG=fvp_defcfg -DRMM_TOOLCHAIN=llvm -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
173 cmake --build ${RMM_BUILD_DIR} -- clang-tidy-patch
174
175Run clang-tidy on entire codebase:
176
177.. code-block:: bash
178
179 cmake -DRMM_CONFIG=fvp_defcfg -DRMM_TOOLCHAIN=llvm -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
180 cmake --build ${RMM_BUILD_DIR} -- clang-tidy-codebase
181
182Note that clang-tidy will work with all configurations. It will only check the
183source files that are used for the specified configuration.
184
18515. Perform unit tests on development host:
Javier Almansa Sobrinoc4ad5b02022-07-05 19:05:14 +0100186
Javier Almansa Sobrinoe9653182023-09-05 16:36:52 +0100187Build and run unit tests on host platform. It is recommended to enable the
188Debug build of RMM.
Javier Almansa Sobrinoc4ad5b02022-07-05 19:05:14 +0100189
190.. code-block:: bash
191
192 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_test -DCMAKE_BUILD_TYPE=Debug -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
193 cmake --build ${RMM_BUILD_DIR} -- run-unittests
194
Javier Almansa Sobrinoe9653182023-09-05 16:36:52 +0100195Run unittests for a specific test group(s) (e.g. unittests whose group starts with 'xlat')
196
197.. code-block:: bash
198
199 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_test -DCMAKE_BUILD_TYPE=Debug -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
200 cmake --build ${RMM_BUILD_DIR} -- build -j
201 ${RMM_BUILD_DIR}/Debug/rmm.elf -gxlat -v -r${NUMBER_OF_TEST_ITERATIONS}
202
Chuyue Luo88c07192023-09-25 16:11:36 +010020316. Generate Coverage Report.
Javier Almansa Sobrinoe9653182023-09-05 16:36:52 +0100204
205It is possible to generate a coverage report for a last execution of the host
206platform (whichever the variant) by using the `run-coverage` build target.
207
208For example, to generate coverate report on the whole set of unittests:
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +0100209
210.. code-block:: bash
211
212 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_test -DRMM_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
Javier Almansa Sobrinoe9653182023-09-05 16:36:52 +0100213 cmake --build ${RMM_BUILD_DIR} -- run-unittests
214 cmake --build ${RMM_BUILD_DIR} -- run-coverage
215
216Run coverage analysis on a specific set of unittests (e.g. unittests whose group starts with 'xlat')
217
218.. code-block:: bash
219
220 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_test -DRMM_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
221 cmake --build ${RMM_BUILD_DIR} -- build -j
222 ${RMM_BUILD_DIR}/Debug/rmm.elf -gxlat
223 cmake --build ${RMM_BUILD_DIR} -- run-coverage
224
225Run coverage analysis on the `host_build` variant of host platform:
226
227.. code-block:: bash
228
229 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_build -DRMM_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
230 ${RMM_BUILD_DIR}/Debug/rmm.elf
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +0100231 cmake --build ${RMM_BUILD_DIR} -- run-coverage
232
233The above commands will automatically generate the HTML coverage report in folder
Javier Almansa Sobrinoe9653182023-09-05 16:36:52 +0100234`build/Debug/coverage` within the build directory. The HTML generation can be
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +0100235disabled by setting `RMM_HTML_COV_REPORT=OFF`.
236
Mate Toth-Pal83a45bd2023-09-01 11:17:19 +020023717. Run CBMC analysis:
238
239Run ``COVERAGE``, ``ANALYSIS`` and ``ASSERT`` targets for CBMC. The results
240are generated in ``${RMM_BUILD_DIR}/tools/cbmc/cbmc_coverage_results``.
241
242.. code-block:: bash
243
244 cmake -DRMM_CONFIG=host_defcfg -DHOST_VARIANT=host_cbmc -S ${RMM_SOURCE_DIR} -B ${RMM_BUILD_DIR}
245 cmake --build ${RMM_BUILD_DIR} -- cbmc-coverage cbmc-analysis cbmc-assert
246
Soby Mathewb4c6df42022-11-09 11:13:29 +0000247.. _build_options_table:
248
249###################
250RMM Build Options
251###################
252
253The |RMM| build system supports the following CMake build options.
254
255.. csv-table:: RMM CMake Options Table
256 :header: "Option", "Valid values", "Default", "Description"
257
258 RMM_CONFIG , , ,"Platform build configuration, eg: fvp_defcfg for the FVP"
259 RMM_ARCH ,aarch64 | fake_host ,aarch64 ,"Target Architecture for RMM build"
260 RMM_MAX_SIZE , ,0x0 ,"Maximum size for RMM image"
261 MAX_CPUS , ,16 ,"Maximum number of CPUs supported by RMM"
Mate Toth-Palac0cfbb2023-06-19 16:29:52 +0200262 GRANULE_SHIFT , ,12 ,"Granule Shift used by RMM"
AlexeiFedorovea68b552023-10-03 11:11:47 +0100263 RMM_CCA_TOKEN_BUFFER , ,1 ,"Number of pages to allocate in Aux granules for Realm CCA token"
Soby Mathewb4c6df42022-11-09 11:13:29 +0000264 RMM_DOCS ,ON | OFF ,OFF ,"RMM Documentation build"
265 CMAKE_BUILD_TYPE ,Debug | Release ,Release ,"CMake Build type"
266 CMAKE_CONFIGURATION_TYPES ,Debug & Release ,Debug & Release ,"Multi-generator configuration types"
267 CMAKE_DEFAULT_BUILD_TYPE ,Debug | Release ,Release ,"Default multi-generator configuration type"
268 MbedTLS_BUILD_TYPE ,Debug | Release ,Release ,"MbedTLS build type"
269 RMM_PLATFORM ,fvp | host , ,"Platform to build"
270 RMM_TOOLCHAIN ,gnu | llvm , ,"Toolchain name"
271 LOG_LEVEL , ,40 ,"Log level to apply for RMM (0 - 50)"
272 RMM_STATIC_ANALYSIS , , ,"Enable static analysis checkers"
Soby Mathewb4c6df42022-11-09 11:13:29 +0000273 RMM_UART_ADDR , ,0x0 ,"Base addr of UART to be used for RMM logs"
274 PLAT_CMN_CTX_MAX_XLAT_TABLES , ,0 ,"Maximum number of translation tables used by the runtime context"
Javier Almansa Sobrinoed932592023-01-24 12:50:41 +0000275 PLAT_CMN_EXTRA_MMAP_REGIONS , ,0 ,"Extra platform mmap regions that need to be mapped in S1 xlat tables"
Mate Toth-Pal7f5b27d2023-08-08 13:49:19 +0200276 RMM_NUM_PAGES_PER_STACK , ,5 ,"Number of pages to use per CPU stack"
Soby Mathewb4c6df42022-11-09 11:13:29 +0000277 MBEDTLS_ECP_MAX_OPS ,248 - ,1000 ,"Number of max operations per ECC signing iteration"
278 RMM_FPU_USE_AT_REL2 ,ON | OFF ,OFF(fake_host) ON(aarch64),"Enable FPU/SIMD usage in RMM."
279 RMM_MAX_GRANULES , ,0 ,"Maximum number of memory granules available to the system"
Mate Toth-Palae6b3152023-06-19 15:19:58 +0200280 HOST_VARIANT ,host_build | host_test | host_cbmc ,host_build ,"Variant to build for the host platform. Only available when RMM_PLATFORM=host"
Mate Toth-Pal0a8f37c2023-08-09 13:37:55 +0200281 HOST_MEM_SIZE , ,0x40000000 ,"Host memory size that will be used as physical granules"
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +0100282 RMM_COVERAGE ,ON | OFF ,OFF ,"Enable coverage analysis"
283 RMM_HTML_COV_REPORT ,ON | OFF ,ON ,"Enable HTML output report for coverage analysis"
Mate Toth-Pal0361dcb2023-11-29 10:20:12 +0100284 RMM_CBMC_VIEWER_OUTPUT ,ON | OFF ,OFF ,"Generate report of CBMC results using the tool cbmc-viewer"
Mate Toth-Palc492f482023-12-19 09:46:29 +0100285 RMM_CBMC_SINGLE_TESTBENCH , ,OFF ,"Run CBMC on a single testbench instead on all of them"
Soby Mathewb4c6df42022-11-09 11:13:29 +0000286
287.. _llvm_build:
288
289################
290RMM LLVM Build
291################
292
293RMM can be built using LLVM Toolchain (Clang). To build using LLVM
294toolchain, set RMM_TOOLCHAIN=llvm during configuration stage.
295
296.. _fake_host_build:
297
298#####################
299RMM Fake Host Build
300#####################
301
302RMM also provides a ``fake_host`` target architecture which allows the code to
303be built natively on the host using the host toolchain. To build for
304``fake_host`` architecture, set RMM_CONFIG=host_defcfg during the
305configuration stage.