本项目的构建由根目录下的 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/ 目录下的 SDL2Freetype 库。
    • 链接一系列 Windows 系统特有的库,如 gdi32, winmm 等。

2. 动态修改LVGL配置文件

这是本构建系统的一大亮点。为了避免开发者手动修改 lv_conf.hlv_drv_conf.h 来适配不同平台,CMake脚本会在编译前自动完成这个过程:

  • 读取配置文件: 使用 file(READ) 将两个 .h 文件的内容读入变量。
  • 正则替换:
    • 当目标平台是 pcwin 时,脚本会自动启用 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/ 文件夹中,保持了目录结构的整洁。