ESP32构建系统 (传统 GNU Make)
概述:
一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件。在构建项目的时候,构建系统会前往 ESP-IDF 目录、项目目录和用户自定义目录(可选)中查找所有组件,允许用户通过文本菜单系统配置 ESP-IDF 项目中用到的每个组件。在所有组件配置结束后,构建系统开始编译整个项目。
概念:
项目: 特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。
项目配置:保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。
应用程序:是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。
组件: 是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。
目标: 特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 ESP32 这一个硬件目标。
示例项目
1 - myProject/
2 - Makefile //设置了 PROJECT_NAME 变量,还可以定义作用于整个项目的其它 make 变量(可选)。
3 - sdkconfig //配置文件
4 - components/ //可选组件目录
5 - component1/
6 - component.mk //组件的makefile文件
7 - Kconfig
8 - src1.c
9 - component2/
10 - component.mk
11 - Kconfig
12 - src1.c
13 - include/ - component2.h
14 - main/ //特殊组件,包含项目源码。
15 - src1.c
16 - src2.c
17 - component.mk
18 - build/ //编译输出目录
组件目录中会包含组件自己的 Makefile 文件 component.mk ,里面会定义一些变量来控制该组件的构建过程,以及它与整个项目的集成。
项目 Makefiles
每个项目都有一个 Makefile ,它包含整个项目的构建设置。默认情况下,项目 Makefile 可以非常小。
PROJECT_NAME := myProject //项目名称
include $(IDF_PATH)/make/project.mk // 顶层项目目录,默认是包含 Makefile 文件的目录,许多其他的项目变量都基于此变量。
以下这些可选变量都有默认值,用户可以重写这些变量以自定义构建行为。
- BUILD_DIR_BASE: 所有对象、库、二进制文件的输出目录,默认为 $(PROJECT_PATH)/build。
- COMPONENT_DIRS: 组件的搜索目录,默认为 $(IDF_PATH)/components,$(PROJECT_PATH)/components,$(PROJECT_PATH)/main 和 EXTRA_COMPONENT_DIRS 。
- EXTRA_COMPONENT_DIRS: 组件额外的搜索路径,可选。
- COMPONENTS: 要构建进项目中的组件列表,默认为 COMPONENT_DIRS 指定目录中所有的组件。
- EXCLUDE_COMPONENTS: 在构建的过程中需要剔除的组件列表,可选。请注意这只会减少构建的时间,并不会减少最终二进制文件的大小。
组件Makefiles
每个项目都包含一个或者多个组件,这些组件可以是 ESP-IDF 的一部分,也可以从其他组件目录添加。组件是包含 component.mk 文件的任何目录。
搜索 COMPONENT_DIRS 中指定的目录以查找项目会使用的组件,目录可以是组件本身(即他们包含 component.mk 文件),也可以是包含组件的上层目录。
ESP-IDF 搜索组件时,会按照 COMPONENT_DIRS 指定的顺序依次进行,这意味着在默认情况下,首先是 ESP-IDF 组件,然后是项目组件,最后是 EXTRA_COMPONENT_DIRS 中的组件。如果这些目录中的两个或者多个包含具有相同名字的组件,则使用搜索到的最后一个位置的组件。这就允许将组件复制到项目目录中再修改来覆盖 ESP-IDF 组件。
最简单的 component.mk 文件可以是一个空文件,如果文件为空,则组件的默认构建行为会被设置为:
- makefile 所在目录中的所有源文件(*.c,*.cpp,*.cc,*.S)将会被编译进组件库中。
- 子目录 include 将被添加到其他组件的全局头文件搜索路径中。
- 组件库将会被链接到项目的应用程序中。
空的 component.mk 文件同没有 component.mk 文件之间存在本质差异,前者会调用默认的组件构建行为,后者不会发生默认的组件构建行为。
组件变量:
- COMPONENT_PATH: 组件的目录,即包含 component.mk 文件的绝对路径
- COMPONENT_NAME: 组件的名字,默认为组件目录的名称。
- COMPONENT_BUILD_DIR: 组件的构建目录,即存放组件构建输出的绝对路径,它是 $(BUILD_DIR_BASE) 的子目录。
- COMPONENT_LIBRARY: 组件构建后的静态库文件(相对于组件的构建目录)的名字,默认为 $(COMPONENT_NAME).a。
- COMPONENT_ADD_INCLUDEDIRS: 相对于组件目录的路径,将被添加到项目中所有组件的头文件搜索路径中。
- COMPONENT_ADD_LDFLAGS: 添加链接参数到全局 LDFLAGS 中用以指导链接最终的可执行文件,默认为 -l$(COMPONENT_NAME)。
- COMPONENT_DEPENDS: 需要在当前组件之前构建的组件列表,这对于处理链接时的依赖不是必需的,因为所有组件的头文件目录始终可用。
- COMPONENT_ADD_LINKER_DEPS: 保存一些文件的路径,当这些文件发生改变时,会触发 ELF 文件重新链接。
- COMPONENT_SUBMODULES: 组件使用的 git 子模块的路径列表(相对于 COMPONENT_PATH)。这些路径会在构建的过程中被检查(并在必要的时候初始化)。
- COMPONENT_PRIV_INCLUDEDIRS: 相对于组件目录的目录路径,该目录仅会被添加到该组件源文件的头文件搜索路径中。
- COMPONENT_EXTRA_INCLUDES: 编译组件的源文件时需要指定的额外的头文件搜索路径,这些路径将以 -l 为前缀传递给编译器。
- COMPONENT_SRCDIRS: 相对于组件目录的目录路径,这些路径用于搜索源文件(*.cpp,*.c,*.S),默认为 .,即组件目录本身。
- COMPONENT_OBJS: 要编译生成的目标文件,默认是 COMPONENT_SRCDIRS 中每个源文件的 .o 文件。
- COMPONENT_EXTRA_CLEAN: 相对于组件构建目录的路径,指向 component.mk 文件中自定义 make 规则生成的任何文件,它们也是 make clean 命令需要删除的文件。
- COMPONENT_OWNBUILDTARGET & COMPONENT_OWNCLEANTARGET: 这些目标允许您完全覆盖组件的默认编译行为。
- COMPONENT_CONFIG_ONLY: 如果设置了此标志,则表示组件根本不会产生构建输出(即不会构建得到 COMPONENT_LIBRARY),并且会忽略大多数其它组件变量。
- CFLAGS: 传递给 C 编译器的标志。根据项目设置已经定义一组默认的 CFLAGS,可以通过 CFLAGS += 来为组件添加特定的标志,也可以完全重写该变量(尽管不推荐这么做)。
- CPPFLAGS: 传递给 C 预处理器的标志(用于 .c,.cpp 和 .S 文件)。
- CXXFLAGS: 传递给 C++ 编译器的标志。
配置组件
每个组件都可以包含一个 Kconfig 文件,和 component.mk 放在同一个目录下。Kconfig 中包含此组件在 make menuconfig 时要展示的配置规则的设置。运行 menuconfig 时,可以在 Component Settings 菜单栏下找到这些设置。
参考:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system-legacy.html
ESP32构建系统 (传统 GNU Make)的更多相关文章
- ESP32构建系统(CMake版)
ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS. ESP-IDF 即乐鑫物联网开发框架,可为在 Wind ...
- C/C++构建系统 GNU autotool
我们在网上经常可以看到c/c++开源的项目,其中很多都是使用GNU的构建系统进行配置和编译的,如果按照规范构造这些的步骤,有一定的门槛和复杂度,下文把关于auotools系列的工具和概要的流程简要汇总 ...
- C/C++构建系统 -工具汇总
关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...
- 关于esp32的系统初始化启动过程及设计学习方法
对于esp32,其开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,这在没有调用FreeRTOS的系统中相当于函数main,但其实在app_main之前,系统还有一段初始化的过程, ...
- 不一样的go语言-构建系统与构件系统
前言 代码的最后一步是构建成计算机可识别的二进制数据,然后才得以在计算机上运行.如果你曾经写过有点规模(至少数十个以上独立的源文件,且需要依赖第三方包)C语言项目,必定对C语言项目的构建过程印象深 ...
- 基于Jenkins自动构建系统开发
1 绪论 1.1 课题的研究背景 随着IT行业的不断发展,软件开发的复杂度也随着不断提高.与此同时,软件的开发团队也越来越庞大,而如何更好地协同整个团队进行高效准确的工作,从而确保软件开发的质量已经 ...
- nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)
恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的 ...
- Google分布式构建软件之二:构建系统如何工作
分布式软件构建第二部分:构建系统如何工作 注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 上篇文章中提到了在Google,所 ...
- [系统集成] Android 自动构建系统
一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包android 的打包一般 ...
随机推荐
- SpringBoot打jar包-下载文件时报错-class path resource xxxxxx cannot be resolved to URL because it does not exist
一.问题由来 新项目的开发中,打包方式由war包改为了jar包的方式,这样在部署的时候更加的方便.测试环境使用pm2这个工具来管理项目的运行,停止,重启等等非常方便. 可是当测试人员在测试项目中的文件 ...
- SpringMVC学习笔记-REST风格请求实现
RESTful概念及功能 RESTful的概念:RESTful是 一种资源定位及资源操作的风格,其本身既不是标准也不是协议,而是一种设计风格,可以使得软件整体层次更加分明.代码更加简洁,并且有利于实现 ...
- [论文阅读笔记] Adversarial Learning on Heterogeneous Information Networks
[论文阅读笔记] Adversarial Learning on Heterogeneous Information Networks 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问 ...
- The Superego 实验四 团队作业1:软件研发团队组建
项目 内容 课程班级博客链接 班级博客链接 这个作业要求链接 作业要求链接 团队名称 The Superego 团队的课程学习目标 (1)组建团队,建设团队文化,申请开通团队博客 (2)团队之间相互协 ...
- AI基础架构Pass Infrastructure
AI基础架构Pass Infrastructure Operation Pass OperationPass : Op-Specific OperationPass : Op-Agnostic Dep ...
- NVIDIA GPU自动调度神经网络
NVIDIA GPU自动调度神经网络 对特定设备和工作负载进行自动调整对于获得最佳性能至关重要.这是有关如何使用自动调度器为NVIDIA GPU调整整个神经网络. 为了自动调整神经网络,将网络划分为小 ...
- C/C++语言编程的隐患!
C/C++语言编程的隐患! 本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决 ...
- AI+IoT+电池应用
AI+IoT+电池应用 AIoT电池 突破你的想象 将行业领先的电池电化学技术与前沿的能源物联网最佳实践相结合,利用智能物联技术开展电池全生命周期的管理优化和交叉领域的协同应用,解锁动力电池全生命周期 ...
- 如何为应用选择最佳的FPGA(下)
如何为应用选择最佳的FPGA(下) How to select an FPGA board? FPGA板的选择在很大程度上受FPGA本身的影响,也受整个板的特性和性能的影响.们已经在上面的章节中讨论了 ...
- 『言善信』Fiddler工具 — 7、统计选项页详解(Statistics)
目录 1.Statistics选项页介绍 2.Statistics界面内容说明 3.Statistics选项页底部图表说明 1.Statistics选项页介绍 Statistics 页签显示当前用户选 ...