Build systém CMake
Tento repozitár poskytuje infraštruktúru CMake potrebnú na zostavenie projektov založených na STM32 a ďalších modulov v rámci architektúry STM Template.
Je navrhnutý na použitie ako Git submodul a oddeľuje komplexnú build logiku od zdrojových kódov projektu, čím zaisťuje konzistentnosť, verzovanie a opätovnú použiteľnosť naprieč repozitármi.
🧩 Prehľad
Build systém je rozdelený do dvoch vrstiev:
-
Vrstva projektu
CMakeLists.txt v koreňovom priečinku projektu predstavuje projektovú časť buildu CMake a poskytuje minimálny vstupný bod pre CMake. Jeho jediným účelom je vyvolať centralizovanú build logiku:include(${CMAKE_CURRENT_LIST_DIR}/CMake/Build.cmake) -
Vrstva platformy
Tento skript obsahuje všetky hlavné build definície, funkcie a konfiguračné kroky.
Stará sa o:- Kontroly build volieb
- Inicializáciu projektu a nastavenie targetov
- Detekciu a konfiguráciu toolchainu
- Spracovanie typov buildu (Debug / Release / Test)
- Propagáciu include ciest
- Registráciu závislostí a modulov
Toto oddelenie zaisťuje, že koreňový projekt zostáva čistý a ľahko udržiavateľný, zatiaľ čo podrobná logika je verzovaná a zdieľateľná ako samostatný submodul.
⚙️ Zástupné zdrojové súbory
CMake vyžaduje na vygenerovanie build systému aspoň jeden platný zdrojový súbor.
Preto sú Platform.c a Platform.h zahrnuté ako prázdne zástupné súbory a úložisko verzie.
Slúžia iba ako stuby počas úvodnej fázy konfigurácie a nekompilujú sa do výsledného firmvéru.
🧩 Integrácia ako submodul
Tento repozitár je určený na pridanie ako Git submodul:
git submodule add git@ssh.dev.azure.com:v3/Dlzen/STM_Template/CMake CMake
V nadradenom projekte by hlavný CMakeLists.txt mal obsahovať:
include("${CMAKE_SOURCE_DIR}/STM_Template/CMake/Build.cmake")
Po inicializácii môže nadradený projekt rozšíriť alebo prepísať konkrétne build kroky pomocou vlastných skriptov alebo volieb CMake.
📜 Verzovanie
Keďže sa build logika vyvíja nezávisle od aplikačného kódu, každá verzia tohto repozitára je označená značkou a nadradené repozitáre sa na ňu môžu explicitne odkazovať.
To umožňuje stabilné buildy naprieč viacerými generáciami firmvéru a vetvami.
🧩 Budúce rozšírenia
Plánované doplnky zahŕňajú:
- Implementáciu integračných testov
- Implementáciu CMake presets
📁 Štruktúra adresárov
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
🧱 Príklad použitia
Nižšie je minimálny príklad použitia tohto build systému CMake v nadradenom projekte.
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
)
🛠️ Požiadavky
- CMake ≥ 3.25
📜 Licencia
Tento projekt je licencovaný pod licenciou Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).