← Back to Articles

移植liteos到cmake里:华为LiteOS操作系统现代化CMake构建系统迁移实践

microkernel Published: 2026-09-11 8 分钟 Author: Mablock

移植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 后,我们可以获得:

  • 原生支持 Ninja 极速并行构建,编译耗时缩短 60% 以上。

  • 自动化导出 compile_commands.json,让 VS Code 和 CLion 拥有完美的智能代码补全。

  • 声明式的 target_include_directories 与 target_link_libraries,彻底根治宏定义污染。

  • 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) 扫清了所有障碍。