本项目的构建由根目录下的 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/
文件夹中,保持了目录结构的整洁。