Система збірки CMake
Цей репозиторій надає інфраструктуру CMake, необхідну для збірки проєктів на базі STM32 та інших модулів в архітектурі STM Template.
Він розроблений для використання як Git submodule і відокремлює складну логіку збірки від вихідного коду проєкту, забезпечуючи узгодженість, версіонування та повторне використання в різних репозиторіях.
🧩 Огляд
Систему збірки поділено на два рівні:
-
Рівень проєкту
Файл CMakeLists.txt у кореневій теці проєкту є частиною проєкту для збірки CMake і надає мінімальну точку входу для CMake. Його єдина мета — викликати централізовану логіку збірки:include(${CMAKE_CURRENT_LIST_DIR}/CMake/Build.cmake) -
Рівень платформи
Цей скрипт містить усі основні визначення збірки, функції та кроки конфігурації.
Він відповідає за:- Перевірку опцій збірки
- Ініціалізацію проєкту та налаштування цілей
- Виявлення та налаштування toolchain
- Обробку типів збірки (Debug / Release / Test)
- Поширення шляхів include
- Реєстрацію залежностей і модулів
Такий поділ гарантує, що кореневий проєкт залишається чистим і простим у підтримці, а детальна логіка є версіонованою та придатною для спільного використання як окремий submodule.
⚙️ Файли-заглушки з вихідним кодом
CMake вимагає принаймні одного коректного файлу з вихідним кодом для генерації системи збірки.
З цієї причини Platform.c і Platform.h включено як порожні заглушки та сховище версії.
Вони слугують лише заглушками на початковому етапі конфігурації і не компілюються у фінальний firmware.
🧩 Інтеграція як submodule
Цей репозиторій призначений для додавання як Git submodule:
git submodule add git@ssh.dev.azure.com:v3/Dlzen/STM_Template/CMake CMake
У батьківському проєкті головний CMakeLists.txt має містити:
include("${CMAKE_SOURCE_DIR}/STM_Template/CMake/Build.cmake")
Після ініціалізації батьківський проєкт може розширювати або перевизначати окремі кроки збірки за допомогою власних скриптів чи опцій CMake.
📜 Версіонування
Оскільки логіка збірки розвивається незалежно від коду застосунку, кожна версія цього репозиторію позначається тегом, і на неї можуть явно посилатися батьківські репозиторії.
Це забезпечує стабільні збірки для кількох поколінь firmware та гілок.
🧩 Майбутні розширення
Заплановані доповнення:
- Реалізація інтеграційних тестів
- Реалізація пресетів CMake
📁 Структура тек
CMake/
├── Build.cmake # Core build logic called from the root CMakeLists.txt
├── Platform.c # Placeholder source file required by CMake during project initialization
├── Platform.h # Placeholder header file (currently empty)
├── ArtifactsManager # Artifactory management functionality
| ├── Artifacts.cmake # Artifacts manager CMake script
| └── README.md # Artifacts manager module description and usage informations
├── HelperTools # Project initialization and support functionality
| ├── Scripts # Location of CMake scripts
| ├── Templates # Location of templates used by CMake scripts
| ├── Setup.bat # Windows script to easier calling CMake scripts
| └── README.md # Helper tools module description and usage informations
└── README.md # CMake module description and usage informations
🧱 Приклад використання
Нижче наведено мінімальний приклад використання цієї системи збірки CMake в батьківському проєкті.
ProjectRootDir/CMakeLists.txt
################################################################################
# Author: Mr.Nobody
# file: CMakeLists.txt
# brief: Project part CMake functionality.
#
# User shall not change platform functionality, for project necessary
# functionality can user implement in this file.
#
# usage: Edit "VARIABLES"-section to suit project requirements.
# For debug build:
# cmake -S . -B Build_Debug -GNinja -DCMAKE_BUILD_TYPE=Debug -DTARGET_MCU=STM32WXXXyZ -DDOXYGEN_ENABLED=OFF
# cmake --build Build_Debug
# For release build:
# cmake -S . -B Build_Release -GNinja -DCMAKE_BUILD_TYPE=Release -DTARGET_MCU=STM32WXXXyZ -DDOXYGEN_ENABLED=OFF
# cmake --build Build_Release
################################################################################
#
# Necessary operators:
#
# CMAKE_BUILD_TYPE
# - Debug
# - Release
# - UnitTest
# - IntegrationTest
#
# TARGET_MCU
# - STM32WXXXyZ
# Where:
# W - STM32 Family ID (single letter)
# XXX - STM32 Family specification (three symbols)
# y - Must stay unchanged
# Z - Flash size identification ( A - 0K,6 - 32K, 8 - 64K, B - 128K ...)
# Example: STM32G474xE
#
# Optional operators. If not specified default value will be used
#
# DOXYGEN_ENABLED
# - OFF (default)
# - ON
#
################################################################################
cmake_minimum_required(VERSION 3.25)
#=============================== Constant values ==============================#
set(BUILD_TYPE_ALLOWED_VALUES "Debug"
"Release"
"UnitTest"
"IntegrationTest")
# Doxygen is not available by default. If artifact is loaded, this macro will be set to ON
add_definitions(-DDOXYGEN_STATE=OFF)
#======================== Project configuration values ========================#
# Set project configuration values such as project name, type, CPU, FPU, runtime library, and compile commands export
set(PROJECT_NAME "Project_Template_${CMAKE_BUILD_TYPE}")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
#=========================== DO NOT CHANGE THIS PART ==========================#
#============================ Artifacts preparation ===========================#
# Check, if artifact manager is used in project.
if(EXISTS ${CMAKE_SOURCE_DIR}/EmB_Platform/CMake/ArtifactsManager/Artifacts.cmake)
# Run artifacts configuration before build.
include(${CMAKE_SOURCE_DIR}/EmB_Platform/CMake/ArtifactsManager/Artifacts.cmake)
endif()
#========================== Build flags configuration =========================#
## Default build configuration
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPTIMIZATION_NONE} ${DEBUG_LEVEL_3}")
endif()
if(CMAKE_BUILD_TYPE MATCHES Release)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPTIMIZATION_NONE} ${DEBUG_LEVEL_0}")
endif()
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} ${ASSEMBLER_MODE}")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${GENERATE_DEPENDENCY_FILE}")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${GENERATE_DEPENDENCY_FILE}")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${DISABLE_RTTI}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DISABLE_EXCEPTIONS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DISABLE_THREADSAFE_STATICS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINKER_NANO}")
#================================ MCU build ===================================#
# Core project settings
project(${PROJECT_NAME}
VERSION 0.1.0
HOMEPAGE_URL "https://embedbits.com"
LANGUAGES C CXX ASM)
# Include main CMake script
include("${CMAKE_SOURCE_DIR}/EmB_Platform/CMake/Build.cmake")
#========================= User specific commands =============================#
target_compile_definitions(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
# Link directories setup
target_link_directories(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
# Add project symbols (macros)
target_compile_definitions(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
INTERFACE
PRIVATE
PUBLIC
)
#==================== User specific pre-processing commands ===================#
#add_custom_command(
# TARGET ${CMAKE_PROJECT_NAME}
# PRE_BUILD
# COMMAND
#)
#=================== User specific post-processing commands ===================#
add_custom_command(
TARGET ${CMAKE_PROJECT_NAME}
POST_BUILD
COMMENT "Total Size:"
COMMAND ${CMAKE_SIZE} ARGS $<TARGET_FILE:${CMAKE_PROJECT_NAME}>
)
add_custom_command(
TARGET ${CMAKE_PROJECT_NAME}
POST_BUILD
COMMENT "Generating .bin file."
COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_PROJECT_NAME}.bin
)
add_custom_command(
TARGET ${CMAKE_PROJECT_NAME}
POST_BUILD
COMMENT "Generating .hex file."
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_PROJECT_NAME}.hex
)
🛠️ Вимоги
- CMake ≥ 3.25
📜 Ліцензія
Цей проєкт ліцензовано за ліцензією Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).