/
CMakeLists.txt
208 lines (182 loc) · 7.46 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#-
# $Copyright$
#
###############################################################################
# Print some generic information on the Project.
###############################################################################
set(PROJECT_ROOT "${CMAKE_SOURCE_DIR}")
message(STATUS "Project Name: ${CMAKE_PROJECT_NAME}")
message(STATUS "Project Root: ${PROJECT_ROOT}")
message(STATUS "Target System Type: ${CMAKE_SYSTEM_NAME}")
message(STATUS "Target System Processor: ${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "Host System: ${CMAKE_HOST_SYSTEM} @ ${CMAKE_HOST_SYSTEM_PROCESSOR}")
###############################################################################
# Set up generic compile flags. If we're on a 'Generic', i.e. embedded system,
# we need the CMAKE_SYSTEM_PROCESSOR variable set via the Toolchain file.
###############################################################################
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Generic")
if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR not defined!")
endif()
endif()
###############################################################################
# STM32 Supported Boards
#
# A board is supported if there is a directory with the board's name which
# contains a file "stm32-board.cmake".
###############################################################################
file(GLOB STM32_SUPPORTED_BOARDS
LIST_DIRECTORIES TRUE
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/boards
"boards/STM32*"
)
if(NOT DEFINED STM32_BOARD)
set(STM32_BOARD "" CACHE STRING "STM32 Board Type. Must be set to one of ${STM32_SUPPORTED_BOARDS}")
endif()
if(NOT("${STM32_BOARD}" STREQUAL ""))
set(BOARD_CMAKE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/boards/${STM32_BOARD}/stm32-board.cmake")
if (NOT EXISTS ${BOARD_CMAKE_FILE})
message(FATAL_ERROR "STM32_BOARD is set to \"${STM32_BOARD}\" but file "
"\'${BOARD_CMAKE_FILE}\' does not exist!")
else()
message(STATUS "STM32 Board: ${STM32_BOARD}")
# Configure Board-specific Options
include(${BOARD_CMAKE_FILE})
add_definitions(-D${STM32_CPU_FAMILY})
add_definitions(-D${STM32_CPU_TYPE})
# Copy the CPU-/Board-specific SVD File to a common place so it can be referenced
# with a generic launch configuration Visual Studio Code.
set(STM32_SVD_FILE_FULLPATH ${CMAKE_CURRENT_SOURCE_DIR}/boards/${STM32_BOARD}/${STM32_SVD_FILE})
if (NOT ("${STM32_SVD_FILE}" STREQUAL "") AND EXISTS ${STM32_SVD_FILE_FULLPATH})
message(STATUS "Using SVD File: ${STM32_SVD_FILE_FULLPATH}")
configure_file(
${STM32_SVD_FILE_FULLPATH}
${CMAKE_CURRENT_BINARY_DIR}/STM32.svd
COPYONLY
)
endif()
endif()
endif()
###############################################################################
# If we're on an embedded system, include a CMake File that sets up the
# architecture specific flags for the Compiler.
###############################################################################
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Generic")
include(${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR}.cflags)
add_compile_options("-fdata-sections")
add_compile_options("-ffunction-sections")
add_link_options("-Wl,--gc-sections")
endif()
add_definitions("-Wall")
add_definitions("-Wextra")
add_definitions("-Werror")
if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
add_definitions("-O3")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
add_definitions("-O2")
add_definitions("-g")
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
add_definitions("-Os")
add_definitions("-g")
else()
add_definitions("-O0")
add_definitions("-g")
endif()
if ((NOT "${CMAKE_BUILD_TYPE}" STREQUAL "")
AND NOT ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug"))
# For some reason, -Os and -O3 optimizes things in a way that cause the
# compiler to throw a bunch of warnings about unused parameters and/or
# variables. Degrade those to a warning here so we can still compile.
add_definitions("-Wno-error=unused-variable")
endif()
add_definitions("-DGPIO_ENV=STM32")
###############################################################################
# Set up the environment for the Phisch.Org libraries
###############################################################################
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Generic")
add_definitions("-DHAVE_STM32")
add_definitions("-DSTM32_CPU_FAMILY=${STM32_CPU_FAMILY}")
add_definitions("-D${STM32_CPU_FAMILY}")
add_definitions("-DUART_ENV=STM32")
else()
add_definitions("-DHOSTBUILD")
add_definitions("-DHAVE_STM32")
add_definitions("-DSTM32_CPU_FAMILY=${STM32_CPU_FAMILY}")
add_definitions("-D${STM32_CPU_FAMILY}")
endif()
###############################################################################
# Include Search Paths for project
###############################################################################
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
###############################################################################
# Actually build the target binary
###############################################################################
set(TARGET_ELF ${TARGET_NAME}.elf)
set(TARGET_BIN ${TARGET_NAME}.bin)
set(TARGET_SRC
${TARGET_SRC}
CompatStdCpp.cpp
FreeRTOSCallback.cpp
Infrastructure.cpp
)
add_executable(${TARGET_ELF}
${TARGET_SRC}
)
target_link_libraries(${TARGET_ELF}
build_version
cmsis
compatc
FreeRTOS
startup
stm32
tasks
uart
)
###############################################################################
# Include Library subdirectories
###############################################################################
add_subdirectory(contrib)
add_subdirectory(lib)
add_subdirectory(stm32)
if(NOT("${STM32_BOARD}" STREQUAL ""))
add_subdirectory(tasks)
endif()
###############################################################################
# Include Build Version Support
###############################################################################
include(STM32_Archives.cmake)
include(STM32_BuildVersion.cmake)
if ("${STM32_FLASH_INTERFACE}" STREQUAL "BlackMagicProbe")
include(STM32_BlackMagicProbe.cmake)
elseif ("${STM32_FLASH_INTERFACE}" STREQUAL "OpenOCD")
include(STM32_OpenOCD.cmake)
else()
include(STM32_OpenOCD.cmake)
endif()
include(STM32_Startup.cmake)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Generic")
target_link_options(${TARGET_ELF} PRIVATE
-T ${CMAKE_CURRENT_SOURCE_DIR}/${STM32_LDSCRIPT}
)
endif()
include(Doxygen.cmake)
###############################################################################
# If we're on an embedded system, include a CMake File that defines how the
# flashable binary image is built
###############################################################################
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Generic")
if ("${STM32_FLASH_INTERFACE}" STREQUAL "BlackMagicProbe")
set(GDBINIT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gdbinit-bmp.tpl)
elseif ("${STM32_FLASH_INTERFACE}" STREQUAL "OpenOCD")
set(GDBINIT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gdbinit-stm32.tpl)
else()
set(GDBINIT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gdbinit-stm32.tpl)
endif()
else()
find_package(Threads REQUIRED)
target_link_libraries(${TARGET_ELF}
${CMAKE_THREAD_LIBS_INIT}
)
set(GDBINIT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/gdbinit-native.tpl)
endif()
configure_file(${GDBINIT_FILE} ${CMAKE_CURRENT_BINARY_DIR}/.gdbinit)