移植liteos到cmake里:华为LiteOS操作系统现代化CMake构建系统迁移实践
在物联网 (IoT) 与嵌入式操作系统开发中,华为开源的 Huawei LiteOS 凭借其轻量级、低功耗、微秒级响应等特性,被广泛应用于智能家居、穿戴设备以及工控边缘节点。
然而,LiteOS 源码官方长期沿用基于 GNU Make 与一系列嵌套 Makefile / config.mk 的传统构建架构。在大型工程集成、CLion / VS Code 智能代码补全、交叉编译多目标管理以及 CI/CD 自动化流水线方面,传统 Makefile 的可维护性与扩展性面临严峻挑战。
本文将手把手记录并分享:如何将 Huawei LiteOS 完整移植到现代化 CMake 构建系统,实现清晰的依赖拓扑、极致的并行编译体验与跨平台 IDE 完美支持。
1. 为什么要把 LiteOS 移植到 CMake?
传统 LiteOS 采用 make menuconfig 生成 .config,再通过深层递归 include 组合编译参数。这种模式存在三大痛点:
1. IDE 索引痛苦:CLion、VS Code (clangd / C/C++ Extension) 对嵌套 Makefile 无法提供精确的头文件跳转与代码提示。
2. 构建速度受限:递归 Make 破坏依赖图完整性,难以充分发挥现代多核 CPU 的 Ninja 极速并行构建能力。
3. 第三方库与工具链集成繁琐:与现代 C/C++ 生态常用的 CMake 库(如 mbedTLS, cJSON, FlatBuffers 等)集成时摩擦极大。
将 LiteOS 移植到 CMake 后,我们可以获得:
2. 交叉编译工具链 (Toolchain) 文件抽象
移植 LiteOS 到 CMake 的第一步,是为目标芯片架构(例如 ARM Cortex-M4 / STM32F4)编写专用的 CMake 工具链描述文件:cmake/arm-none-eabi.cmake。
# cmake/arm-none-eabi.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 指定交叉编译器前缀
set(TOOLCHAIN_PREFIX arm-none-eabi-)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy)
set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump)
set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size)
# 禁止 CMake 探测编译器时执行测试可执行文件(因为无操作系统环境)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 目标架构硬件浮点及 CPU 参数
set(CPU_FLAGS "-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard")
set(CMAKE_C_FLAGS_INIT "${CPU_FLAGS} -ffunction-sections -fdata-sections -Wall")
set(CMAKE_ASM_FLAGS_INIT "${CPU_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CPU_FLAGS} -Wl,--gc-sections --specs=nano.specs --specs=nosys.specs")
3. 根目录 CMakeLists.txt 架构设计
LiteOS 核心模块清晰,包括内核基础层 (kernel/base)、扩展层 (kernel/extended)、芯片架构适配层 (arch) 与板级支持包 (targets)。我们在根目录进行统一抽象编排。
cmake_minimum_required(VERSION 3.20)
project(LiteOS_CMake C ASM)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(TARGET_BOARD "STM32F429IGTX_FIRE" CACHE STRING "Target Board")
set(ARCH_NAME "arm/cortex-m4" CACHE STRING "Architecture Type")
add_library(liteos_kernel STATIC)
add_subdirectory(arch)
add_subdirectory(kernel)
add_subdirectory(targets)
add_executable(${PROJECT_NAME}.elf src/main.c)
target_link_libraries(${PROJECT_NAME}.elf PRIVATE liteos_kernel)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin
COMMAND ${CMAKE_OBJCOPY} -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex
COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf
COMMENT "Building raw flash binaries (.bin/.hex)..."
)
4. 总结与工程收获
通过将 Huawei LiteOS 移植到 CMake,我们不仅规范了嵌入式软件工程的依赖体系,更为未来接入单元测试(GoogleTest / CTest)、静态代码扫描以及持续交付 (CI) 扫清了所有障碍。