blob: 9d066bd767e226c8f91964642da5095aef6dce83 [file] [log] [blame]
Anton Komlevc88e2ac2024-09-12 16:46:39 +01001#-------------------------------------------------------------------------------
2# SPDX-License-Identifier: BSD-3-Clause
3# SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
4#-------------------------------------------------------------------------------
5
6set(CMAKE_SYSTEM_NAME Generic)
7
8# Specify the cross compiler
9set(CMAKE_C_COMPILER clang)
10set(CMAKE_ASM_COMPILER clang)
11set(CMAKE_C_COMPILER_FORCED TRUE)
12set(CMAKE_ASM_COMPILER_FORCED TRUE)
13
14if(NOT DEFINED CROSS_COMPILE)
15 set(CROSS_COMPILE arm-none-eabi CACHE STRING "Cross-compiler prefix")
16endif()
17set(CMAKE_C_COMPILER_TARGET ${CROSS_COMPILE})
18set(CMAKE_ASM_COMPILER_TARGET ${CROSS_COMPILE})
19
20set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_LIST_DIR}/set_extensions.cmake)
21
22# CMAKE_C_COMPILER_VERSION is not guaranteed to be defined.
23EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE LLVM_VERSION )
24if (LLVM_VERSION VERSION_LESS 18.1.3)
25 message(FATAL_ERROR "Please use newer LLVM compiler version starting from 18.1.3")
26endif()
27
28# ===================== Set toolchain CPU and Arch =============================
29# -mcpu gives better optimisation than -march so -mcpu shall be in preference
30
31if (TFM_SYSTEM_PROCESSOR)
32 if(TFM_SYSTEM_DSP)
33 string(APPEND TFM_SYSTEM_PROCESSOR "+dsp")
34 else()
35 string(APPEND TFM_SYSTEM_PROCESSOR "+nodsp")
36 endif()
37 if(CONFIG_TFM_ENABLE_FP)
38 string(APPEND TFM_SYSTEM_PROCESSOR "+fp")
39 else()
40 string(APPEND TFM_SYSTEM_PROCESSOR "+nofp")
41 endif()
42
43 set(CMAKE_C_FLAGS "-mcpu=${TFM_SYSTEM_PROCESSOR}")
44 set(CMAKE_ASM_FLAGS "-mcpu=${TFM_SYSTEM_PROCESSOR}")
45else()
46 if(CONFIG_TFM_ENABLE_FP)
47 string(APPEND TFM_SYSTEM_ARCHITECTURE "+fp")
48 endif()
49 if(TFM_SYSTEM_DSP)
50 string(APPEND TFM_SYSTEM_ARCHITECTURE "+dsp")
51 endif()
52 set(CMAKE_C_FLAGS "-march=${TFM_SYSTEM_ARCHITECTURE}")
53 set(CMAKE_ASM_FLAGS "-march=${TFM_SYSTEM_ARCHITECTURE}")
54 set(CMAKE_ASM_CPU_FLAG ${TFM_SYSTEM_ARCHITECTURE})
55endif()
56
57if (CONFIG_TFM_FLOAT_ABI STREQUAL "hard")
58 set(COMPILER_CP_FLAG -mfloat-abi=hard)
59 set(LINKER_CP_OPTION -mfloat-abi=hard)
60 if (CONFIG_TFM_ENABLE_FP OR CONFIG_TFM_ENABLE_MVE_FP)
61 set(COMPILER_CP_FLAG -mfloat-abi=hard -mfpu=${CONFIG_TFM_FP_ARCH})
62 set(LINKER_CP_OPTION -mfloat-abi=hard -mfpu=${CONFIG_TFM_FP_ARCH})
63 endif()
64else()
65 set(COMPILER_CP_FLAG -mfloat-abi=soft)
66 set(LINKER_CP_OPTION -mfloat-abi=soft)
67endif()
68
69set(BL1_COMPILER_CP_FLAG -mfloat-abi=soft)
70set(BL1_LINKER_CP_OPTION -mfloat-abi=soft)
71
72set(BL2_COMPILER_CP_FLAG -mfloat-abi=soft)
73set(BL2_LINKER_CP_OPTION -mfloat-abi=soft)
74
75add_compile_options(
76 -Wno-ignored-optimization-argument
77 -Wno-unused-command-line-argument
78 -Wall
79 -Wno-error=cpp
80 -c
81 -fdata-sections
82 -ffunction-sections
83 -fno-builtin
84 -fshort-enums
85 -fshort-wchar
86 -funsigned-char
87 -std=c99
88)
89
90# Pointer Authentication Code and Branch Target Identification (PACBTI) Options
91# Not currently supported for LLVM.
92if(NOT ${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_DISABLED)
93 message(FATAL_ERROR "BRANCH_PROTECTION NOT supported for LLVM")
94endif()
95
96add_link_options(
97 LINKER:-check-sections
98 LINKER:-fatal-warnings
99 LINKER:--gc-sections
100 LINKER:--print-memory-usage
101 LINKER:-lcrt0 -ldummyhost
102 LINKER:--Map=bin/tfm_ns.map
103)
104
105#add_compile_definitions($<$<STREQUAL:${TFM_SYSTEM_ARCHITECTURE},armv8.1-m.main>:__ARM_ARCH_8_1M_MAIN__=1>)
106
107# Specify the scatter file used to link `target`.
108# Behaviour for handling scatter files is so wildly divergent between compilers
109# that this macro is required.
110#
111# Vendor platform can set a scatter file as property INTERFACE_LINK_DEPENDS of platform_ns.
112# `target` can fetch the scatter file from platform_ns.
113#
114# Alternatively, NS build can call target_add_scatter_file() with the install directory of
115# scatter files.
116# target_add_scatter_file(target, install_dir)
117#
118# target_add_scatter_file() fetch a scatter file from the install directory.
119macro(target_add_scatter_file target)
120
121 # Try if scatter_file is passed from platform_ns
122 get_target_property(scatter_file
123 platform_ns
124 INTERFACE_LINK_DEPENDS
125 )
126
127 # If scatter_file is not passed from platform_ns
128 # Try if any scatter file is exported in install directory
129 # The intall directory is passed as an optinal argument
130 if(${scatter_file} STREQUAL "scatter_file-NOTFOUND")
131 set(install_dir ${ARGN})
132 list(LENGTH install_dir nr_install_dir)
133
134 # If nr_install_dir == 1, search for sct file under install dir
135 if(${nr_install_dir} EQUAL 1)
136 file(GLOB scatter_file "${install_dir}/*.ldc")
137 endif()
138 endif()
139
140 if(NOT EXISTS ${scatter_file})
141 message(FATAL_ERROR "Unable to find NS scatter file ${scatter_file}")
142 endif()
143
144 add_library(${target}_scatter OBJECT)
145 target_sources(${target}_scatter
146 PRIVATE
147 ${scatter_file}
148 )
149
150 # Cmake cannot use generator expressions in the
151 # set_source_file_properties command, so instead we just parse the regex
152 # for the filename and set the property on all files, regardless of if
153 # the generator expression would evaluate to true or not.
154 string(REGEX REPLACE ".*>:(.*)>$" "\\1" SCATTER_FILE_PATH "${scatter_file}")
155 set_source_files_properties(${SCATTER_FILE_PATH}
156 PROPERTIES
157 LANGUAGE C
158 KEEP_EXTENSION True # Avoid *.o extension for the preprocessed file
159 )
160
161 target_link_libraries(${target}_scatter PRIVATE platform_region_defs)
162
163 target_compile_options(${target}_scatter PRIVATE -E -xc)
164
165 target_link_options(${target} PRIVATE -T $<TARGET_OBJECTS:${target}_scatter>)
166
167 add_dependencies(${target} ${target}_scatter)
168 set_target_properties(${target} PROPERTIES LINK_DEPENDS $<TARGET_OBJECTS:${target}_scatter>)
169
170endmacro()
171
172# Macro for converting the output *.axf file to finary files: bin, elf, hex
173macro(add_convert_to_bin_target target)
174 get_target_property(bin_dir ${target} RUNTIME_OUTPUT_DIRECTORY)
175
176 add_custom_target(${target}_bin
177 SOURCES ${bin_dir}/${target}.bin
178 )
179 add_custom_command(OUTPUT ${bin_dir}/${target}.bin
180 DEPENDS ${target}
181 COMMAND ${CMAKE_OBJCOPY}
182 -O binary $<TARGET_FILE:${target}>
183 ${bin_dir}/${target}.bin
184 )
185
186 add_custom_target(${target}_elf
187 SOURCES ${bin_dir}/${target}.elf
188 )
189 add_custom_command(OUTPUT ${bin_dir}/${target}.elf
190 DEPENDS ${target}
191 COMMAND ${CMAKE_OBJCOPY}
192 -O elf32-littlearm $<TARGET_FILE:${target}>
193 ${bin_dir}/${target}.elf
194 )
195
196 add_custom_target(${target}_hex
197 SOURCES ${bin_dir}/${target}.hex
198 )
199 add_custom_command(OUTPUT ${bin_dir}/${target}.hex
200 DEPENDS ${target}
201 COMMAND ${CMAKE_OBJCOPY}
202 -O ihex $<TARGET_FILE:${target}>
203 ${bin_dir}/${target}.hex
204 )
205
206 add_custom_target(${target}_binaries
207 ALL
208 DEPENDS ${target}_bin
209 DEPENDS ${target}_elf
210 DEPENDS ${target}_hex
211 )
212endmacro()