-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
122 lines (101 loc) · 5.01 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
# ############################################################################################################
# cpp_stm32 library
# ############################################################################################################
cmake_minimum_required(VERSION 3.15.2 FATAL_ERROR)
set(CMAKE_TOOLCHAIN_FILE "ARMToolchain.cmake")
# ############################################################################################################
# command line options (not skippable)
# ############################################################################################################
set(TARGET_BOARD
""
CACHE STRING "Target MCU")
set(CLOCK_FILE
""
CACHE STRING "System Clock information")
project(
cpp_stm32
DESCRIPTION "Pure c++17 implementation of stm32 driver"
HOMEPAGE_URL "https://github.com/osjacky430/cpp_stm32"
LANGUAGES CXX)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(project_settings)
include(compiler_warning)
include(static_analyzer)
include(board_settings)
include(sanitizer)
include(doxygen)
import_board_setting(${TARGET_BOARD})
# ############################################################################################################
# some tunable options
# ############################################################################################################
option(ENABLE_RUNTIME_FREQ_CONFIG
"Set to ON if the project doesn't change the clock frequency after initialization" OFF)
option(ENABLE_HARD_FLOAT "Use VFP extension" ON)
# ############################################################################################################
# Generate project configuration variables
# ############################################################################################################
gen_project_config_file(CLOCK_FILE ${CLOCK_FILE} BOARD ${TARGET_BOARD})
# In practice, it is usally easier and more robust to use the variables to set language requirements
# project-wide rather than use per target properties.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# ############################################################################################################
# library compile options
# ############################################################################################################
set(NEWLIB_FLAGS --specs=nano.specs --specs=nosys.specs)
# ############################################################################################################
# add library, target properties
# ############################################################################################################
add_library(project_warnings INTERFACE)
set_project_warnings(project_warnings)
add_library(project_options INTERFACE)
enable_sanitizers(project_options)
add_library(cpp_stm32 STATIC)
target_sources(cpp_stm32 PRIVATE ${TARGET_PROCESSOR}/source/vector_table.cxx)
target_include_directories(cpp_stm32 PUBLIC ${TARGET_DIR} ${CMAKE_SOURCE_DIR}/include/
${CMAKE_CURRENT_BINARY_DIR})
target_link_directories(cpp_stm32 INTERFACE ${PROCESSOR_DIR})
target_link_libraries(cpp_stm32 PRIVATE project_warnings project_options)
target_compile_options(
cpp_stm32
PUBLIC ${BOARD_FLAGS} ${NEWLIB_FLAGS} $<IF:$<BOOL:${ENABLE_HARD_FLOAT}>,${HARD_FLOAT},${SOFT_FLOAT}>
$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti>)
target_link_options(
cpp_stm32
INTERFACE
${BOARD_FLAGS}
${NEWLIB_FLAGS}
$<IF:$<BOOL:${ENABLE_HARD_FLOAT}>,${HARD_FLOAT},${SOFT_FLOAT}>
-nostartfiles
"SHELL: ${LINKER_SCRIPT}"
"SHELL: -Xlinker --gc-sections"
"SHELL: -Xlinker --print-memory-usage")
# ############################################################################################################
# build example
# ############################################################################################################
option(ENABLE_TESTING "Build unit test" OFF)
if(ENABLE_TESTING)
if(TEST_DIR)
include(unit_test)
add_unit_test_lib(project_options)
add_subdirectory(${CMAKE_SOURCE_DIR}/test/)
else()
message(SEND_ERROR "No test for current chip ${TARGET_BOARD}")
endif()
endif()
# ############################################################################################################
# link library to application
# ############################################################################################################
add_subdirectory(src)
# ############################################################################################################
# build documentation
# ############################################################################################################
enable_doxygen()
# ############################################################################################################
# build example
# ############################################################################################################
option(BUILD_EXAMPLE "Build example" OFF)
if(BUILD_EXAMPLE)
add_subdirectory(${CMAKE_SOURCE_DIR}/example/)
endif()