-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
122 lines (96 loc) · 4.36 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
cmake_minimum_required(VERSION 3.27.9)
#project variables
set(PROJECT_NAME threadx-cpp-test-app)
set(VERSION_MAJOR 0) #when you make incompatible API or HW changes
set(VERSION_MINOR 1) #when you add functionality in a backwards compatible manner
set(VERSION_PATCH 0) #post-release version. when you make backwards compatible bug fixes. must be 0 for release and release candidate versions
set(MCU_FAMILY STM32L4xx) #MCU HAL driver folder
set(MCU_LINE STM32L496xx) #MCU line define macro
set(MCU_TYPE STM32L496ZGTX) #Linker/startup filenames
set(THREADX_VER v6.4.1_rel)
find_package(Git REQUIRED)
Include(FetchContent)
set(GITHUB_SUBDIR ../)
FetchContent_Declare(toolchain-gnu
GIT_REPOSITORY ${GITHUB_SUBDIR}/toolchain-gnu.git
GIT_TAG origin/main
SYSTEM)
FetchContent_MakeAvailable(toolchain-gnu)
FetchContent_GetProperties(toolchain-gnu SOURCE_DIR TOOLCHAIN_DIR)
FetchContent_Declare(segger-rtt
GIT_REPOSITORY ${GITHUB_SUBDIR}/segger-rtt.git
GIT_TAG origin/main
SYSTEM)
#set toolchain and project
set(CMAKE_TOOLCHAIN_FILE ${TOOLCHAIN_DIR}/cortex-m4f.cmake)
project(${PROJECT_NAME}
LANGUAGES C CXX ASM
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
FetchContent_MakeAvailable(segger-rtt)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release) #default build type is release
endif()
add_compile_definitions(${MCU_LINE}
SYSTEM_CLOCK=16000000
)
#link libs and dirs
set(LINK_DIRS ${PROJECT_SOURCE_DIR}/app/Middlewares/ST/ARM/DSP/Lib)
configure_file(${PROJECT_SOURCE_DIR}/app/tx_user.h.in ${FETCHCONTENT_BASE_DIR}/tx_user.h)
configure_file(${PROJECT_SOURCE_DIR}/app/fx_user.h.in ${FETCHCONTENT_BASE_DIR}/fx_user.h)
configure_file(${PROJECT_SOURCE_DIR}/app/lx_user.h.in ${FETCHCONTENT_BASE_DIR}/lx_user.h)
set(LIBS
stm32_hal_drivers
arm_cortexM4lf_math
threadx-cpp
utility
segger-rtt
)
#include directories
set(SYS_INC_DIRS
${PROJECT_SOURCE_DIR}/app/Middlewares/ST/ARM/DSP/Inc
)
set(INC_DIRS
${PROJECT_SOURCE_DIR}/app
)
#find all source files
configure_file(${PROJECT_SOURCE_DIR}/app/${CORE_SUBFOLDER}/Core/Src/main.c main.cpp)
file(GLOB USER_SRCS CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/app/*.cpp)
file(GLOB CORE_SRCS CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/app/Core/Src/*.* ${PROJECT_BINARY_DIR}/*.cpp ${CMAKE_SOURCE_DIR}/app/${CORE_SUBFOLDER}/Core/ThreadSafe/*.c)
list(REMOVE_ITEM CORE_SRCS ${CMAKE_SOURCE_DIR}/app/Core/Src/main.c)
set_source_files_properties(${CORE_SRCS} PROPERTIES COMPILE_FLAGS -w) #disable warnings for system sources
#object library
add_library(SRC_OBJS OBJECT ${USER_SRCS} ${CORE_SRCS})
target_include_directories(SRC_OBJS SYSTEM PUBLIC ${SYS_INC_DIRS})
target_include_directories(SRC_OBJS PUBLIC ${INC_DIRS} ${PROJECT_BINARY_DIR})
target_link_libraries(SRC_OBJS PRIVATE ${LIBS}) #add dependencies so it sees libs' public properties
set(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/app/${MCU_TYPE}_FLASH) #linker file
#startup source
string(TOLOWER ${MCU_TYPE} MCU_TYPE)
set(STARTUP_SOURCE ${PROJECT_SOURCE_DIR}/app/Core/Startup/startup_${MCU_TYPE})
#add libs
add_subdirectory(${PROJECT_SOURCE_DIR}/app/Drivers)
add_subdirectory(${PROJECT_SOURCE_DIR}/lib)
#read version number
if(CMAKE_BUILD_TYPE STREQUAL Release AND DEFINED ENV{CI_PIPELINE_ID})
set(VERSION_SUFFIX -${PROJECT_VERSION})
endif()
configure_file(${PROJECT_SOURCE_DIR}/app/version.hpp.in version.hpp)
set(EXEC_NAME ${PROJECT_NAME}${VERSION_SUFFIX})
#add project binaries
set(EXECUTABLE ${EXEC_NAME}.elf)
add_executable(${EXECUTABLE} ${STARTUP_SOURCE}.s)
#link libraries
target_link_directories(${EXECUTABLE} PRIVATE ${LINK_DIRS})
target_link_libraries(${EXECUTABLE} PRIVATE ${LIBS} SRC_OBJS)
#target specific link options
target_link_options(${EXECUTABLE} PRIVATE
${LINKER_OPTS}
LINKER:-Map=${CMAKE_BINARY_DIR}/${EXEC_NAME}.map
-T${LINKER_SCRIPT}${EXEC_SUFFIX}.ld)
#print executable size and create hex and bin files
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_SIZE_UTIL} ${EXECUTABLE}
COMMAND ${CMAKE_OBJCOPY} -O ihex ${EXECUTABLE} ${EXEC_NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary ${EXECUTABLE} ${EXEC_NAME}.bin
VERBATIM)