blob: fc6fe4cae391e9e3fbb09a7794157a475c00e923 [file] [log] [blame]
Satish Kumar427923c2021-10-05 07:21:53 +01001#-------------------------------------------------------------------------------
2# Copyright (c) 2020, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
8set(CMAKE_SYSTEM_NAME Generic)
9
10find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}-gcc)
11set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
12
13#set(CMAKE_C_COMPILER ${CROSS_COMPILE}-gcc)
14#set(CMAKE_ASM_COMPILER ${CROSS_COMPILE}-gcc)
15set(CMAKE_AR ${CROSS_COMPILE}-gcc-ar)
16set(CMAKE_RANLIB ${CROSS_COMPILE}-gcc-ranlib)
17
18set(LINKER_VENEER_OUTPUT_FLAG -Wl,--cmse-implib,--out-implib=)
19set(COMPILER_CMSE_FLAG -mcmse)
20
21# This variable name is a bit of a misnomer. The file it is set to is included
22# at a particular step in the compiler initialisation. It is used here to
23# configure the extensions for object files. Despite the name, it also works
24# with the Ninja generator.
25set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_LIST_DIR}/set_extensions.cmake)
26
27macro(arm_toolchain_reset_compiler_flags)
28 set_property(DIRECTORY PROPERTY COMPILE_OPTIONS "")
29
30 add_compile_options(
31 --specs=nano.specs
32 -Wall
33 -Wno-format
34 -Wno-return-type
35 -Wno-unused-but-set-variable
36 -c
37 -fdata-sections
38 -ffunction-sections
39 -fno-builtin
40 -fshort-enums
41 -funsigned-char
42 -mthumb
43 -nostdlib
44 -std=c99
45 $<$<NOT:$<BOOL:${ARM_SYSTEM_FP}>>:-msoft-float>
46 )
47endmacro()
48
49macro(arm_toolchain_reset_linker_flags)
50 set_property(DIRECTORY PROPERTY LINK_OPTIONS "")
51
52 add_link_options(
53 --entry=Reset_Handler
54 --specs=nano.specs
55 LINKER:-check-sections
56 LINKER:-fatal-warnings
57 LINKER:--gc-sections
58 LINKER:--no-wchar-size-warning
59 LINKER:--print-memory-usage
60 LINKER:-Map=$<TARGET_FILE_BASE_NAME:$<TARGET_PROPERTY:NAME>>.map
61 LINKER:--cref
62 )
63endmacro()
64
65macro(arm_toolchain_set_processor_arch)
66 set(CMAKE_SYSTEM_PROCESSOR ${ARM_SYSTEM_PROCESSOR})
67 set(CMAKE_SYSTEM_ARCHITECTURE ${ARM_SYSTEM_ARCHITECTURE})
68
69 if (DEFINED ARM_SYSTEM_DSP)
70 if(NOT ARM_SYSTEM_DSP)
71 string(APPEND CMAKE_SYSTEM_PROCESSOR "+nodsp")
72 endif()
73 endif()
74endmacro()
75
76macro(arm_toolchain_reload_compiler)
77 arm_toolchain_set_processor_arch()
78 arm_toolchain_reset_compiler_flags()
79 arm_toolchain_reset_linker_flags()
80
81 unset(CMAKE_C_FLAGS_INIT)
82 unset(CMAKE_ASM_FLAGS_INIT)
83
84 set(CMAKE_C_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
85 set(CMAKE_ASM_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
86 set(CMAKE_C_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
87 set(CMAKE_ASM_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
88
89 set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_INIT})
90 set(CMAKE_ASM_FLAGS ${CMAKE_ASM_FLAGS_INIT})
91endmacro()
92
93# Configure environment for the compiler setup run by cmake at the first
94# `project` call in <tfm_root>/CMakeLists.txt. After this mandatory setup is
95# done, all further compiler setup is done via arm_toolchain_reload_compiler()
96arm_toolchain_reload_compiler()
97
98macro(target_add_scatter_file target)
99 target_link_options(${target}
100 PRIVATE
101 -T $<TARGET_OBJECTS:${target}_scatter>
102 )
103
104 add_dependencies(${target}
105 ${target}_scatter
106 )
107
108 add_library(${target}_scatter OBJECT)
109 foreach(scatter_file ${ARGN})
110 target_sources(${target}_scatter
111 PRIVATE
112 ${scatter_file}
113 )
114 # Cmake cannot use generator expressions in the
115 # set_source_file_properties command, so instead we just parse the regex
116 # for the filename and set the property on all files, regardless of if
117 # the generator expression would evaluate to true or not.
118 string(REGEX REPLACE ".*>:(.*)>$" "\\1" SCATTER_FILE_PATH "${scatter_file}")
119 set_source_files_properties(${SCATTER_FILE_PATH}
120 PROPERTIES
121 LANGUAGE C
122 )
123 endforeach()
124
125 target_link_libraries(${target}_scatter
126 platform_region_defs
127 )
128
129 target_compile_options(${target}_scatter
130 PRIVATE
131 -E
132 -P
133 -xc
134 )
135endmacro()
136
137macro(add_convert_to_bin_target target)
138 get_target_property(bin_dir ${target} RUNTIME_OUTPUT_DIRECTORY)
139
140 add_custom_target(${target}_bin
141 SOURCES ${bin_dir}/${target}.bin
142 )
143 add_custom_command(OUTPUT ${bin_dir}/${target}.bin
144 DEPENDS ${target}
145 COMMAND ${CMAKE_OBJCOPY}
146 -O binary $<TARGET_FILE:${target}>
147 ${bin_dir}/${target}.bin
148 )
149
150 add_custom_target(${target}_elf
151 SOURCES ${bin_dir}/${target}.elf
152 )
153 add_custom_command(OUTPUT ${bin_dir}/${target}.elf
154 DEPENDS ${target}
155 COMMAND ${CMAKE_OBJCOPY}
156 -O elf32-littlearm $<TARGET_FILE:${target}>
157 ${bin_dir}/${target}.elf
158 )
159
160 add_custom_target(${target}_hex
161 SOURCES ${bin_dir}/${target}.hex
162 )
163 add_custom_command(OUTPUT ${bin_dir}/${target}.hex
164 DEPENDS ${target}
165 COMMAND ${CMAKE_OBJCOPY}
166 -O ihex $<TARGET_FILE:${target}>
167 ${bin_dir}/${target}.hex
168 )
169
170 add_custom_target(${target}_binaries
171 ALL
172 DEPENDS ${target}_bin
173 DEPENDS ${target}_elf
174 DEPENDS ${target}_hex
175 )
176endmacro()