mirror of
https://github.com/liquidraver/ZephCore.git
synced 2026-10-14 07:07:20 +00:00
Preconfigured VS Code dev container with the Zephyr SDK, toolchains, west and vendor blobs matched to CI, so a build can be reproduced without installing prerequisites on the host. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
109 lines
4.3 KiB
Docker
109 lines
4.3 KiB
Docker
# ZephCore development container.
|
|
#
|
|
# Mirrors what .github/workflows/build.yml installs on the CI runner, so a build
|
|
# in here matches a build in CI: Zephyr SDK 1.0.1, the same four toolchains, the
|
|
# same Python version, and the arm/aarch64 Linux cross compilers that the
|
|
# native_sim SBC presets need.
|
|
#
|
|
# Ubuntu 24.04 is used because it ships Python 3.12 (CI's python_version) and
|
|
# CMake 3.28 (Zephyr 4.4 needs >= 3.20.5).
|
|
ARG BASE_VARIANT=ubuntu-24.04
|
|
FROM mcr.microsoft.com/devcontainers/base:${BASE_VARIANT}
|
|
|
|
# Keep these in sync with `zephyr_sdk` and `toolchains` in
|
|
# .github/workflows/build.yml.
|
|
ARG ZSDK_VERSION=1.0.1
|
|
ARG ZSDK_TOOLCHAINS="arm-zephyr-eabi xtensa-espressif_esp32s3_zephyr-elf xtensa-espressif_esp32_zephyr-elf riscv64-zephyr-elf"
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
# Zephyr's documented host dependencies, plus:
|
|
# - gcc/g++-arm-linux-gnueabihf + aarch64-linux-gnu: the `build.sh linux`
|
|
# native_sim presets are cross-compiled for the target SBC. See
|
|
# docs/LINUX_NATIVE.md.
|
|
# - ccache: Zephyr picks it up automatically as a compiler launcher.
|
|
# - dfu-util / usbutils / picocom: flashing and serial console on Linux hosts.
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
ccache \
|
|
cmake \
|
|
device-tree-compiler \
|
|
dfu-util \
|
|
file \
|
|
gdb-multiarch \
|
|
gperf \
|
|
libmagic1 \
|
|
make \
|
|
ninja-build \
|
|
picocom \
|
|
python3 \
|
|
python3-dev \
|
|
python3-venv \
|
|
udev \
|
|
unzip \
|
|
usbutils \
|
|
wget \
|
|
xz-utils \
|
|
zip \
|
|
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
|
|
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Zephyr SDK
|
|
#
|
|
# The "minimal" bundle is the SDK scaffolding + host tools only; setup.sh then
|
|
# pulls just the toolchains named in ZSDK_TOOLCHAINS. Installing all ~35 GNU
|
|
# toolchains would add tens of GB for architectures ZephCore never targets.
|
|
#
|
|
# The `cmake -P zephyr_sdk_export.cmake` step registers the SDK in the *vscode*
|
|
# user's CMake package registry rather than root's -- that script writes to
|
|
# $HOME/.cmake unconditionally. ZEPHYR_SDK_INSTALL_DIR below already covers
|
|
# find_package(Zephyr-sdk); the registry entry is belt and braces for tooling
|
|
# that shells out with a different environment.
|
|
# ---------------------------------------------------------------------------
|
|
ENV ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk-${ZSDK_VERSION}
|
|
ENV ZEPHYR_TOOLCHAIN_VARIANT=zephyr
|
|
|
|
RUN set -eux; \
|
|
arch="$(uname -m)"; \
|
|
base="https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}"; \
|
|
bundle="zephyr-sdk-${ZSDK_VERSION}_linux-${arch}_minimal.tar.xz"; \
|
|
cd /opt; \
|
|
wget -q --progress=dot:giga -O "${bundle}" "${base}/${bundle}"; \
|
|
wget -q -O sha256.sum "${base}/sha256.sum"; \
|
|
grep " ${bundle}\$" sha256.sum | sha256sum -c -; \
|
|
rm -f sha256.sum; \
|
|
tar xf "${bundle}"; \
|
|
rm -f "${bundle}"; \
|
|
cd "zephyr-sdk-${ZSDK_VERSION}"; \
|
|
set --; \
|
|
for t in ${ZSDK_TOOLCHAINS}; do set -- "$@" -t "$t"; done; \
|
|
./setup.sh "$@" -h; \
|
|
HOME=/home/vscode cmake -P cmake/zephyr_sdk_export.cmake; \
|
|
chown -R vscode:vscode /home/vscode/.cmake
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Python environment
|
|
#
|
|
# Lives in /opt (image layer, not the bind-mounted workspace) so it survives a
|
|
# host-side `git clean` and stays fast on Windows/macOS bind mounts. Ubuntu 24.04
|
|
# marks the system interpreter PEP 668 externally-managed, so a venv is required
|
|
# rather than merely tidy.
|
|
#
|
|
# Only west and the flash/DFU tools ZephCore's docs call for go in here. The bulk
|
|
# of Zephyr's Python requirements are installed by post-create.sh via
|
|
# `west packages pip --install`, which needs a populated workspace to enumerate
|
|
# the per-module requirement files (that is where esptool comes from).
|
|
# ---------------------------------------------------------------------------
|
|
ENV VIRTUAL_ENV=/opt/zephyr-venv
|
|
ENV PATH=${VIRTUAL_ENV}/bin:${PATH}
|
|
|
|
RUN set -eux; \
|
|
python3 -m venv "${VIRTUAL_ENV}"; \
|
|
pip install --no-cache-dir --upgrade pip setuptools wheel; \
|
|
pip install --no-cache-dir west pyocd adafruit-nrfutil; \
|
|
chown -R vscode:vscode "${VIRTUAL_ENV}"
|
|
|
|
USER vscode
|