Zephyr项目按需配置完全指南
引言
Zephyr项目是一个功能丰富的RTOS生态系统,包含62个活跃子仓库和大量可选组件。对于普通开发者来说,完整克隆所有仓库不仅耗时(可能需要数GB存储和数小时下载),而且往往是不必要的。
本文将详细介绍如何按需配置Zephyr项目,通过多种技术手段实现只下载必要的软件包,从而节省磁盘空间、加快初始化速度、优化开发工作流。
一、问题背景与解决方案概览
1.1 默认仓库带来的挑战
#mermaid-svg-9TH7LeOd9Vycbxw6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9TH7LeOd9Vycbxw6 .error-icon{fill:#552222;}#mermaid-svg-9TH7LeOd9Vycbxw6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9TH7LeOd9Vycbxw6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9TH7LeOd9Vycbxw6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9TH7LeOd9Vycbxw6 .marker.cross{stroke:#333333;}#mermaid-svg-9TH7LeOd9Vycbxw6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9TH7LeOd9Vycbxw6 p{margin:0;}#mermaid-svg-9TH7LeOd9Vycbxw6 .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-9TH7LeOd9Vycbxw6 .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-9TH7LeOd9Vycbxw6 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-9TH7LeOd9Vycbxw6 .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-9TH7LeOd9Vycbxw6 .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-9TH7LeOd9Vycbxw6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 40% 20% 15% 15% 10% Zephyr完整工作区大小分布(估计) zephyr核心 HAL仓库(28个) 协议栈库 安全库 工具库
痛点分析:
| 问题 | 影响 |
|---|---|
| 磁盘空间占用大 | 完整克隆可能超过5GB |
| 初始化时间长 | 网络不佳时可能需要数小时 |
| 更新速度慢 | west update耗时过长 |
| 版本冲突风险 | 多版本共存可能产生兼容性问题 |
1.2 解决方案总览
#mermaid-svg-hM6wQPQaNJHzcLpd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hM6wQPQaNJHzcLpd .error-icon{fill:#552222;}#mermaid-svg-hM6wQPQaNJHzcLpd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hM6wQPQaNJHzcLpd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hM6wQPQaNJHzcLpd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hM6wQPQaNJHzcLpd .marker.cross{stroke:#333333;}#mermaid-svg-hM6wQPQaNJHzcLpd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hM6wQPQaNJHzcLpd p{margin:0;}#mermaid-svg-hM6wQPQaNJHzcLpd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster-label text{fill:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster-label span{color:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster-label span p{background-color:transparent;}#mermaid-svg-hM6wQPQaNJHzcLpd .label text,#mermaid-svg-hM6wQPQaNJHzcLpd span{fill:#333;color:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd .node rect,#mermaid-svg-hM6wQPQaNJHzcLpd .node circle,#mermaid-svg-hM6wQPQaNJHzcLpd .node ellipse,#mermaid-svg-hM6wQPQaNJHzcLpd .node polygon,#mermaid-svg-hM6wQPQaNJHzcLpd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hM6wQPQaNJHzcLpd .rough-node .label text,#mermaid-svg-hM6wQPQaNJHzcLpd .node .label text,#mermaid-svg-hM6wQPQaNJHzcLpd .image-shape .label,#mermaid-svg-hM6wQPQaNJHzcLpd .icon-shape .label{text-anchor:middle;}#mermaid-svg-hM6wQPQaNJHzcLpd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hM6wQPQaNJHzcLpd .rough-node .label,#mermaid-svg-hM6wQPQaNJHzcLpd .node .label,#mermaid-svg-hM6wQPQaNJHzcLpd .image-shape .label,#mermaid-svg-hM6wQPQaNJHzcLpd .icon-shape .label{text-align:center;}#mermaid-svg-hM6wQPQaNJHzcLpd .node.clickable{cursor:pointer;}#mermaid-svg-hM6wQPQaNJHzcLpd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hM6wQPQaNJHzcLpd .arrowheadPath{fill:#333333;}#mermaid-svg-hM6wQPQaNJHzcLpd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hM6wQPQaNJHzcLpd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hM6wQPQaNJHzcLpd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hM6wQPQaNJHzcLpd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hM6wQPQaNJHzcLpd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hM6wQPQaNJHzcLpd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster text{fill:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd .cluster span{color:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hM6wQPQaNJHzcLpd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hM6wQPQaNJHzcLpd rect.text{fill:none;stroke-width:0;}#mermaid-svg-hM6wQPQaNJHzcLpd .icon-shape,#mermaid-svg-hM6wQPQaNJHzcLpd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hM6wQPQaNJHzcLpd .icon-shape p,#mermaid-svg-hM6wQPQaNJHzcLpd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hM6wQPQaNJHzcLpd .icon-shape .label rect,#mermaid-svg-hM6wQPQaNJHzcLpd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hM6wQPQaNJHzcLpd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hM6wQPQaNJHzcLpd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hM6wQPQaNJHzcLpd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 按需配置Zephyr
禁用不需要的HAL
自定义Manifest
浅克隆策略
本地Manifest扩展
project-filter
path-exclude
精简YAML
分层Manifest
clone-depth
--fetch-opt
local目录
覆盖规则
二、理解West Manifest系统
2.1 Manifest文件结构
Manifest文件是West工具的配置文件,定义了工作区包含的所有仓库:
yaml
# west.yml 基本结构
manifest:
# 远程仓库定义
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
# 项目/仓库列表
projects:
- name: zephyr # 仓库名
url: https://github.com/zephyrproject-rtos/zephyr # 完整URL
path: zephyr # 本地路径
revision: main # 分支/标签/Commit
clone-depth: 1 # 浅克隆深度
2.2 Manifest文件查找顺序
#mermaid-svg-XR9ABAhzdljwwjtW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XR9ABAhzdljwwjtW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XR9ABAhzdljwwjtW .error-icon{fill:#552222;}#mermaid-svg-XR9ABAhzdljwwjtW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XR9ABAhzdljwwjtW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XR9ABAhzdljwwjtW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XR9ABAhzdljwwjtW .marker.cross{stroke:#333333;}#mermaid-svg-XR9ABAhzdljwwjtW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XR9ABAhzdljwwjtW p{margin:0;}#mermaid-svg-XR9ABAhzdljwwjtW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XR9ABAhzdljwwjtW .cluster-label text{fill:#333;}#mermaid-svg-XR9ABAhzdljwwjtW .cluster-label span{color:#333;}#mermaid-svg-XR9ABAhzdljwwjtW .cluster-label span p{background-color:transparent;}#mermaid-svg-XR9ABAhzdljwwjtW .label text,#mermaid-svg-XR9ABAhzdljwwjtW span{fill:#333;color:#333;}#mermaid-svg-XR9ABAhzdljwwjtW .node rect,#mermaid-svg-XR9ABAhzdljwwjtW .node circle,#mermaid-svg-XR9ABAhzdljwwjtW .node ellipse,#mermaid-svg-XR9ABAhzdljwwjtW .node polygon,#mermaid-svg-XR9ABAhzdljwwjtW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XR9ABAhzdljwwjtW .rough-node .label text,#mermaid-svg-XR9ABAhzdljwwjtW .node .label text,#mermaid-svg-XR9ABAhzdljwwjtW .image-shape .label,#mermaid-svg-XR9ABAhzdljwwjtW .icon-shape .label{text-anchor:middle;}#mermaid-svg-XR9ABAhzdljwwjtW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XR9ABAhzdljwwjtW .rough-node .label,#mermaid-svg-XR9ABAhzdljwwjtW .node .label,#mermaid-svg-XR9ABAhzdljwwjtW .image-shape .label,#mermaid-svg-XR9ABAhzdljwwjtW .icon-shape .label{text-align:center;}#mermaid-svg-XR9ABAhzdljwwjtW .node.clickable{cursor:pointer;}#mermaid-svg-XR9ABAhzdljwwjtW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XR9ABAhzdljwwjtW .arrowheadPath{fill:#333333;}#mermaid-svg-XR9ABAhzdljwwjtW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XR9ABAhzdljwwjtW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XR9ABAhzdljwwjtW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XR9ABAhzdljwwjtW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XR9ABAhzdljwwjtW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XR9ABAhzdljwwjtW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XR9ABAhzdljwwjtW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XR9ABAhzdljwwjtW .cluster text{fill:#333;}#mermaid-svg-XR9ABAhzdljwwjtW .cluster span{color:#333;}#mermaid-svg-XR9ABAhzdljwwjtW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XR9ABAhzdljwwjtW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XR9ABAhzdljwwjtW rect.text{fill:none;stroke-width:0;}#mermaid-svg-XR9ABAhzdljwwjtW .icon-shape,#mermaid-svg-XR9ABAhzdljwwjtW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XR9ABAhzdljwwjtW .icon-shape p,#mermaid-svg-XR9ABAhzdljwwjtW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XR9ABAhzdljwwjtW .icon-shape .label rect,#mermaid-svg-XR9ABAhzdljwwjtW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XR9ABAhzdljwwjtW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XR9ABAhzdljwwjtW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XR9ABAhzdljwwjtW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west.yml查找顺序
命令行指定
.west/config
工作区根目录
最高优先级
bash
# 查找顺序(优先级从高到低):
# 1. 命令行指定: west init -m <url>
# 2. .west/config: manifest.file 配置项
# 3. 根目录west.yml: west.yml
2.3 仓库路径结构
~/zephyrproject/
├── .west/
│ ├── config # West配置文件
│ ├── manifest.xml # Manifest缓存
│ └── local/ # 本地Manifest目录
├── zephyr/ # Zephyr核心仓库
│ ├── arch/ # 架构支持
│ ├── boards/ # 板级支持
│ ├── drivers/ # 驱动
│ ├── kernel/ # 内核
│ └── modules/ # 子模块
├── modules/ # 子仓库
│ ├── hal/ # 硬件抽象层
│ │ ├── hal_nordic/
│ │ ├── hal_stm32/
│ │ └── hal_espressif/
│ ├── lib/ # 协议栈库
│ │ ├── mbedtls/
│ │ └── littlefs/
│ └── tee/ # 安全组件
│ └── tf-m/
└── bootloader/ # 引导加载器
└── mcuboot/
三、方法一:使用project-filter禁用模块
3.1 基础用法
这是Zephyr官方推荐的禁用特定模块的方法:
bash
# 禁用单个HAL模块
west config manifest.project-filter -- -hal_stm32
west update
# 禁用多个模块(使用空格分隔)
west config manifest.project-filter -- -hal_stm32 -hal_nxp -hal_espressif
west update
3.2 语法说明
#mermaid-svg-ZZF9ojcnTehbvd4h{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZZF9ojcnTehbvd4h .error-icon{fill:#552222;}#mermaid-svg-ZZF9ojcnTehbvd4h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZZF9ojcnTehbvd4h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZZF9ojcnTehbvd4h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZZF9ojcnTehbvd4h .marker.cross{stroke:#333333;}#mermaid-svg-ZZF9ojcnTehbvd4h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZZF9ojcnTehbvd4h p{margin:0;}#mermaid-svg-ZZF9ojcnTehbvd4h .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster-label text{fill:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster-label span{color:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster-label span p{background-color:transparent;}#mermaid-svg-ZZF9ojcnTehbvd4h .label text,#mermaid-svg-ZZF9ojcnTehbvd4h span{fill:#333;color:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h .node rect,#mermaid-svg-ZZF9ojcnTehbvd4h .node circle,#mermaid-svg-ZZF9ojcnTehbvd4h .node ellipse,#mermaid-svg-ZZF9ojcnTehbvd4h .node polygon,#mermaid-svg-ZZF9ojcnTehbvd4h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZZF9ojcnTehbvd4h .rough-node .label text,#mermaid-svg-ZZF9ojcnTehbvd4h .node .label text,#mermaid-svg-ZZF9ojcnTehbvd4h .image-shape .label,#mermaid-svg-ZZF9ojcnTehbvd4h .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZZF9ojcnTehbvd4h .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZZF9ojcnTehbvd4h .rough-node .label,#mermaid-svg-ZZF9ojcnTehbvd4h .node .label,#mermaid-svg-ZZF9ojcnTehbvd4h .image-shape .label,#mermaid-svg-ZZF9ojcnTehbvd4h .icon-shape .label{text-align:center;}#mermaid-svg-ZZF9ojcnTehbvd4h .node.clickable{cursor:pointer;}#mermaid-svg-ZZF9ojcnTehbvd4h .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZZF9ojcnTehbvd4h .arrowheadPath{fill:#333333;}#mermaid-svg-ZZF9ojcnTehbvd4h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZZF9ojcnTehbvd4h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZZF9ojcnTehbvd4h .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZZF9ojcnTehbvd4h .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZZF9ojcnTehbvd4h .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZZF9ojcnTehbvd4h .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster text{fill:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h .cluster span{color:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZZF9ojcnTehbvd4h .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZZF9ojcnTehbvd4h rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZZF9ojcnTehbvd4h .icon-shape,#mermaid-svg-ZZF9ojcnTehbvd4h .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZZF9ojcnTehbvd4h .icon-shape p,#mermaid-svg-ZZF9ojcnTehbvd4h .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZZF9ojcnTehbvd4h .icon-shape .label rect,#mermaid-svg-ZZF9ojcnTehbvd4h .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZZF9ojcnTehbvd4h .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZZF9ojcnTehbvd4h .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZZF9ojcnTehbvd4h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} manifest.project-filter
操作符
模块名
- 包含
- 排除
hal_xxx
其他模块
| 操作符 | 含义 | 示例 |
|---|---|---|
- |
排除模块 | -hal_stm32 |
+ |
包含模块 | +tflite-micro |
zephyr |
核心仓库 | zephyr |
3.3 禁用HAL模块示例
bash
# 场景:只使用Nordic芯片,禁用其他HAL
# 1. 先禁用所有不需要的HAL
west config manifest.project-filter -- \
-hal_stm32 \
-hal_nxp \
-hal_espressif \
-hal_silabs \
-hal_intel \
-hal_atmel \
-hal_microchip \
-hal_ambiq \
-hal_gigadevice \
-hal_infineon \
-hal_renesas \
-hal_ti \
-hal_bouffalolab \
-hal_wch
# 2. 执行更新
west update
# 3. 验证结果
west list | grep hal_
3.4 只保留特定HAL
bash
# 方法:排除所有,再包含需要的
west config manifest.project-filter -- -hal_FOO +hal_nordic
west update
# 或者直接使用白名单方式
west config manifest.project-filter -- \
-hal_FOO \
zephyr \
cmsis \
hal_nordic
四、方法二:自定义Manifest文件
4.1 创建精简Manifest
适用场景:新项目初始化时,完全控制仓库列表
yaml
# my-minimal.yml - 最小化配置
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
projects:
# 核心仓库(必须)
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
4.2 添加特定HAL
yaml
# my-nordic.yml - Nordic专用配置
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
- name: nordic
url-base: https://github.com/nrfconnect
projects:
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
# Nordic HAL
- name: hal_nordic
url: https://github.com/nrfconnect/sdk-hal_nordic
path: modules/hal/nordic
revision: main
clone-depth: 1
# CMSIS支持
- name: cmsis
url: https://github.com/zephyrproject-rtos/cmsis
path: modules/hal/cmsis
revision: main
clone-depth: 1
4.3 完整示例:STM32开发环境
yaml
# stm32-dev.yml
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
projects:
# Zephyr核心
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
# STM32 HAL(必须)
- name: hal_stm32
url: https://github.com/zephyrproject-rtos/hal_stm32
path: modules/hal/stm32
revision: main
clone-depth: 1
# CMSIS支持
- name: cmsis
url: https://github.com/zephyrproject-rtos/cmsis
path: modules/hal/cmsis
revision: main
clone-depth: 1
# 文件系统支持
- name: littlefs
url: https://github.com/zephyrproject-rtos/littlefs
path: modules/fs/littlefs
revision: main
clone-depth: 1
# 安全库(如需要)
- name: mbedtls
url: https://github.com/zephyrproject-rtos/mbedtls
path: modules/lib/mbedtls
revision: main
clone-depth: 1
4.4 使用自定义Manifest初始化
bash
# 方法1:在线Manifest
west init -m https://your.repo/stm32-dev.yml ~/stm32-project
# 方法2:本地Manifest文件
west init -m ./my-manifest.yml ~/my-project
# 方法3:克隆后再切换Manifest
west init ~/my-project
cd ~/my-project
# 编辑 .west/config 中的 manifest.file 指向新的Manifest
五、方法三:本地Manifest扩展
5.1 本地Manifest目录
West支持在.west/local/目录中添加自定义YAML文件,West会自动合并:
bash
# 创建本地Manifest目录
mkdir -p ~/zephyrproject/.west/local
5.2 添加额外模块
yaml
# .west/local/extra-modules.yml
manifest:
projects:
# 添加Nordic支持
- name: hal_nordic
url: https://github.com/nrfconnect/sdk-hal_nordic
path: modules/hal/nordic
revision: main
clone-depth: 1
# 添加LVGL图形库
- name: lvgl
url: https://github.com/zephyrproject-rtos/lvgl
path: modules/lib/lvgl
revision: main
clone-depth: 1
5.3 West自动合并机制
#mermaid-svg-2Axv2jkCx0lUShH7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2Axv2jkCx0lUShH7 .error-icon{fill:#552222;}#mermaid-svg-2Axv2jkCx0lUShH7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2Axv2jkCx0lUShH7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2Axv2jkCx0lUShH7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2Axv2jkCx0lUShH7 .marker.cross{stroke:#333333;}#mermaid-svg-2Axv2jkCx0lUShH7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2Axv2jkCx0lUShH7 p{margin:0;}#mermaid-svg-2Axv2jkCx0lUShH7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster-label text{fill:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster-label span{color:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster-label span p{background-color:transparent;}#mermaid-svg-2Axv2jkCx0lUShH7 .label text,#mermaid-svg-2Axv2jkCx0lUShH7 span{fill:#333;color:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 .node rect,#mermaid-svg-2Axv2jkCx0lUShH7 .node circle,#mermaid-svg-2Axv2jkCx0lUShH7 .node ellipse,#mermaid-svg-2Axv2jkCx0lUShH7 .node polygon,#mermaid-svg-2Axv2jkCx0lUShH7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2Axv2jkCx0lUShH7 .rough-node .label text,#mermaid-svg-2Axv2jkCx0lUShH7 .node .label text,#mermaid-svg-2Axv2jkCx0lUShH7 .image-shape .label,#mermaid-svg-2Axv2jkCx0lUShH7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2Axv2jkCx0lUShH7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2Axv2jkCx0lUShH7 .rough-node .label,#mermaid-svg-2Axv2jkCx0lUShH7 .node .label,#mermaid-svg-2Axv2jkCx0lUShH7 .image-shape .label,#mermaid-svg-2Axv2jkCx0lUShH7 .icon-shape .label{text-align:center;}#mermaid-svg-2Axv2jkCx0lUShH7 .node.clickable{cursor:pointer;}#mermaid-svg-2Axv2jkCx0lUShH7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2Axv2jkCx0lUShH7 .arrowheadPath{fill:#333333;}#mermaid-svg-2Axv2jkCx0lUShH7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2Axv2jkCx0lUShH7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2Axv2jkCx0lUShH7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2Axv2jkCx0lUShH7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2Axv2jkCx0lUShH7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2Axv2jkCx0lUShH7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster text{fill:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 .cluster span{color:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2Axv2jkCx0lUShH7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2Axv2jkCx0lUShH7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2Axv2jkCx0lUShH7 .icon-shape,#mermaid-svg-2Axv2jkCx0lUShH7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2Axv2jkCx0lUShH7 .icon-shape p,#mermaid-svg-2Axv2jkCx0lUShH7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2Axv2jkCx0lUShH7 .icon-shape .label rect,#mermaid-svg-2Axv2jkCx0lUShH7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2Axv2jkCx0lUShH7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2Axv2jkCx0lUShH7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2Axv2jkCx0lUShH7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Manifest合并过程
读取主Manifest
扫描.local/目录
按文件名排序
依次合并
生成最终列表
west.yml
*.yml文件
项目去重
路径合并
bash
# West会自动合并以下文件:
# 1. west.yml(主Manifest)
# 2. .west/local/*.yml(本地扩展,按字母顺序)
5.4 扩展示例:添加多个模块
yaml
# .west/local/addons.yml
manifest:
projects:
# 仿真测试相关
- name: babblesim_base
url: https://github.com/BabbleSim/base
path: tools/bsim/babblesim_base
revision: main
- name: bsim
url: https://github.com/zephyrproject-rtos/babblesim-manifest
path: tools/bsim
revision: main
# AI相关
- name: tflite-micro
url: https://github.com/zephyrproject-rtos/tflite-micro
path: modules/lib/tflite-micro
revision: main
六、方法四:浅克隆策略
6.1 clone-depth参数
yaml
# 每个项目单独设置浅克隆
manifest:
projects:
- name: zephyr
clone-depth: 1
- name: hal_nordic
clone-depth: 1
- name: mbedtls
clone-depth: 50 # 保留更多历史
6.2 全局设置
bash
# 全局设置浅克隆
west config --global update.clone-depth 1
6.3 Git fetch选项
bash
# 使用深度限制更新
west update --fetch-opt="--depth=1"
# 只获取最新提交
west update --fetch-opt="--filter=blob:none"
# 组合使用
west update --fetch-opt="--depth=1" --fetch-opt="--no-tags"
6.4 浅克隆效果对比
| 项目 | 完整克隆 | 浅克隆(depth=1) | 节省空间 |
|---|---|---|---|
| zephyr | ~500MB | ~100MB | 80% |
| hal_nordic | ~200MB | ~30MB | 85% |
| mbedtls | ~50MB | ~10MB | 80% |
| 总计 | ~750MB | ~140MB | 81% |
七、方法五:path-exclude排除目录
7.1 在Manifest中使用path-exclude
yaml
manifest:
projects:
- name: zephyr
path: zephyr
# 排除不需要的模块
path-exclude:
- modules/hal/st/
- modules/hal/infineon/
- modules/hal/microchip/
- modules/hal/silabs/
- modules/hal/renesas/
- modules/hal/atmel/
7.2 多层级排除
yaml
manifest:
projects:
- name: zephyr
path: zephyr
path-exclude:
# 排除所有不需要的HAL
- modules/hal/*
# 但保留少数需要的
- path: modules/hal/keep_this
file-exclude:
- unnecessary_file.c
八、实用配置模板
8.1 最小化QEMU测试环境
yaml
# minimal-qemu.yml - 仅用于QEMU测试
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
projects:
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
安装命令:
bash
west init -m minimal-qemu.yml ~/zephyr-qemu
cd ~/zephyr-qemu
west update
8.2 Nordic nRF52 BLE开发环境
yaml
# nordic-ble.yml
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
- name: nordic
url-base: https://github.com/nrfconnect
projects:
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
- name: hal_nordic
url: https://github.com/nrfconnect/sdk-hal_nordic
path: modules/hal/nordic
revision: main
clone-depth: 1
- name: cmsis
url: https://github.com/zephyrproject-rtos/cmsis
path: modules/hal/cmsis
revision: main
clone-depth: 1
- name: mcuboot
url: https://github.com/mcu-tools/mcuboot
path: bootloader/mcuboot
revision: main
clone-depth: 1
- name: mbedtls
url: https://github.com/zephyrproject-rtos/mbedtls
path: modules/lib/mbedtls
revision: main
clone-depth: 1
8.3 ESP32 WiFi开发环境
yaml
# esp32-wifi.yml
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
- name: espressif
url-base: https://github.com/espressif
projects:
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
- name: hal_espressif
url: https://github.com/zephyrproject-rtos/hal_espressif
path: modules/hal/espressif
revision: main
clone-depth: 1
- name: mbedtls
url: https://github.com/zephyrproject-rtos/mbedtls
path: modules/lib/mbedtls
revision: main
clone-depth: 1
- name: hostap
url: https://github.com/zephyrproject-rtos/hostap
path: modules/lib/hostap
revision: main
clone-depth: 1
8.4 安全应用开发环境
yaml
# secure-app.yml
manifest:
remotes:
- name: zephyr
url-base: https://github.com/zephyrproject-rtos
projects:
- name: zephyr
url: https://github.com/zephyrproject-rtos/zephyr
path: zephyr
revision: main
clone-depth: 1
- name: mbedtls
url: https://github.com/zephyrproject-rtos/mbedtls
path: modules/lib/mbedtls
revision: main
clone-depth: 1
- name: trusted-firmware-m
url: https://github.com/zephyrproject-rtos/trusted-firmware-m
path: modules/tee/tf-m/trusted-firmware-m
revision: main
clone-depth: 1
- name: tf-psa-crypto
url: https://github.com/zephyrproject-rtos/tf-psa-crypto
path: modules/tee/tf-m/tf-psa-crypto
revision: main
clone-depth: 1
- name: mcuboot
url: https://github.com/mcu-tools/mcuboot
path: bootloader/mcuboot
revision: main
clone-depth: 1
九、管理与维护技巧
9.1 查看当前配置
bash
# 查看West配置
west config --list
# 查看Manifest内容
west manifest --freeze
# 列出所有仓库
west list
# 详细列表
west list -v
9.2 更新策略
#mermaid-svg-rGFTHYOl7TeVvCaq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rGFTHYOl7TeVvCaq .error-icon{fill:#552222;}#mermaid-svg-rGFTHYOl7TeVvCaq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rGFTHYOl7TeVvCaq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rGFTHYOl7TeVvCaq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rGFTHYOl7TeVvCaq .marker.cross{stroke:#333333;}#mermaid-svg-rGFTHYOl7TeVvCaq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rGFTHYOl7TeVvCaq p{margin:0;}#mermaid-svg-rGFTHYOl7TeVvCaq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster-label text{fill:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster-label span{color:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster-label span p{background-color:transparent;}#mermaid-svg-rGFTHYOl7TeVvCaq .label text,#mermaid-svg-rGFTHYOl7TeVvCaq span{fill:#333;color:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq .node rect,#mermaid-svg-rGFTHYOl7TeVvCaq .node circle,#mermaid-svg-rGFTHYOl7TeVvCaq .node ellipse,#mermaid-svg-rGFTHYOl7TeVvCaq .node polygon,#mermaid-svg-rGFTHYOl7TeVvCaq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rGFTHYOl7TeVvCaq .rough-node .label text,#mermaid-svg-rGFTHYOl7TeVvCaq .node .label text,#mermaid-svg-rGFTHYOl7TeVvCaq .image-shape .label,#mermaid-svg-rGFTHYOl7TeVvCaq .icon-shape .label{text-anchor:middle;}#mermaid-svg-rGFTHYOl7TeVvCaq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rGFTHYOl7TeVvCaq .rough-node .label,#mermaid-svg-rGFTHYOl7TeVvCaq .node .label,#mermaid-svg-rGFTHYOl7TeVvCaq .image-shape .label,#mermaid-svg-rGFTHYOl7TeVvCaq .icon-shape .label{text-align:center;}#mermaid-svg-rGFTHYOl7TeVvCaq .node.clickable{cursor:pointer;}#mermaid-svg-rGFTHYOl7TeVvCaq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rGFTHYOl7TeVvCaq .arrowheadPath{fill:#333333;}#mermaid-svg-rGFTHYOl7TeVvCaq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rGFTHYOl7TeVvCaq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rGFTHYOl7TeVvCaq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rGFTHYOl7TeVvCaq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rGFTHYOl7TeVvCaq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rGFTHYOl7TeVvCaq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster text{fill:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq .cluster span{color:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rGFTHYOl7TeVvCaq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rGFTHYOl7TeVvCaq rect.text{fill:none;stroke-width:0;}#mermaid-svg-rGFTHYOl7TeVvCaq .icon-shape,#mermaid-svg-rGFTHYOl7TeVvCaq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rGFTHYOl7TeVvCaq .icon-shape p,#mermaid-svg-rGFTHYOl7TeVvCaq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rGFTHYOl7TeVvCaq .icon-shape .label rect,#mermaid-svg-rGFTHYOl7TeVvCaq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rGFTHYOl7TeVvCaq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rGFTHYOl7TeVvCaq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rGFTHYOl7TeVvCaq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west update
需要更新什么?
所有仓库
特定仓库
强制更新
west update
west update
west update --force
| 命令 | 用途 |
|---|---|
west update |
更新所有仓库 |
west update hal_nordic |
只更新指定仓库 |
west update --force |
强制重新克隆 |
west update --fetch-opt="--depth=1" |
浅更新 |
9.3 清理和优化
bash
# 查看工作区大小
du -sh ~/zephyrproject/*
# Git垃圾回收
cd ~/zephyrproject/zephyr
git gc --aggressive --prune=now
# 删除不需要的仓库后更新
rm -rf modules/hal/renesas
west update
9.4 版本锁定
bash
# 锁定到特定版本
west init -m https://github.com/zephyrproject-rtos/zephyr \
--mr v3.5.0 ~/my-project
# 或在Manifest中指定
manifest:
projects:
- name: zephyr
revision: v3.5.0
十、常见问题与解决
10.1 禁用模块后编译失败
问题 :ERROR: Module 'hal_stm32' not found
解决:确认需要的HAL模块未被禁用
bash
# 检查禁用的模块
west config manifest.project-filter
# 如需启用
west config manifest.project-filter -- +hal_stm32
west update
10.2 Manifest合并冲突
问题:多个本地Manifest定义了相同的项目
解决:West按文件名顺序合并,后面的会覆盖前面的
bash
# 使用明确的前缀控制顺序
mv .west/local/extra.yml .west/local/00-extra.yml
10.3 子模块未初始化
问题 :west update后某些目录为空
解决:重新初始化子模块
bash
cd ~/zephyrproject/zephyr
git submodule sync
git submodule update --init --recursive
10.4 磁盘空间不足
解决:组合使用多种优化方法
bash
# 1. 使用浅克隆
west config --global update.clone-depth 1
# 2. 禁用不需要的HAL
west config manifest.project-filter -- \
-hal_stm32 -hal_nxp -hal_espressif
# 3. 执行更新
west update
# 4. 清理Git对象
cd ~/zephyrproject/zephyr
git gc --aggressive --prune=now
十一、最佳实践总结
11.1 配置策略推荐
| 场景 | 推荐策略 |
|---|---|
| 学习/测试 | 最小化配置 + QEMU |
| 单芯片开发 | 自定义Manifest + 指定HAL |
| 多芯片开发 | 禁用不需要的HAL |
| CI/CD环境 | 自定义Manifest + 版本锁定 |
| 资源受限环境 | 浅克隆 + 最小化配置 |
11.2 决策流程图
#mermaid-svg-CxLZ03KV8MTZcuOC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CxLZ03KV8MTZcuOC .error-icon{fill:#552222;}#mermaid-svg-CxLZ03KV8MTZcuOC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CxLZ03KV8MTZcuOC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CxLZ03KV8MTZcuOC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CxLZ03KV8MTZcuOC .marker.cross{stroke:#333333;}#mermaid-svg-CxLZ03KV8MTZcuOC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CxLZ03KV8MTZcuOC p{margin:0;}#mermaid-svg-CxLZ03KV8MTZcuOC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster-label text{fill:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster-label span{color:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster-label span p{background-color:transparent;}#mermaid-svg-CxLZ03KV8MTZcuOC .label text,#mermaid-svg-CxLZ03KV8MTZcuOC span{fill:#333;color:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC .node rect,#mermaid-svg-CxLZ03KV8MTZcuOC .node circle,#mermaid-svg-CxLZ03KV8MTZcuOC .node ellipse,#mermaid-svg-CxLZ03KV8MTZcuOC .node polygon,#mermaid-svg-CxLZ03KV8MTZcuOC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CxLZ03KV8MTZcuOC .rough-node .label text,#mermaid-svg-CxLZ03KV8MTZcuOC .node .label text,#mermaid-svg-CxLZ03KV8MTZcuOC .image-shape .label,#mermaid-svg-CxLZ03KV8MTZcuOC .icon-shape .label{text-anchor:middle;}#mermaid-svg-CxLZ03KV8MTZcuOC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CxLZ03KV8MTZcuOC .rough-node .label,#mermaid-svg-CxLZ03KV8MTZcuOC .node .label,#mermaid-svg-CxLZ03KV8MTZcuOC .image-shape .label,#mermaid-svg-CxLZ03KV8MTZcuOC .icon-shape .label{text-align:center;}#mermaid-svg-CxLZ03KV8MTZcuOC .node.clickable{cursor:pointer;}#mermaid-svg-CxLZ03KV8MTZcuOC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CxLZ03KV8MTZcuOC .arrowheadPath{fill:#333333;}#mermaid-svg-CxLZ03KV8MTZcuOC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CxLZ03KV8MTZcuOC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CxLZ03KV8MTZcuOC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CxLZ03KV8MTZcuOC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CxLZ03KV8MTZcuOC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CxLZ03KV8MTZcuOC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster text{fill:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC .cluster span{color:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CxLZ03KV8MTZcuOC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CxLZ03KV8MTZcuOC rect.text{fill:none;stroke-width:0;}#mermaid-svg-CxLZ03KV8MTZcuOC .icon-shape,#mermaid-svg-CxLZ03KV8MTZcuOC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CxLZ03KV8MTZcuOC .icon-shape p,#mermaid-svg-CxLZ03KV8MTZcuOC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CxLZ03KV8MTZcuOC .icon-shape .label rect,#mermaid-svg-CxLZ03KV8MTZcuOC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CxLZ03KV8MTZcuOC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CxLZ03KV8MTZcuOC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CxLZ03KV8MTZcuOC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始
使用场景
学习测试
单芯片开发
多芯片开发
资源受限
minimal配置
自定义Manifest
project-filter
浅克隆+最小化
完成配置
11.3 一键配置脚本
bash
#!/bin/bash
# setup-zephyr.sh
set -e
PROJECT_DIR=${1:-~/zephyr}
MANIFEST_URL=${2:-https://github.com/zephyrproject-rtos/zephyr}
REVISION=${3:-main}
echo "Setting up Zephyr project..."
echo " Project dir: $PROJECT_DIR"
echo " Manifest: $MANIFEST_URL"
echo " Revision: $REVISION"
# 初始化
west init -m $MANIFEST_URL --mr $REVISION $PROJECT_DIR
cd $PROJECT_DIR
# 使用浅克隆
west config --global update.clone-depth 1
# 更新
west update
echo "Done! Total size:"
du -sh $PROJECT_DIR
结束语
通过本文的介绍,相信您已经掌握了Zephyr项目按需配置的多种方法:
| 方法 | 适用场景 | 难度 |
|---|---|---|
| project-filter | 禁用特定模块 | 简单 |
| 自定义Manifest | 新项目初始化 | 中等 |
| 本地Manifest扩展 | 添加额外模块 | 简单 |
| 浅克隆 | 节省空间 | 简单 |
| path-exclude | 排除子目录 | 中等 |
合理的按需配置可以带来以下收益:
| 收益 | 效果 |
|---|---|
| 磁盘空间 | 节省60-80% |
| 下载时间 | 节省70-90% |
| 更新速度 | 提升3-5倍 |
| 版本可控性 | 完全版本锁定 |
建议根据实际开发需求,选择最合适的配置策略,并在实践中不断优化。
参考资料: