Перейти до основного вмісту

Система збірки CMake

Цей репозиторій надає інфраструктуру CMake, необхідну для збірки проєктів на базі STM32 та інших модулів в архітектурі STM Template.
Він розроблений для використання як Git submodule і відокремлює складну логіку збірки від вихідного коду проєкту, забезпечуючи узгодженість, версіонування та повторне використання в різних репозиторіях.


🧩 Огляд​

Систему збірки поділено на два рівні:

  1. Рівень проєкту
    Файл CMakeLists.txt у кореневій теці проєкту є частиною проєкту для збірки CMake і надає мінімальну точку входу для CMake. Його єдина мета — викликати централізовану логіку збірки:

    include(${CMAKE_CURRENT_LIST_DIR}/CMake/Build.cmake)
  2. Рівень платформи
    Цей скрипт містить усі основні визначення збірки, функції та кроки конфігурації.
    Він відповідає за:

    • Перевірку опцій збірки
    • Ініціалізацію проєкту та налаштування цілей
    • Виявлення та налаштування 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).