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
验证通过条件:
west update成功拉取my_app_module到modules/目录,且无依赖冲突报错- 构建输出显示
App module initialized,且版本号与主清单中Zephyr版本一致(v3.7.0) - 在
build/目录下执行ninja menuconfig,能看到MY_APP_MODULE配置项且默认为y
依赖关系说明
本案例的依赖配置核心在于import: true指令——它使应用模块的清单继承主清单中已定义的zephyr项目,避免重复拉取。若应用模块需要额外依赖(如共享算法库),只需在my_app_module/west.yml的projects列表中追加对应条目,West会自动解析传递依赖。
常见问题
- 模块未被拉取:检查主清单中
revision分支名是否正确,以及path是否与self.path一致 - 构建时找不到Zephyr:确认
ZEPHYR_BASE环境变量已设置,或在构建命令前执行source zephyr/zephyr-env.sh - 依赖版本冲突:当应用模块与主清单指定不同Zephyr版本时,以主清单为准;如需覆盖,在应用模块清单中显式声明
revision