构建系统

CMake用于与Zephyr内核一起构建您的应用程序。CMake构建分为两个阶段:

  • 第一阶段称为配置。在配置过程中,执行CMakeLists.txt生成脚本。CMake 支持使用多个构建系统生成脚本,但只有NinjaMake由 Zephyr 测试和支持。
  • 配置后,您通过执行生成的生成脚本开始构建阶段。这些构建脚本可以重新编译应用程序,而无需在大多数代码更改后重新配置CMake。但是,在某些更改后,必须在构建之前再次执行配置步骤。

Zephyr使用CMake的目标概念来组织构建。即通过CMakeList.txt添加构建:

  1. target_sources(app PRIVATE src/main.c)

配置阶段

配置阶段从应用程序中调用CMake时开始,指定源应用程序和目标板子。
01.zephyr的构建系统 - 图1
CMake首先处理的是Zephyr顶级目录中的文件,而该目录又间接或直接包含整个构建树中的文件。它的主要输出是一组MakefilesNinja文件来驱动生成过程,但CMake脚本也做一些自己的处理。

设备树

从目标的架构、SoC、板子和应用程序目录中收集设备树*.dts和设备树源*.dtsi文件。同时C预处理器还会合并设备树扩展文件*.overlay文件。最后经由gen_defines.py解析,以生成带有预处理器宏的标识。最终生成文件为:*.dts.pre.tmpdevicetree_unfixed.h
设备树编译器可以在预处理的设备树源上运行,以捕获由此产生的任何额外警告和错误。

设备树修复

设备修复文件的作用是将上一步生成的预处理设备树标识符宏进行重命名,也就是将devicetree_unfixed.h文件里的宏重命名,修改为源代码所期望的名称。设备树修复文件来源于:目标的架构、SoC、板子和应用程序目录中。设备树修复文件的名字为:dts_fixup.hdevicetree_fixups.h

Kconfig文件

Kconfig文件定义了目标架构、SoC、板和应用程序的可用配置选项,以及选项之间的依赖关系。
初始配置是通过合并板子和应用程序的prj.conf配置片段生成的。
Kconfig的输出是具有处理器前分配的标头,以及既充当保存的配置.config又充当配置输出autoconf.h的文件。
通过在kconfigfunctions.py中定义的功能,Kconfig可以从设备树获得信息。

构建阶段

构建阶段可分为四个阶段:预构建、首次生成二进制、最终二进制和后处理。最终输出是一个完整的Zephyr应用程序,格式适合在所需的目标板上加载。

  • 预构建:预构建发生在编译任何源文件之前,因为在此阶段生成源文件所使用的头文件。
  • 首次生成二进制: 将当前的应用程序和zephyr源码的源文件进行编译和链接。
  • 最终生成二进制: 扫描首次生成二进制文件,以确定设备树数据记录的设备之间的关系,并将编码关系替换为应用程序中实际存在的设备的值。
  • 后处理: 将生成的二进制文件从elf格式转换为有用户想要的格式。