前言
在乐鑫的官方文档中对组件的描述如下:
是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。
可以简单理解为工程下每个文件夹(包含源文件和头文件或仅源文件)都可以看做为一个组件,要添加的用户自己的组件则属于组件中的“其他组件”。相较于KEIL工程添加文件夹和源文件可以直接在IDE中点击添加,ESP32的IDF工程添加文件夹和源文件(组件)则需要在"CMakeLists.txt"
中添加脚本来实现,略微麻烦,这是由于IDF工程是由CMake构建、链接编译的。本文参考乐鑫《ESP-IDF编程指南》中构建系统章节进行组件(包含用户自己的文件夹、源文件与头文件)的添加,并以官方例程"blink"作为示例。
一、工程目录结构
由IDF生成blink工程示例目录树结构如下(其他与“添加组件”无关的文件未展示):
- blink/
- CMakeLists.txt
- sdkconfig
- esp_idf_components/ #此文件夹下为官方组件,不展开
- main/ - CMakeLists.txt
- blink_example_main.c
- build/
二、添加组件原理
在乐鑫《ESP-IDF编程指南》的构建系统内部章节中给出了标准的 ESP-IDF 应用构建过程,构建过程可以大致分为四个阶段:
我们可以从这个过程中去了解组件是如何参与工程编译并总结添加组件的方法。
在将
idf.cmake
导入project.cmake
后,将执行以下步骤:
- 在环境变量中设置
IDF_PATH
或从顶层CMakeLists.txt
中包含的project.cmake
路径推断相对路径。- 将 /tools/cmake 添加到
CMAKE_MODULE_PATH
中,并导入核心模块和各种辅助/第三方脚本。- 设置构建工具/可执行文件,如默认的 Python 解释器。
- 获取 ESP-IDF git 修订版,并存储为
IDF_VER
。- 设置全局构建参数,即编译选项、编译定义、包括所有组件的 include 目录。
- 将 components 中的组件添加到构建中。
自定义 project() 命令的初始部分执行以下步骤:
- 在环境变量或 CMake 缓存中设置
IDF_TARGET
以及设置相应要使用的CMAKE_TOOLCHAIN_FILE
。- 添加
EXTRA_COMPONENTS_DIRS
中的组件至构建中。- 从
COMPONENTS
/EXCLUDE_COMPONENTS
、SDKCONFIG
、SDKCONFIG_DEFAULTS
等变量中为调用命令idf_build_process()
准备参数。调用
idf_build_process()
命令标志着这个阶段的结束。
我们不必完全了解上述的初始化过程,只需要关注与添加组件相关的内容:
- 在环境变量中设置
IDF_PATH
或从顶层CMakeLists.txt
中包含的project.cmake
路径推断相对路径。- 添加
EXTRA_COMPONENTS_DIRS
中的组件至构建中。
从中可以得到的信息是,标准的 ESP-IDF 应用构建是从顶层文件夹(本例为"blink"
文件夹)下"CMakeLists.txt"
开始的,并且在 EXTRA_COMPONENTS_DIRS
中保存有组件的信息,而保存的组件信息又会参与到构建过程中。所以我们需要重点关注"CMakeLists.txt"
和 EXTRA_COMPONENTS_DIRS
,至于在"CMakeLists.txt"
中做了什么和 EXTRA_COMPONENTS_DIRS
保存了什么信息、如何保存信息后文会讲到。
首先来看一