27-28集 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
来进行编译。
get_filename_component(sdkconfig “${SDKCONFIG}” ABSOLUTE)
这得到SDKCONFIG所在的绝对路径。也就是sdkconfig=d:\workspace\esp-idf\ai_chat\这样AI-CHAT工程里面的文件就加到里面了。
这里面SDKconfig里面设置了预编译的宏
get_filename_component这个得到sdkconfig的绝对路径。以便在cmake后续进行遍历编译。
之后会执行
include(${** CMAKE_CURRENT_LIST_DIR**}/targets.cmake)
(一共有两个targets.cmake,应该是ESP-IDF目录的这个** d:\ESP-IDF\tools\cmake\targets.cmake** ;d:\Espressif\frameworks\esp-idf-v5.2.2\tools\cmake\targets.cmake )
更正:
Setting IDF_PATH: D:\Espressif\frameworks\esp-idf-v5.2.2
Setting IDF_PATH: D:\Espressif\frameworks\esp-idf-v5.2.2
Setting IDF_PATH: D:\Espressif\frameworks\esp-idf-v5.2.2
所以我们要看d:\Espressif\frameworks\esp-idf-v5.2.2\tools\cmake\targets.cmake 这个targets.cmake
__target_init(“${sdkconfig}”)
之后
include(${CMAKE_CURRENT_LIST_DIR}/idf.cmake)
目录是d:\ESP-IDF\tools\cmake\idf.cmake
之后
set(IDFTOOL P Y T H O N " {PYTHON} " PYTHON"{IDF_PATH}/tools/idf.py")
应该是这个d:\ESP-IDF\tools\idf.py
之后会逐个遍历。
那我们下集
继续依次学习project.cmake、 targets.cmake、__target_init(“${sdkconfig}”) 、idf.cmake、idf.py
28集ESP IDF编译解密之targets.cmake-《MCU嵌入式AI开发笔记》
我们更正一下 IDF_PATH
:Setting IDF_PATH: D:\Espressif\frameworks\esp-idf-v5.2.2,
是这个目录。
targets.cmake
d:\Espressif\frameworks\esp-idf-v5.2.2\tools\cmake\targets.cmake
我们首先在sourceinsight里面加入*.cmake
之后我们看一下这个targets.cmake
有两个比较重要的函数:
macro(__target_set_toolchain)
macro(__target_init config_file)
我们在projects.cmake中调用了
__target_init(“KaTeX parse error: Expected group after '_' at position 27: …") 我们看一下 macro(_̲_target_init co…{sdkconfig}”)这个函数执行了什么。
首先设置了env_idf_target 咱们之前设置了的是esp32c3
之后设置sdkconfig_target
set(ENV{IDF_TARGET} ${env_idf_target})也就是要保证这两个设置的是一样的都是esp32c3
之后我们执行idf.cmake
include(${CMAKE_CURRENT_LIST_DIR}/idf.cmake)
d:\Espressif\frameworks\esp-idf-v5.2.2\tools\cmake\idf.cmake
我们休息一下
下集继续