4. 管理应用模块

任务目标

在Zephyr West工作区中创建一个独立的应用模块(application module),该模块包含自己的west.yml清单文件,能够被主项目通过west update拉取,并正确配置模块间的依赖关系,使应用模块可以引用Zephyr内核及共享库模块的API。

环境与前置条件

  • 已安装West工具(≥1.0)及Zephyr SDK
  • 已创建West工作区根目录(如~/zephyr-workspace)
  • 主项目清单文件(west.yml)已存在,且包含zephyr项目

实现步骤

本案例通过两个层级实现模块化管理:主清单(位于工作区根目录)声明对应用模块的引用;应用模块清单(位于模块仓库内)声明其自身依赖的Zephyr版本及共享库。应用模块以独立Git仓库形式存在,通过West的manifest-rev机制实现版本锁定。

关键完整代码

# 1. 主项目清单文件(~/zephyr-workspace/west.yml)
manifest:
  projects:
    - name: zephyr
      url: https://github.com/zephyrproject-rtos/zephyr
      revision: v3.7.0
      west-commands: scripts/west-commands.yml
    - name: my_app_module
      url: https://github.com/your-org/my_app_module
      revision: main
      path: modules/my_app_module   # 模块将克隆到此路径
  self:
    path: .

# 2. 应用模块的清单文件(my_app_module/west.yml)
manifest:
  projects:
    - name: zephyr
      revision: v3.7.0
      url: https://github.com/zephyrproject-rtos/zephyr
  self:
    path: modules/my_app_module
    # 关键:声明本模块需要Zephyr的库,但不重复拉取
    # 通过import机制继承主清单中的zephyr项目
    import: true
# 3. 应用模块的CMakeLists.txt(my_app_module/CMakeLists.txt)
cmake_minimum_required(VERSION 3.20)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(my_app)

target_sources(app PRIVATE src/main.c)
target_include_directories(app PRIVATE include)
# 4. 应用模块的源码(my_app_module/src/main.c)
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>

void main(void)
{
    printk("App module initialized. Zephyr version: %s\n", STRINGIFY(BUILD_VERSION));
    while (1) {
        k_sleep(K_MSEC(1000));
    }
}
# 5. 应用模块的配置文件(my_app_module/Kconfig)
config MY_APP_MODULE
    bool "Enable my app module"
    default y
    help
      This option enables the application module.

运行与验证

# 在工作区根目录执行
west update

# 构建应用模块(指定模块路径)
west build -b qemu_x86 modules/my_app_module

# 运行(QEMU环境)
west build -t run

验证通过条件:

  1. west update成功拉取my_app_module到modules/目录,且无依赖冲突报错
  2. 构建输出显示App module initialized,且版本号与主清单中Zephyr版本一致(v3.7.0)
  3. 在build/目录下执行ninja menuconfig,能看到MY_APP_MODULE配置项且默认为y

依赖关系说明

本案例的依赖配置核心在于import: true指令——它使应用模块的清单继承主清单中已定义的zephyr项目,避免重复拉取。若应用模块需要额外依赖(如共享算法库),只需在my_app_module/west.yml的projects列表中追加对应条目,West会自动解析传递依赖。

West工作区依赖拓扑 主清单 west.yml 工作区根目录 Zephyr 内核 revision: v3.7.0 my_app_module path: modules/my_app_module 声明引用 声明引用 import: true (继承)

常见问题

  • 模块未被拉取:检查主清单中revision分支名是否正确,以及path是否与self.path一致
  • 构建时找不到Zephyr:确认ZEPHYR_BASE环境变量已设置,或在构建命令前执行source zephyr/zephyr-env.sh
  • 依赖版本冲突:当应用模块与主清单指定不同Zephyr版本时,以主清单为准;如需覆盖,在应用模块清单中显式声明revision