如何使用CMake实现跨架构编译并生成统一boot启动镜像
多异构处理器统一CMake构建方案实现
核心实现思路
该场景属于典型的异构多核心嵌入式项目构建需求,CMake原生支持通过外部项目模块实现跨架构的分级构建,完全可以满足与CMake Tools插件的集成要求,无需额外写三方调度脚本。
关键用到的CMake能力
ExternalProject模块:用于定义每个处理器架构的独立构建任务,支持指定不同的工具链、编译参数、源码路径、输出路径add_custom_command+add_custom_target:用于定义boot文件的生成规则,把各个架构输出的elf文件作为依赖,调用镜像整合工具生成最终boot文件target_depends/DEPENDS参数:用于绑定全链路依赖关系,确保修改任意架构的源码都会触发对应重编译,最后自动更新boot文件
具体实现示例
1. 参考项目目录结构
项目根目录 ├── CMakeLists.txt # 总控CMake配置,即下文要编写的文件 ├── cortex_m/ # Cortex核心的源码、专属CMake配置、工具链文件 ├── dsp0/ # 第一个DSP核心的源码、专属CMake配置、工具链文件 ├── dsp1/ # 第二个DSP核心的源码、专属CMake配置、工具链文件 └── tools/ # 镜像整合工具、段合并脚本等
2. 总控CMakeLists.txt核心代码
cmake_minimum_required(VERSION 3.16) project(multi_core_boot ASM C CXX) # 引入外部项目模块 include(ExternalProject) # 定义Cortex核心构建任务 ExternalProject_Add(cortex_build SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cortex_m BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/cortex_m CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cortex_m/arm_gcc_toolchain.cmake INSTALL_COMMAND "" # 禁用默认安装步骤 BUILD_ALWAYS 0 # 仅源码变更时才触发重编译 ) # 定义第一个DSP核心构建任务 ExternalProject_Add(dsp0_build SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dsp0 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/dsp0 CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/dsp0/dsp_toolchain.cmake INSTALL_COMMAND "" BUILD_ALWAYS 0 ) # 定义第二个DSP核心构建任务 ExternalProject_Add(dsp1_build SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dsp1 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/dsp1 CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/dsp1/dsp_toolchain.cmake INSTALL_COMMAND "" BUILD_ALWAYS 0 ) # 定义各核心输出elf文件路径,替换为你实际的输出文件名 set(CORTEX_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/cortex_m/cortex_app.elf) set(DSP0_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/dsp0/dsp0_app.elf) set(DSP1_ELF ${CMAKE_CURRENT_BINARY_DIR}/build/dsp1/dsp1_app.elf) # 定义boot文件生成规则,COMMAND替换为你实际的镜像整合命令 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin DEPENDS cortex_build dsp0_build dsp1_build ${CORTEX_ELF} ${DSP0_ELF} ${DSP1_ELF} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/boot_packer --cortex-elf ${CORTEX_ELF} --dsp0-elf ${DSP0_ELF} --dsp1-elf ${DSP1_ELF} --output ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin COMMENT "Packing final boot file..." ) # 定义默认构建目标,CMake Tools会自动识别 add_custom_target(boot ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/final_boot.bin)
3. 跨核心依赖处理(比如Cortex镜像依赖DSP生成的头文件)
如果存在核心间的依赖关系,只需要在对应ExternalProject_Add中添加DEPENDS参数即可,例如Cortex需要等待DSP0构建完生成头文件后再编译:
ExternalProject_Add(cortex_build # 原有配置保持不变 DEPENDS dsp0_build )
同时在Cortex的CMake配置中把DSP0构建输出的头文件路径加入头文件搜索目录,依赖链路就会自动生效。
VSCode CMake Tools适配
该方案无需额外配置,CMake Tools会自动识别总控项目的所有目标,点击构建默认会触发boot目标的全链路构建,修改任意核心的源码都会自动触发对应核心的重编译,最终生成新的boot文件。
内容的提问来源于stack exchange,提问作者Russ Schultz
相关产品推荐
相关产品推荐

