Nastavení CMake pro sestavování firmware STM32F407 na Windows s GCC
CMake zajišťuje multiplatformní sestavování firmware pro mikrokontroléry STM32. Jedinými skripty můžete sestavovat projekty jak ve Windows, tak v Linuxu. Tím se řeší problém s cestami a nástroji specifickými pro operační systém v GNU Make. Pro vývoj na jedné platformě není přechod nutný, ale při potřebě podpory více operačních systémů se CMake stává standardem mezi meta build systémy.
Systém generuje nativní soubory pro sestavení: GNU Make pro Linux/Windows, Ninja nebo projekty pro IDE. Zaměřujeme se na ARM GCC pro STM32F407VE s HAL od ST a CMSIS.
Výhody skriptového sestavování
Sestavování z konzole se škáluje na stovky firmware. GUI-IDE omezují automatizaci při růstu projektů. Skripty umožňují:
- Automatizovat CI/CD pipeline
- Sestavit všechny varianty přes noc
- Integrovat do repozitářů jednou příkazem
Pro 150+ firmware stačí dávkový soubor: spuštění – a během minut jsou připraveny .hex soubory.
Zadání úlohy: Projekt v C pro STM32F407VE. Křížový kompilátor ARM GCC. CMake generuje GNU Make. HAL STM32 + CMSIS. Cíl – Windows 10.
Kompilátoru předáváme přísné příznaky:
-MMD -MP -O0 -std=c11 -Wall -Werror -mcpu=cortex-m4 -march=armv7e-m -Werror=address -Werror=address-of-packed-member -Werror=array-bounds=1 -Werror=bool-compare -Werror=bool-operation -Werror=char-subscripts -Werror=clobbered -Werror=div-by-zero -Werror=duplicate-decl-specifier -Werror=empty-body -Werror=enum-compare -Werror=float-equal -Werror=ignored-qualifiers -Werror=implicit -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=init-self -Werror=int-in-bool-context -Werror=int-to-pointer-cast -Werror=logical-not-parentheses -Werror=logical-op -Werror=maybe-uninitialized -Werror=memset-elt-size -Werror=misleading-indentation -Werror=missing-braces -Werror=multistatement-macros -Werror=old-style-declaration -Werror=overflow -Werror=pointer-arith -Werror=pointer-sign -Werror=return-local-addr -Werror=return-type -Werror=shadow -Werror=shift-count-overflow -Werror=sign-compare -Werror=sizeof-pointer-div -Werror=strict-aliasing -Werror=switch -Werror=tautological-compare -Werror=type-limits -Werror=uninitialized -Werror=unused-variable -g3 -Wextra -Wno-conversion -Wno-cpp -Wno-discarded-qualifiers -Wno-implicit -Wno-int-conversion -Wno-nonnull-compare -Wno-redundant-decls -Wno-restrict -Wno-sign-compare -Wno-stringop-truncation -Wno-switch-bool -Wno-unused-parameter -fallthrough -fdata-sections -ffreestanding -ffunction-sections -finline-small -fmax-errors=70 -fno-common -fno-move-loop-invariants -fno-printf-return-value -fomit-frame-pointer -fshort-enums -fsigned-char -fstack-usage -fzero-initialized-in-bss -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb
Linkeru:
-specs=nosys.specs -Xlinker --gc-sections -Xlinker --nmagic -Wl,--gc-sections -Xlinker --print-memory-usage -t -Wl,--cref -Wl,--gc-sections --verbose -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lm
STM32CubeMX negeneruje CMake přímo – pouze GNU Make. Řešení: ruční migrace.
Teorie: od Make k CMake
Proměnné prostředí ukládají cesty, příznaky kompilátoru, nastavení. Jsou viditelné všem nástrojům.
Build systém automatizuje kompilaci, linkování, závislosti. Příklady: GNU Make, Ninja, IAR.
Generátor build systému (CMake, Meson) vytváří soubory pro nativní systémy sestavení.
Schéma CMake + GNU Make:
- CMake čte CMakeLists.txt
- Generuje Makefile
- GNU Make sestavuje artefakty
Zkontrolujte CMake: where cmake ve Windows.
Migrace Make → CMake
Mechanická náhrada syntaxe. CMake je více slov, ale výkonnější.
| GNU Make | CMake | Vysvětlení |
|----------|--------|-----------|
| VAR += value | string(APPEND VAR " value") | Rozšíření proměnné |
| CRC=Y | set(CRC Y) | Definice |
| $(VAR) | ${VAR} | Vložení |
| ifeq($(IAR),Y) | if(IAR STREQUAL Y) | Podmínka |
| SOURCES_C += src/main.c | target_sources(app PRIVATE src/main.c) | Zdrojové soubory |
| OPT += -Ipath | target_include_directories(app PUBLIC path) | Cesty |
Příklady transformace:
LINKER_FLAGS += -u _printf_float→target_link_options(app PRIVATE -u _printf_float)include file.mk→include(${file}.cmake)SOURCES += file.c→string(APPEND SOURCES " ${file}.c")ifneq($(FLAG),Y)→if(NOT (FLAG STREQUAL Y))
CMakeLists.txt (kořenový):
cmake_minimum_required(VERSION 3.16)
project(jz_f407vet6_mbr_gcc_cmake)
set(PROJECT_NAME jz_f407vet6_mbr_gcc_cmake)
enable_language(C ASM)
set(CURRENT_CMAKELISTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(PROJECT_LOC ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${PROJECT_LOC})
set(BUILD_DIR ${PROJECT_LOC}/build)
set(TARGET ${PROJECT_NAME})
set(EXECUTABLE ${TARGET})
get_filename_component(WORKSPACE_LOC "${PROJECT_LOC}/../.." ABSOLUTE)
include_directories(${WORKSPACE_LOC})
include(${PROJECT_LOC}/config.cmake)
include(${WORKSPACE_LOC}/cmake_scripts/code_base.cmake)
include(${WORKSPACE_LOC}/cmake_scripts/rules.cmake)
Konfigurace komponent
V config.cmake aktivujte moduly:
set(CONTROL Y)
set(DWT Y)
set(ARM_GCC Y)
set(CORTEX_M4 Y)
set(FLASH Y)
set(FPU Y)
set(GPIO Y)
set(INTERRUPT Y)
set(JZ_F407VET6 Y)
set(LED_MONO Y)
set(MBR Y)
set(MCAL_STM32 Y)
set(MICROCONTROLLER Y)
set(NVIC Y)
set(RCC Y)
set(SCHEDULER Y)
set(STM32F407VE Y)
set(STM32F4X_HAL_DRIVER Y)
set(SUPER_CYCLE Y)
set(SYSTEM Y)
set(SYSTICK Y)
set(SYS_INIT Y)
set(TIME Y)
V code_base.cmake přidávejte komponenty podmíněně:
if(GPIO STREQUAL Y)
target_sources(app PRIVATE gpio/src/gpio.c)
target_include_directories(app PUBLIC gpio/inc)
add_compile_definitions(GPIO_ENABLED)
endif()
Co je důležité
- CMake zajišťuje multiplatformnost bez přepisování skriptů
- Migrace Make→CMake – šablonová náhrada, automatizovatelná AI
- Přísné příznaky -Werror odhalují chyby ve fázi kompilace
- config.cmake řídí sadu HAL modulů
- Sestavování ze skriptů se škáluje na 100+ firmware
— Editorial Team
Zatím žádné komentáře.