本项目的构建由根目录下的 CMakeLists.txt 文件驱动,其核心设计思想是自动化平台检测与配置动态修改,以实现一套代码在 Linux PC、ARM 嵌入式 Linux 和 Windows 平台之间的无缝切换。
核心功能
1. 自动化平台检测与库链接
CMake脚本首先会检测当前的编译环境,并根据平台链接不同的依赖库:
ARM 交叉编译 (
arm):- 通过
-DCMAKE_TOOLCHAIN_FILE触发CMAKE_CROSSCOMPILING变量。 - 链接本地静态库:它会链接
libs/目录下为 ARM 预编译好的静态库 (.a文件),包括libfreetype.a,libpng16.a,libcrypto.a,libssl.a,libmosquitto.a,libcurl.a。 - 这种方式避免了在交叉编译环境中配置复杂的依赖库。
- 通过
Linux PC (
pc):- 使用系统库:通过
find_package,pkg_check_modules等命令,查找并链接系统上已经安装好的动态库。 - 依赖项包括:
SDL2,Threads,Freetype,PNG,ZLIB,OpenSSL,CURL,mosquitto,libcjson。
- 使用系统库:通过
Windows (
win):- 同样链接
libs/目录下的SDL2和Freetype库。 - 链接一系列 Windows 系统特有的库,如
gdi32,winmm等。
- 同样链接
2. 动态修改LVGL配置文件
这是本构建系统的一大亮点。为了避免开发者手动修改 lv_conf.h 和 lv_drv_conf.h 来适配不同平台,CMake脚本会在编译前自动完成这个过程:
- 读取配置文件: 使用
file(READ)将两个.h文件的内容读入变量。 - 正则替换:
- 当目标平台是
pc或win时,脚本会自动启用USE_SDL并禁用USE_FBDEV/USE_EVDEV。同时禁用LV_TICK_CUSTOM,因为心跳由SDL提供。 - 当目标平台是
arm时,则会自动禁用USE_SDL并启用USE_FBDEV/USE_EVDEV,以适配嵌入式Linux的帧缓冲设备。同时启用LV_TICK_CUSTOM以使用自定义的心跳函数。
- 当目标平台是
- 写回配置文件: 使用
file(WRITE)将修改后的内容写回原文件。
这个自动化流程极大地简化了跨平台开发的配置工作。
3. 源文件管理
- 全局搜索: 使用
file(GLOB_RECURSE)递归地将lvgl,lv_drivers,obj,libs/cJSON目录下的所有.c文件加入编译列表。 - 智能过滤:
- 通过
list(FILTER ... EXCLUDE REGEX)命令,排除了文件名中包含连字符-的C文件,因为这可能导致C语言宏定义或符号名语法错误。 - 同时,也排除了
obj/AI/examples/目录下的示例代码,使其不参与主程序编译。
- 通过
4. 输出配置
- 所有编译生成的可执行文件(名为
main)会被统一放置在项目根目录下的bin/文件夹中,保持了目录结构的整洁。