-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
139 lines (114 loc) · 4.2 KB
/
CMakeLists.txt
File metadata and controls
139 lines (114 loc) · 4.2 KB
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
#
# @file CMakeLists.txt
# @brief Main project CMake configuration.
#
# @author Chris Vig (chris@invictus.so)
# @date 2025-08-16
# @cpyrt © 2025 by Chris Vig. Licensed under the GNU General Public License v3 (GPLv3).
#
cmake_minimum_required(VERSION 3.22)
# -- Packages --
find_package(Doxygen REQUIRED)
find_package(Git REQUIRED)
# -- Project Configuration --
include(configuration.cmake)
# -- Toolchain Configuration --
# Tool names
set(AVR_GCC avr-gcc)
set(AVR_OBJCOPY avr-objcopy)
set(AVR_OBJDUMP avr-objdump)
set(AVR_STRIP avr-strip)
# Configure CMake system
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_ASM_COMPILER ${AVR_GCC})
set(CMAKE_C_COMPILER ${AVR_GCC})
# -- Device Setup --
set(DEVICE_MCU atmega1284p
CACHE STRING "The MCU model to compile for.")
set(DEVICE_F_CPU 16000000
CACHE STRING "The device's CPU frequency, in Hz.")
# -- Project Setup --
# Top-level project definition
project(SuperKey LANGUAGES C CXX ASM)
# Set up project directories
set(PROJECT_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(PROJECT_LIBRARY_DIR ${PROJECT_BASE_DIR}/lib)
set(PROJECT_EXECUTABLE_DIR ${PROJECT_BASE_DIR}/src)
set(PROJECT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(PROJECT_AUTOGEN_DIR ${PROJECT_BUILD_DIR}/autogen)
set(PROJECT_BIN_DIR ${PROJECT_BUILD_DIR})
# Configure output directory
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BIN_DIR})
# Delete CMake default flags that we don't want to use
set(CMAKE_ASM_FLAGS_DEBUG "" CACHE STRING "" FORCE)
set(CMAKE_ASM_FLAGS_RELEASE "" CACHE STRING "" FORCE)
set(CMAKE_ASM_FLAGS_RELWITHDEBINFO "" CACHE STRING "" FORCE)
set(CMAKE_ASM_FLAGS_MINSIZEREL "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELWITHDEBINFO "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_MINSIZEREL "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_MINSIZEREL "" CACHE STRING "" FORCE)
# Set preprocessor defines
add_compile_definitions(
# Flags for features
_FEATURE_ON=1
_FEATURE_OFF=0
# Device information
MCU="${DEVICE_MCU}"
F_CPU=${DEVICE_F_CPU}
# Build type
_BUILD_TYPE="${CMAKE_BUILD_TYPE}"
$<$<CONFIG:Debug>:_DEBUG=_FEATURE_ON>
$<$<CONFIG:Release>:NDEBUG>
$<$<CONFIG:Release>:_DEBUG=_FEATURE_OFF>
$<$<CONFIG:RelWithDebInfo>:NDEBUG>
$<$<CONFIG:RelWithDebuInfo>:_DEBUG=_FEATURE_OFF>
$<$<CONFIG:MinSizeRel>:NDEBUG>
$<$<CONFIG:MinSizeRel>:_DEBUG=_FEATURE_OFF>
)
# Set compiler options
add_compile_options(
# Device MCU type
-mmcu=${DEVICE_MCU}
# Warning options
-Wall -Wextra -Wpedantic -Werror
# -Os is used for all builds
-Os
# Build-specific flags
$<$<CONFIG:Debug>:-g>
$<$<CONFIG:RelWithDebugInfo>:-g>
)
# Set linker options
add_link_options(
# Device MCU type
-mmcu=${DEVICE_MCU}
)
# -- Documentation Setup --
# CMake will automatically generate the Doxyfile in the build directory based on the Doxyfile.in template
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
# Set Doxygen options
set(DOXYGEN_EXTRACT_ALL NO)
set(DOXYGEN_WARN_IF_UNDOCUMENTED YES)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(DOXYGEN_EXTRACT_ALL YES)
set(DOXYGEN_WARN_IF_UNDOCUMENTED NO)
endif()
# Configure the Doxyfile
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
# Add custom target for Doxygen
# (Running `make doxygen` will build the documents in the build directory)
add_custom_target(
doxygen
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating documentation with Doxygen"
VERBATIM
)
# -- Subdirectories --
# Main executable
add_subdirectory(${PROJECT_EXECUTABLE_DIR}/main)