前言
在esp32开发中,一般用的是vscode。没有像keil mdk等集成开发环境,这就对不熟悉cmake的人士不太友好。笔者也是参阅了cmake官方文档以及esp32开发手册,找到一个非常有效的以及简单的CmakeList.txt的编写方式。
esp32工程目录
esp官方比较推荐的目录格式是有两个文件夹,一个是main文件夹,一个是components文件夹,这两个文件夹的名称不建议更改,这两个是esp32开发环境默认的main模块和components模块。
esp32采用的cmake编译工具。当添加了新的文件后需要自己编写cmakelist.txt。这里主要重点说下components文件夹。
components文件夹
components文件夹下的每个子文件夹esp-idf环境会认为其是一个模块。比如上图中a,lvgl,sda都是一个模块。在每个子模块的根目录下需要新建一个CMakeLists.txt。比如上图a目录下就有一个CMakeLists.txt,仅需要这一个.mk文件是不必要的。a的子目录里面只用放自己需要的源码就行,不要再放CMakeLists.txt。如下图:
模块a有3个子目录具体关系如下:

set(include_dirs
inc_a
src_a
src_a/src_c
)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${include_dirs})
上面就是模块a的Cmakelists.txt全文,是不是很简洁。项目具体解析下。
先说最简单的set。set是给一个变量赋值,上面就是将inc_a src_a src_a/src_c这三个文件夹赋值给include_dirs。只需要将用到的头文件文件夹添加到set里面即可。通过“$”来取得include_dirs变量的值。这个linux下bash语法一致。
idf_component_register 这是esp-idf添加模块的命令,这里一般是添加源文件和头文件,分别用SRCS 和INCLUDE_DIRS关键字表示,这两个关键字后面可以用多个 变量
比如:
idf_component_register(SRCS ${SOURCES} "123.c"
INCLUDE_DIRS ${include_dirs} . "123.h" "inc_a"
)
- "."表示为当前目录下的文件
- INCLUDE_DIRS 后面可以直接跟目录名称
- SRCS 后面必须跟具体的文件,不能使用目录代替,这个经过测试用目录是无效的,所以当模块内部有多个.c文件,按照上面的方式就要一个一个添加.c文件。这样也太麻烦了吧,如果有大量的.c文件,那工作量太大了,但是esp32的开发手册中没有给出具体的办法。但是可定有办法可以让.c文件按照目录方式添加索引。
经过百度和大量测试,可以使用的file这个命令。详细解释见https://cmake.org/cmake/help/latest/command/file.html
file命令用于文件系统时主要有两个语法
file(GLOB <variable>
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
官方的对这个命令的解释是,生成一个符合规则的列表,并将给列表赋值给。官方不建议采用GLOB 命令,改命令不能读取到索引的自索引。
如果将file(GLOB_RECURSE SOURCES src_a/.c src_b/.c)中的GLOB_RECURSE改为GLOB ,编译会不成功,显示找不到sumc函数,sumc函数位于src_a/src_c文件夹下面。
当时目前还有一个问题
当添加了新的.c文件到src_a下面的时候,需要重新编辑下Cmakelists.txt,编译的时候才能正常识别到新添加的.c文件,暂时还没有找到能够自动更新的方法。
添加LVG组件
当时研究这个方法的目的就是要一直lvgl。lvgl8.2的目录结构如下;
其中CMakeLists.txt内容如下:
file(GLOB_RECURSE SOURCES src/*.c examples/porting/*.c )
set(included_dirs src examples/porting)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${included_dirs}
)
通过file这种方法可以非常方便的添加大量的.c源文件。本次实验的项目见:
https://download.csdn.net/download/sinat_36568888/85751343