ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Matter SDK 无交互环境构建实战:使用 Podman 与 chip-build-vscode 镜像编译跨平台示例应用

2026/9/16 18:13:30 拓冰建站 浏览量
Matter SDK 无交互环境构建实战:使用 Podman 与 chip-build-vscode 镜像编译跨平台示例应用 Matter SDK 无交互环境构建实战使用 Podman 与 chip-build-vscode 镜像编译跨平台示例应用【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本篇技术指南围绕 connectedhomeipMatter SDK仓库中的 podman-vscode-build 技能文档展开系统讲解如何通过 Podman 以无交互non-interactive方式启动官方ghcr.io/project-chip/chip-build-vscode开发容器完成 Linux ARM64、ESP32、EFR32、nRF Connect、Telink 等多个平台的示例应用编译。读者学完后将掌握宿主存储配置、镜像 Tag 定位、容器生命周期管理、Pigweed 环境激活以及各类嵌入式/交叉编译目标的具体构建命令与产物路径可直接复用于 CI Agent 或本地脚本化构建场景。一、为什么选择 Podman VSCode 构建镜像Matter SDK 的交叉编译依赖大量平台专属工具链ESP-IDF、Zephyr SDK、GNU ARM 工具链等在裸机上逐一配置成本极高。官方提供了一系列chip-build-*预置镜像其中chip-build-vscode是一个聚合镜像aggregator它通过约 28 条COPY --from指令从其他 17 个平台镜像中抽取工具链合并而成体积约 56GB。正因如此该镜像无法在普通 CI Runner 上构建需要维护者在有足够磁盘空间约 88GB 空闲的机器上手工刷新cd integrations/docker/images/vscode/chip-build-vscode ./build.sh --latest --push这一事实可以从 .github/workflows/docker_img.yaml 的注释中得到确认。该镜像目前被 integrations/cloudbuild 下的云端构建步骤直接使用维护者也常以其作为一个镜像覆盖所有平台的本地开发替代方案。使用 Podman 而非 Docker 的关键优势在于Podman 默认以 rootless无 root模式运行容器内生成的文件不会以宿主 root 身份落盘从而规避了跨平台构建中常见的文件属主错乱问题。二、前置条件与宿主存储配置启动 Podman 之前必须先配置存储后端否则 rootless 用户命名空间中 UID/GID 数量不足时会报命名空间或用户上限类错误。在$HOME/.config/containers/storage.conf中新建或补充如下配置[storage] driver overlay [storage.options] ignore_chown_errors truedriver overlay使用 overlayfs 作为存储驱动ignore_chown_errors true忽略用户命名空间下无法完成 chown 导致的错误这是 rootless 场景下 overlay 驱动稳定运行的关键开关。系统重置与验证如果你此前在未配置该选项的情况下使用过 Podman可能需要重置存储。[!CAUTION] 执行podman system reset将删除所有已存在的 Podman 容器、镜像和卷请务必确认无重要数据后再操作。重置 Podmanpodman system reset验证存储驱动已切换为overlay而非vfspodman info | grep graphDriverName预期输出应包含graphDriverName: overlay。三、定位 chip-build-vscode 镜像 Tagghcr.io/project-chip/chip-build-vscode的 Tag 会随依赖更新而变动正确做法是以 CI 当前使用的版本为准而不是臆测固定值检查.github/workflows/下的 workflow 文件如tests.yaml、build.yaml或检查 integrations/cloudbuild 下的 cloudbuild 配置如chef.yaml、examples.yaml、smoke-test.yaml搜索ghcr.io/project-chip/chip-build-vscode:TAG形式的镜像引用即可确定当前 Tag。以本仓库现状为例integrations/cloudbuild/chef.yaml 中使用的即为ghcr.io/project-chip/chip-build-vscode:211211即当前 CI 引用的版本号。四、启动后台持久化容器使用如下命令在后台启动一个常驻的 vscode 容器podman run -dt --cap-addSYS_PTRACE --name bld_vscode \ --volume /path/to/connectedhomeip:/workspace \ ghcr.io/project-chip/chip-build-vscode:TAG \ /bin/sh参数说明参数含义-d后台detached运行容器-t分配伪终端配合-d使容器保持存活--cap-addSYS_PTRACE授予进程跟踪能力构建/调试工具链需要--name bld_vscode容器命名后续podman exec直接按名引用--volume /path/to/connectedhomeip:/workspace将本地 Matter 仓库根目录挂载为容器内/workspace/bin/sh容器入口保持 shell 空闲以持久运行其中/path/to/connectedhomeip需替换为本地仓库的绝对路径TAG替换为第二步定位到的版本号。五、无交互命令执行激活构建环境是硬性要求Agent 运行在无交互环境中严禁使用-it等交互式标志例如podman exec -it ...应直接执行命令或写成脚本。为什么必须手动激活环境podman exec不会加载登录 shell 的初始化脚本因此 Pigweed 构建环境默认未激活。编译之前必须先 source 环境激活脚本bootstrap容器内首次搭建或依赖包/子模块发生变更时使用scripts/bootstrap.shactivate后续每次构建使用scripts/activate.sh。这两条命令应在同一个子 shell中通过bash -c串联执行例如podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target target build其中-w /workspace指定工作目录为挂载的仓库根。构建入口 scripts/build/build_examples.py 是 Matter SDK 的通用示例构建脚本负责 GN 生成与 ninja 编译的全过程。从 scripts/bootstrap.sh 源码可以看出bootstrap 与 activate 共用_bootstrap_or_active逻辑当.environment/activate.sh尚未生成时执行pw_bootstrap完成全量环境搭建否则走轻量的pw_activate路径这也是两者首次用 bootstrap、之后用 activate的底层依据。按平台指定 bootstrap 参数默认情况下容器内运行bootstrap.sh只安装 host 与 Zephyr 构建所需 Python 依赖。要为其他特定嵌入式平台构建需要额外下载/配置 pip 依赖需通过-p参数传入平台名podman exec -w /workspace bld_vscode bash -c source scripts/bootstrap.sh -p esp32,nrfconnect,silabs,telink支持的平台标识符包括esp32、nrfconnect、silabs、telink、bouffalolab、mbed、ti、zephyr。该机制在源码中同样可验证bootstrap.sh的_install_additional_pip_requirements函数会按逗号分隔的-p/--platform列表逐一安装scripts/setup/requirements.platform.txt中的依赖见 scripts/bootstrap.sh。仓库中实际存在的平台依赖清单如requirements.esp32.txt、requirements.nrfconnect.txt、requirements.telink.txt等与文档列出的标识符完全对应。ESP32 的额外配置构建 ESP32 平台时容器内的 ESP-IDF 工具链 Python 依赖还须显式安装。完成 bootstrap 后在容器内执行podman exec -w /workspace bld_vscode bash -c /opt/espressif/esp-idf/install.shNordic nRF Connect 的额外配置编译 Nordic nRF Connect 目标前须先同步更新预装的 SDK 文件。先丢弃本地模板改动再在容器内运行更新脚本podman exec -w /workspace bld_vscode git -C /opt/NordicSemiconductor/nrfconnect/zephyr checkout -- zephyr-env.sh podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh python3 scripts/setup/nrfconnect/update_ncs.py --update --shallow第一条命令恢复zephyr-env.sh的原始状态避免本地修改影响后续更新第二条命令通过 scripts/setup/nrfconnect/update_ncs.py 以浅克隆--shallow方式拉取并更新 nRF Connect SDK。六、典型平台构建示例与产物目录利用官方 vscode 镜像预置全部工具链与编译器的特性可以显著简化嵌入式与交叉编译目标的构建。以下以all-devices-app见 examples/all-devices-app与all-clusters-app见 examples/all-clusters-app为例汇总各平台的目标名、构建命令与产物路径。A. Linux ARM64如 Raspberry Pi目标linux-arm64-all-devices-boringssl-no-ble-clang构建命令podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target linux-arm64-all-devices-boringssl-no-ble-clang build产物checkout_root/out/linux-arm64-all-devices-boringssl-no-ble-clang/all-devices-app目标名中的boringssl表示使用 BoringSSL 加密后端no-ble关闭 BLEclang指定 Clang 编译器可显著缩小 ARM64 平台的依赖面。B. ESP32devkitc目标esp32-devkitc-all-devices构建命令podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target esp32-devkitc-all-devices build产物checkout_root/out/esp32-devkitc-all-devices/all-devices-app.elf与all-devices-app.bin.elf供调试器如 OpenOCD/GDB使用.bin为可烧录固件。C. Silicon Labs EFR32brd4187c目标efr32-brd4187c-all-devices构建命令podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target efr32-brd4187c-all-devices build产物checkout_root/out/efr32-brd4187c-all-devices/matter-silabs-all-devices-example.out以及.hex/.s37格式镜像D. Nordic nRF Connectnrf52840dk注意使用 Zephyr SDK 工具链构建时必须显式设置ZEPHYR_TOOLCHAIN_VARIANTzephyr。目标nrf-nrf52840dk-all-clusters构建命令podman exec -w /workspace bld_vscode bash -c export ZEPHYR_TOOLCHAIN_VARIANTzephyr source scripts/activate.sh ./scripts/build/build_examples.py --target nrf-nrf52840dk-all-clusters build产物checkout_root/out/nrf-nrf52840dk-all-clusters/merged.hex包含 bootloader 与应用的整体镜像和zephyr/zephyr.elfE. Telinktlsr9518adk80d目标telink-tlsr9518adk80d-all-devices构建命令podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target telink-tlsr9518adk80d-all-devices build产物checkout_root/out/telink-tlsr9518adk80d-all-devices/zephyr/zephyr.bin七、直接访问构建产物由于仓库根目录以卷方式挂载--volume /path/to/connectedhomeip:/workspace容器内写入/workspace/out/的构建输出会即时同步到宿主文件系统的checkout_root/out/无需使用podman cp拷贝二进制。可以直接在宿主仓库目录中访问或运行构建产物cp out/target/binary_name /path/to/destination例如将 Linux ARM64 的示例程序复制到目标设备cp out/linux-arm64-all-devices-boringssl-no-ble-clang/all-devices-app ~/bin/这一设计使整个工作流保持构建在容器、产物在宿主的整洁边界容器负责隔离工具链与依赖宿主直接获得可分发、可烧录的固件文件非常适合与 CI 流水线或脚本化发布流程集成。八、完整工作流小结将上述步骤串起来一次完整的 Podman 构建流程为配置宿主写入$HOME/.config/containers/storage.confoverlay 驱动 ignore_chown_errors必要时podman system reset并验证graphDriverName定位 Tag从 integrations/cloudbuild/chef.yaml 等 CI 配置中确认chip-build-vscode:211启动容器podman run -dt --cap-addSYS_PTRACE --name bld_vscode --volume repo:/workspace ghcr.io/project-chip/chip-build-vscode:TAG /bin/sh首次环境搭建source scripts/bootstrap.sh -p 平台列表首次或依赖变更时并按平台执行 ESP-IDFinstall.sh或 nRF Connectupdate_ncs.py编译podman exec -w /workspace bld_vscode bash -c source scripts/activate.sh ./scripts/build/build_examples.py --target 目标 build取产物直接从宿主checkout_root/out/target/获取固件或可执行文件。通过这套方案无论是本地的 Agent 自动化任务还是远程无交互 CI 环境都能以一致、可复现的方式完成 Matter 多平台示例的构建与验证。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考