其他 Zephyr 扩展命令
本页介绍其他 Zephyr 扩展。
列出开发板:west boards
boards 命令可列出 Zephyr 支持的开发板,无需查阅其他信息源。
输入以下命令即可运行:
west boards
此命令按默认格式列出所有受支持的开发板。如果希望自行指定显示格式,可以使用 --format (或 -f)选项:
west boards -f "{arch}:{name}"
运行以下命令可获取格式选项的更多帮助:
west boards -h
Shell 补全脚本:west completion
completion 扩展命令输出 shell 补全脚本,可直接用来为支持的 shell 启用补全。
目前支持以下 shell:
bash
zsh
fish
powershell(仅支持开发板限定符)
更多说明可查看命令帮助:
west help completion
安装 CMake 包:west zephyr-export
此命令将当前 Zephyr 安装注册为 CMake 用户包注册表中的 CMake 配置包。
在 Windows 上,CMake 用户包注册表位于 HKEY_CURRENT_USER\Software\Kitware\CMake\Packages。
在 Linux 和 macOS 上,CMake 用户包注册表位于 ~/.cmake/packages。
设置 Zephyr 工作区时可以运行此命令。之后,位于工作区之外的应用程序 CMakeLists.txt 文件就能通过以下方式找到 Zephyr 仓库:
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
软件物料清单:west spdx
此命令为 Zephyr 构建生成一组 SPDX 文档,作为软件物料清单(SBOM)。它记录参与构建的源文件、这些文件产生的构建产物,以及它们之间的关系。源文件中的 SPDX-License-Identifier 注释会被扫描并填入文档,同时记录文件哈希及尽可能提取的版权声明。
选择 SPDX 版本
west spdx 可以输出两个主要 SPDX 规范系列中的任意一种。默认使用 SPDX 2.3;可通过 --spdx-version 选项选择其他版本。
SPDX 2.3 是 2.2 的超集,增加了 PrimaryPackagePurpose 等字段。需要兼容尚不支持 SPDX 3 的工具时,选择 SPDX 2.x;需要 Build 配置规范(SPDX 3.0) 中介绍的更丰富、机器可读的构建来源信息时,选择 SPDX 3.0 或更高版本。
备注
SPDX 3.1 支持属于实验性质,因为 SPDX 3.1 规范仍在制定中。
生成 SPDX 文档
在项目中启用
CONFIG_BUILD_OUTPUT_META,让构建记录west spdx所需的信息。构建应用程序:
west build -d BUILD_DIR [...]
使用此构建目录生成 SPDX 文档:
west spdx -d BUILD_DIR
默认生成 SPDX 2.3 标签-值格式文档。若需生成 SPDX 2.2 或 3.0 文档,传入
--spdx-version:west spdx -d BUILD_DIR --spdx-version 3.0
备注
使用 Sysbuild (System build) 构建时,务必以需要生成 SBOM 的实际应用程序为目标。例如,应用名为 hello_world 时:
west build --sysbuild -d BUILD_DIR
west spdx -d BUILD_DIR/hello_world
输出文档
文档写入 BUILD_DIR/spdx/ (可通过 -s 覆盖)。无论 SPDX 版本如何,生成的物料清单(BOM)文档集合相同;只有文件扩展名不同:SPDX 2.x 标签-值格式使用 .spdx,SPDX 3.0 JSON-LD 格式使用 .jsonld:
app:构建所用应用程序源文件的 BOMzephyr:构建实际使用的 Zephyr 源代码文件的 BOMbuild:构建输出文件的 BOMmodules-deps:模块依赖项的 BOM。更多详情参见 模块。
对于 SPDX 3.0,每份文档都声明符合 Core、Software 和 Simple Licensing 配置规范,build.jsonld 还声明符合用于记录产物生成方式的 Build 配置规范。
物料清单中的每个文件都会被扫描,以记录其哈希值(SHA256、SHA1 和 MD5);如果文件中存在 SPDX-License-Identifier 注释,也会记录检测到的许可证。
版权声明通过 REUSE 团体提供的第三方 reuse 工具提取。找到的声明会以 FileCopyrightText 字段(SPDX 2.x)或版权属性(SPDX 3.0)形式加入 SPDX 文档。
备注
版权提取采用启发式方法,可能无法捕获完整声明文本,因此 FileCopyrightText 内容仅尽力提供。这符合 SPDX 规范的建议。
关系
SPDX 关系用于表示 CMake 构建目标之间的依赖、相互链接的构建目标,以及经编译生成库文件的源文件之间的关系。
两个规范系列采用不同方式表示构建来源:
在 SPDX 2.x 中,每个生成产物都有文件级
GENERATED_FROM关系,指向编译它所用的源文件(使用--analyze-includes时还包括头文件)。在 SPDX 3.0 中,来源信息改由 Build 配置规范 承载,使用作用域为
build生命周期的hasInput/hasOutput/usesTool关系。
Build 配置规范(SPDX 3.0)
生成 SPDX 3.0 文档时,west spdx 会填充 SPDX 3.0 Build profile,使 SBOM 不仅记录构建了 什么,也记录 如何 构建。这些信息自动从 CMake file-API 收集,并保存在 build.jsonld 中。
此配置规范添加一个 build_Build 元素,描述整体构建:构建类型、CMake 生成器和构建配置,以及 BOARD、ARCH 等选定的环境变量。工具链(CMake、编译器、汇编器、链接器和归档器)记录为 Tool 元素,每个元素包含路径和版本。构建作用域的关系再将构建与其输入(源代码包和参与编译的文件)、输出(最终镜像)及所用工具关联起来。
每个中间目标(例如静态库)也有独立子构建,记录生成该产物的确切源文件、工具和编译选项,因此任意输出都可追溯其构建方式。
命令行选项
west spdx 接受以下附加选项:
-i、--init:在构建目录配置之前,创建 CMake 基于文件的 API 查询。此选项已弃用,将在 Zephyr 5.0 中移除:启用CONFIG_BUILD_OUTPUT_META的构建现在会自行请求该查询。-n PREFIX:生成的 SPDX 文档中使用的文档命名空间前缀。详情见 SPDX specification clause 6。如果省略-n,则使用随机 UUID,按第 2.5 节所述的默认格式生成默认命名空间。-s SPDX_DIR:指定写入 SPDX 文档的替代目录,而不是BUILD_DIR/spdx/。--spdx-version {2.2,2.3,3.0,3.1}:指定使用的 SPDX 规范版本,默认为2.3。各版本差异见 选择 SPDX 版本。--analyze-includes:除在物料清单中记录参与编译的源代码文件(如.c、.S)外,还尝试确定每个.c文件具体包含了哪些头文件。此操作耗时更长,因为它会针对每个
.c文件,使用实际构建时传给 C 编译器的同一组参数执行一次试运行。--include-sdk:配合--analyze-includes使用时,还会创建第四份 SPDX 文档sdk.spdx(或sdk.jsonld),列出从 SDK 引入的头文件。
警告
目前不支持为 native_sim 平台生成 SBOM 文档。
操作二进制 blob:west blobs
blobs 命令可操作一个或多个 模块 通过 module.yml 文件声明的 二进制 blob。
blobs 命令包含三个子命令,分别用于列出、获取或清理(即删除)二进制 blob 文件。
可以在列出二进制 blob 时指定输出格式:
west blobs list -f '{module}: {type} {path}'
运行 west blobs -h 可查看 -f/--format 中可用的全部变量。
获取 blob 的方式类似:
west blobs fetch
请注意,如 模块章节 所述,获取的 blob 保存在相应模块仓库根目录下的 zephyr/blobs/ 文件夹中。
删除方式也类似:
west blobs clean
此外,还可以将模块名称作为命令行参数传入,指定要列出、获取或清理哪些模块的 blob。
可以向 west blobs fetch 传入 --allow-regex 参数,通过正则表达式限制获取的具体 blob:
# For example, only download esp32 blobs, skip the other variants
west blobs fetch hal_espressif --allow-regex 'lib/esp32/.*'
可以通过 --auto-cache 命令行参数或 blobs.auto-cache 配置选项指定自动缓存目录。启用后,每当某个 blob 缺失并被下载时,自动缓存目录都会填入该文件。
可以通过 --cache-dirs 命令行参数或 blobs.cache-dirs 配置选项指定一个或多个附加缓存目录,以 ; 分隔。
west blobs fetch 会在全部已配置的缓存目录(包括自动缓存)中搜索匹配的 blob 文件名。缓存文件可以使用原始文件名,也可以带有 SHA-256 后缀(<filename>.<sha>)。如果找到,则将 blob 从缓存复制到目标 blob 路径;否则,从其 URL 下载到该路径。
Twister 包装命令:west twister
此命令是 twister 的包装。
随后可通过 west 调用 Twister:
west twister -help
west twister -T tests/ztest/base
操作二进制描述符:west bindesc
bindesc 命令允许读取可执行文件的 二进制描述符。目前支持将 .bin、.hex、.elf 和 .uf2 文件作为输入。
可以搜索镜像中的特定描述符,例如:
west bindesc search KERNEL_VERSION_STRING build/zephyr/zephyr.bin
可以按类型和 ID 搜索自定义描述符,例如:
west bindesc custom_search STR 0x200 build/zephyr/zephyr.bin
可以使用以下命令转储镜像中的全部描述符:
west bindesc dump build/zephyr/zephyr.bin
可以使用以下命令将镜像的描述符数据区域提取到文件:
west bindesc extract
可以使用以下命令列出所有已知的标准描述符名称:
west bindesc list
可以使用以下命令打印描述符在镜像中的偏移:
west bindesc get_offset
操作补丁:west patch
patch 命令允许以受控方式向 Zephyr 或 Zephyr 模块应用补丁,让使用 T2 星形拓扑 的外部应用更容易实现自动化和跟踪。patches.yml 文件保存补丁文件的元数据,弥补 Zephyr 官方版本之间的空缺,让用户能方便地查看各项上游贡献的状态,并确定升级到下一 Zephyr 版本前应移除哪些补丁。
以下子命令可用于管理工作区中 Zephyr 或其他模块的补丁:
apply:应用patches.yml中列出的补丁reverse:反向应用patches.yml中此前已应用的补丁clean:移除所有已应用补丁,并重置到清单指定的检出状态list:列出patches.yml中的全部补丁gh-fetch:从 GitHub 拉取请求获取补丁
west-workspace/
└── application/
...
├── west.yml
└── zephyr
├── module.yml
├── patches
│ ├── bootloader
│ │ └── mcuboot
│ │ └── my-tweak-for-mcuboot.patch
│ └── zephyr
│ └── my-zephyr-change.patch
└── patches.yml
在此示例中,west 清单 文件 west.yml 固定到特定 Zephyr 修订版本(例如 v4.1.0),并针对该版本以及应用使用的其他模块的具体版本应用补丁。不过,此应用需要两项改动才能满足需求:一项针对 Zephyr,另一项针对 MCUBoot。
patches:
- path: zephyr/my-zephyr-change.patch
sha256sum: c676cd376a4d19dc95ac4e44e179c253853d422b758688a583bb55c3c9137035
module: zephyr
author: Obi-Wan Kenobi
email: obiwan@jedi.org
date: 2025-05-04
upstreamable: false
comments: |
An application-specific change we need for Zephyr.
- path: bootloader/mcuboot/my-tweak-for-mcuboot.patch
sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
module: mcuboot
author: Darth Sidious
email: sidious@sith.org
date: 2025-05-04
merge-pr: https://github.com/zephyrproject-rtos/zephyr/pull/<pr-number>
issue: https://github.com/zephyrproject-rtos/zephyr/issues/<issue-number>
merge-status: true
merge-commit: 1234567890abcdef1234567890abcdef12345678
merge-date: 2025-05-06
apply-command: git apply
comments: |
A change to mcuboot that has been merged already. We can remove this
patch when we are ready to upgrade to the next Zephyr release.
补丁可以方便地自动应用。例如:
west init -m <manifest repo> <workspace>
cd <workspace>
west update
west patch apply
需要升级到更新的 Zephyr 版本时,可以修改 west.yml,使其指向下一版本,例如 v4.2.0。不再需要的补丁(如上例中的 my-tweak-for-mcuboot.patch)可从 patches.yml 和外部应用仓库中移除,然后运行以下命令。
west patch clean
west update
west patch apply --roll-back # roll-back all patches if one does not apply cleanly
也可以选择反向应用补丁,而不是清理所有模块。这样会保留模块中不冲突且无关的修改,只移除补丁产生的改动。在开发补丁并在应用中测试时,如果不希望清理所有补丁而丢失对模块所做的手动修改,这种方式很有用。
west patch reverse
如果需要重做补丁,记得用新的 SHA256 校验和更新 patches.yml。
sha256sum zephyr/patches/zephyr/my-zephyr-change.patch
7d57ca78d5214f422172cc47fed9d0faa6d97a0796c02485bff0bf29455765e9
也可以使用 west patch gh-fetch 从 GitHub 拉取请求获取补丁,并自动创建或更新 patches.yml 文件。当作者已有多项改动包含在现有上游拉取请求中时,这很有用。
west patch gh-fetch --owner zephyrproject-rtos --repo zephyr --pull-request <pr-number> \
--module zephyr --split-commits
上述命令会创建下列目录和文件结构,其中包含指定拉取请求中每个提交对应的补丁。
zephyr
├── patches
│ ├── first-commit-from-pr.patch
│ ├── second-commit-from-pr.patch
│ └── third-commit-from-pr.patch
└── patches.yml
操作 Zephyr SDK:west sdk
west sdk 是 Zephyr 专用的 west 命令,用于列出和安装 Zephyr SDK 及其工具链。
列出 SDK 和工具链
要列出已安装的 Zephyr SDK,以及可用的 SDK 版本和工具链,运行:
west sdk list
此命令显示:
已安装的 SDK 版本
可用的 SDK 发行版本
各 SDK 包含的工具链
安装 Zephyr SDK
要安装 Zephyr SDK,运行:
west sdk install
此命令可能以交互模式运行,提示选择 SDK 或工具链。通过 --toolchains 指定具体工具链时,命令采用非交互模式,适合自动化使用。
若只安装指定工具链,使用 --toolchains 选项:
west sdk install --toolchains arm-zephyr-eabi riscv64-zephyr-elf
如果不确定需要哪些工具链,先运行 west sdk list 查看可用选项,避免下载不需要的工具链,从而节省数 GB 磁盘空间和下载时间。