blob: 00e07cad367301aec8fcea605e1eaecc0d6c6f28 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001#
2# SPDX-License-Identifier: BSD-3-Clause
3# SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4#
5
Soby Mathewd2024c02025-05-21 13:14:33 +01006cmake_minimum_required(VERSION 3.20.0)
Soby Mathewb4c6df42022-11-09 11:13:29 +00007
8# allow target_link_libraries() to be used with targets in other directories
9cmake_policy(SET CMP0079 NEW)
10
11#
12# Add our module search paths so we can `include()` our CMake modules.
13#
Soby Mathewb4c6df42022-11-09 11:13:29 +000014list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
Soby Mathewb5a29752024-11-14 14:26:11 +000015include(GitUtils)
Soby Mathewb4c6df42022-11-09 11:13:29 +000016
17#
18# Include any dependencies.
19#
Soby Mathewb4c6df42022-11-09 11:13:29 +000020include(ArmConfigOption)
21include(ArmConfigOptionOverride)
22
23#
Soby Mathewb5a29752024-11-14 14:26:11 +000024# Update the Submodules
25#
26Git_Update_Submodule()
27
28#
Soby Mathewb4c6df42022-11-09 11:13:29 +000029# Run preliminary setup scripts.
30#
31set(RMM_CONFIG_FILE "${CMAKE_SOURCE_DIR}/configs/${RMM_CONFIG}.cmake")
32if(NOT EXISTS ${RMM_CONFIG_FILE})
33 message(FATAL_ERROR "Please provide config ${RMM_CONFIG_FILE}")
34endif()
35
36include("${RMM_CONFIG_FILE}")
37
38#
39# Set the target build Architecture before we proceed further.
40# Default is aarch64.
41#
42arm_config_option(
43 NAME RMM_ARCH
44 HELP "Target Architecture for RMM build."
45 STRINGS "aarch64" "fake_host")
46
47include("cmake/Toolchains.cmake")
48include("cmake/BuildType.cmake")
49
50#
51# Initialize the project. Note that this is where the toolchain file is loaded,
52# and also where the project directory and version variables are set up.
53#
54
Soby Mathew399e62e2025-05-21 17:19:54 +010055project(RMM VERSION 0.7.0 LANGUAGES C CXX ASM)
Soby Mathewb4c6df42022-11-09 11:13:29 +000056
57#
58# Set global flags.
59#
60
61set(CMAKE_C_STANDARD 11)
62set(CMAKE_C_STANDARD_REQUIRED TRUE)
Soby Mathewe558fa32024-12-31 11:59:11 +000063set(CMAKE_CXX_STANDARD 11)
64set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
Soby Mathewb4c6df42022-11-09 11:13:29 +000065set(CMAKE_C_EXTENSIONS TRUE)
66
67if(RMM_STATIC_ANALYSIS_CPPCHECK)
68 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
69endif()
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +010070
Soby Mathewb4c6df42022-11-09 11:13:29 +000071#
AlexeiFedorov0f300ac2024-03-05 15:55:06 +000072# Set march compiler option
73#
74detect_and_set_march()
75
76#
Soby Mathewb4c6df42022-11-09 11:13:29 +000077# Include the platform makefile
78#
79include("cmake/Platforms.cmake")
80
81#
Javier Almansa Sobrino576071e2022-09-09 16:01:17 +010082# Include Coverage report framework
83#
84include("cmake/CoverageReport.cmake")
85
86#
Javier Almansa Sobrinoc4ad5b02022-07-05 19:05:14 +010087# Include the Unit Test Framework
88#
89include(UnitTestFramework)
90
91#
Soby Mathewb4c6df42022-11-09 11:13:29 +000092# Include the common configuration options
93#
94include("cmake/CommonConfigs.cmake")
95
96#
97# Load in our C standard library and link it to any targets created after this
98# point. This will automatically transition these targets away from the standard
99# library provided by the toolchain, and towards our libc.
100#
101
102add_subdirectory("lib/libc")
103
104link_libraries(rmm-lib-libc)
105
106#
Soby Mathewb4c6df42022-11-09 11:13:29 +0000107# Recurse into the various component subdirectories
108#
109add_subdirectory("lib")
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200110add_subdirectory("app")
Soby Mathewb4c6df42022-11-09 11:13:29 +0000111add_subdirectory("runtime")
112
113if(RMM_DOCS)
114 add_subdirectory("docs")
115endif()
116
117#
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200118# Copy 'rmm-runtime' executable to 'build/$<CONFIG>/rmm_core.elf'.
Soby Mathewa6fd3802023-01-25 14:43:08 +0000119#
120
121set(ARTEFACT_DIR "${CMAKE_BINARY_DIR}/$<CONFIG>")
122add_custom_command(
123 COMMAND ${CMAKE_COMMAND} -E make_directory "${ARTEFACT_DIR}"
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200124 COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>" "${ARTEFACT_DIR}/rmm_core.elf"
125 OUTPUT rmm_core.elf
Soby Mathewa6fd3802023-01-25 14:43:08 +0000126 DEPENDS rmm-runtime)
127
128#
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200129# Create rmm.elf as a copy of rmm_core.elf to keep CI working
130#
131add_custom_command(
132 COMMAND "${CMAKE_COMMAND}" -E copy ${ARTEFACT_DIR}/rmm_core.elf ${ARTEFACT_DIR}/rmm.elf
133 OUTPUT rmm.elf
134 DEPENDS rmm_core.elf)
135
136#
Soby Mathewb4c6df42022-11-09 11:13:29 +0000137# Create the flat binary using whatever tool comes with the toolchain.
138#
139
140if(CMAKE_OBJCOPY)
141 add_custom_command(
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200142 COMMAND "${CMAKE_OBJCOPY}" -O binary "${ARTEFACT_DIR}/rmm_core.elf" "${ARTEFACT_DIR}/rmm_core.img"
143 OUTPUT rmm_core.img
144 DEPENDS rmm_core.elf)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000145endif()
146
147#
148# Create the dump file using whatever tool comes with the toolchain.
149#
150
151if(CMAKE_OBJDUMP)
152 add_custom_command(
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200153 COMMAND "${CMAKE_OBJDUMP}" -dxS "${ARTEFACT_DIR}/rmm_core.elf" > "${ARTEFACT_DIR}/rmm_core.dump"
154 OUTPUT rmm_core.dump
155 DEPENDS rmm_core.elf)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000156endif()
157
158#
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200159# Copy 'rmm-runtime.map' to 'build/$<CONFIG>/rmm_core.map'
Soby Mathewb4c6df42022-11-09 11:13:29 +0000160#
161
162add_custom_command(
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200163 COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>.map" "${ARTEFACT_DIR}/rmm_core.map"
164 OUTPUT rmm_core.map
Soby Mathewb4c6df42022-11-09 11:13:29 +0000165 DEPENDS rmm-runtime)
166
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200167if(NOT RMM_ARCH STREQUAL fake_host)
168 set(RMM_IMG "rmm.img")
169 find_program(BUNDLE_APP_RMM "bundle_app_rmm.py"
170 PATHS ${CMAKE_SOURCE_DIR}
171 PATH_SUFFIXES app
172 DOC "bundle_app_rmm.py")
173
174 set(BUNDLE_COMMAND_OUTPUT "${ARTEFACT_DIR}/bundle_app_out.txt")
175 add_custom_command(
Jacob Man Chun Yiu2e8d19e2025-04-09 13:58:59 +0100176 COMMAND "${BUNDLE_APP_RMM}" --out-bin ${ARTEFACT_DIR}/${RMM_IMG} --rmm-bin ${ARTEFACT_DIR}/rmm_core.img --log-file-name ${BUNDLE_COMMAND_OUTPUT} ${EL0_APP_BIN_LIST}
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200177 OUTPUT ${RMM_IMG}
Soby Mathew4ec65bc2025-04-24 07:54:04 +0100178 DEPENDS rmm_core.img rmm-random-app rmm-attestation-app rmm-dev-assign-app)
Mate Toth-Palbbb816d2024-08-01 10:41:35 +0200179endif()
180
Soby Mathew22a667e2025-05-06 18:36:27 +0100181add_custom_target(rmm ALL DEPENDS rmm_core.img rmm_core.dump rmm_core.elf rmm.elf rmm_core.map ${RMM_IMG} rmm-attestation-app rmm-random-app)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000182
183#
184# Set up additional tooling.
185#
186
187add_subdirectory("tools")