27集 ESP32 AIchat cmake编译解密-《MCU嵌入式AI开发笔记》
我们这集讲解学习cmake编译流程。
为了更好的理解,
我们要先了解几个cmake的内部变量:
CMAKE_SOURCE_DIR:整个CMake工程最顶层的CMakeLists.txt文件所在路径。
CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt文件所在路径。
CMAKE_CURRENT_LIST_DIR:当前*.cmake文件所在路径。
CMAKE_BINARY_DIR: 构建目录的顶层路径。
CMAKE_CURRENT_BINARY_DIR:构建当前CMakeLists.txt文件所在路径。
CMAKE_INSTALL_PREFIX:执行make install命令时安装的根目录的路径。
CMAKE_MODULE_PATH:find_package的module模式时,Find.cmake文件所在路径。
CMAKE_PREFIX_PATH: CMake的环境变量,存放CMake的搜索路径列表,可提供给find_package(), find_program(), find_library(), find_file(), 和find_path()等函数使用。
他会遍历工程目录的CMakeLists.txt文件。
先看最上层ai-chat目录下的CMakeLists.txt:
这里面引入
include(
E
N
V
A
D
F
P
A
T
H
/
C
M
a
k
e
L
i
s
t
s
.
t
x
t
)
i
n
c
l
u
d
e
(
ENV{ADF_PATH}/CMakeLists.txt) include(
ENVADFPATH/CMakeLists.txt)include(ENV{IDF_PATH}/tools/cmake/project.cmake)
也就执行了d:\Espressif\esp-adf\CMakeLists.txt
这里面遍历了WORKING_DIRECTORY,和EXTRA_COMPONENT_DIRS
之后执行:
d:\ESP-IDF\tools\cmake\project.cmake
来进行编译。
这里又遍历SDKCONFIG,${CMAKE_SOURCE_DIR}/sdkconfig,根据SDKCONFIG来遍历get_filename_component。
这里面SDKconfig里面设置了预编译的宏
get_filename_component这个会遍历D:\workspace\esp-idf\ai_chat\components\目录下的components,写入components变量中,以便在cmake后续进行遍历编译。
之后会执行
include(
∗
∗
C
M
A
K
E
C
U
R
R
E
N
T
L
I
S
T
D
I
R
∗
∗
/
t
a
r
g
e
t
s
.
c
m
a
k
e
)
之后
i
n
c
l
u
d
e
(
{** CMAKE_CURRENT_LIST_DIR**}/targets.cmake) 之后 include(
∗∗CMAKECURRENTLISTDIR∗∗/targets.cmake)之后include({CMAKE_CURRENT_LIST_DIR}/idf.cmake)
之后
set(IDFTOOL
P
Y
T
H
O
N
"
{PYTHON} "
PYTHON"{IDF_PATH}/tools/idf.py")
之后会逐个遍历。