diff --git a/Dockerfile b/Dockerfile index d5083276..a60d695e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,38 @@ -# syntax=docker/dockerfile:1.6 -FROM debian:bookworm-slim +FROM mcr.microsoft.com/devcontainers/python:3.10-bookworm -ARG DEBIAN_FRONTEND=noninteractive -ARG TARGETARCH -ARG ARM_GCC_VERSION=13.3.rel1 - -# Install minimal runtime build deps (keep it small: no build-essential, no git, no python) +# --------------------------------------------- +# Base build tools +# --------------------------------------------- RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates bash cmake ninja-build \ + build-essential cmake ninja-build python3 curl xz-utils ca-certificates \ && rm -rf /var/lib/apt/lists/* -# Install ARM toolchain depending on container architecture -# - amd64/arm64: download official Arm tarball (glibc); remove curl/xz afterwards -# - arm (arm/v7): use Debian packages (no official tarball) -RUN set -eux; \ - case "${TARGETARCH}" in \ - amd64) \ - apt-get update && apt-get install -y --no-install-recommends curl xz-utils; \ - URL="https://developer.arm.com/-/media/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/arm-gnu-toolchain-${ARM_GCC_VERSION}-x86_64-arm-none-eabi.tar.xz"; \ - curl -L "$URL" -o /tmp/gcc.tar.xz; \ - mkdir -p /opt; tar -xJf /tmp/gcc.tar.xz -C /opt; rm -f /tmp/gcc.tar.xz; \ - ln -s /opt/arm-gnu-toolchain-${ARM_GCC_VERSION}-*/bin/* /usr/local/bin/; \ - apt-get purge -y curl xz-utils && apt-get autoremove -y; \ - rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ - ;; \ - arm64) \ - apt-get update && apt-get install -y --no-install-recommends curl xz-utils; \ - URL="https://developer.arm.com/-/media/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/arm-gnu-toolchain-${ARM_GCC_VERSION}-aarch64-arm-none-eabi.tar.xz"; \ - curl -L "$URL" -o /tmp/gcc.tar.xz; \ - mkdir -p /opt; tar -xJf /tmp/gcc.tar.xz -C /opt; rm -f /tmp/gcc.tar.xz; \ - ln -s /opt/arm-gnu-toolchain-${ARM_GCC_VERSION}-*/bin/* /usr/local/bin/; \ - apt-get purge -y curl xz-utils && apt-get autoremove -y; \ - rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ - ;; \ - arm) \ - apt-get update && apt-get install -y --no-install-recommends \ - gcc-arm-none-eabi binutils-arm-none-eabi gdb-multiarch \ - && rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ - ;; \ - *) echo "Unsupported TARGETARCH=${TARGETARCH}"; exit 1; \ - esac +# --------------------------------------------- +# Install ARM GNU Toolchain (host autodetect) +# Works with or without TARGETARCH/BuildKit +# --------------------------------------------- +ARG ARM_GCC_VERSION=13.3.rel1 +ARG TARGETARCH # may be unset under legacy builder -# Optional: trim docs/examples inside the Arm toolchain to save a few MB -RUN set -eux; \ - if ls /opt/arm-gnu-toolchain-* >/dev/null 2>&1; then \ - find /opt/arm-gnu-toolchain-* -type d \( -name doc -o -name docs -o -name man -o -name info -o -name share \) -prune -exec rm -rf {} + || true; \ - fi +RUN set -e; \ + # Derive base arch: prefer TARGETARCH if provided, fallback to uname -m + BASE_ARCH="${TARGETARCH:-}"; \ + if [ -z "$BASE_ARCH" ]; then BASE_ARCH="$(uname -m)"; fi; \ + case "$BASE_ARCH" in \ + amd64|x86_64) HOSTARCH="x86_64" ;; \ + arm64|aarch64) HOSTARCH="aarch64" ;; \ + *) HOSTARCH="x86_64" ;; \ + esac; \ + TARBALL="arm-gnu-toolchain-${ARM_GCC_VERSION}-${HOSTARCH}-arm-none-eabi.tar.xz"; \ + URL="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/${TARBALL}"; \ + echo "Downloading ${URL}"; \ + curl -fL -O "${URL}"; \ + tar -xf "${TARBALL}"; \ + rm "${TARBALL}"; \ + DIR="$(ls -d arm-gnu-toolchain-${ARM_GCC_VERSION}-*-arm-none-eabi)"; \ + mv "${DIR}" /opt/toolchain + +# Toolchain in PATH +ENV PATH="/opt/toolchain/bin:${PATH}" WORKDIR /src -CMD ["bash"] diff --git a/Dockerfile-ms b/Dockerfile-ms new file mode 100644 index 00000000..a60d695e --- /dev/null +++ b/Dockerfile-ms @@ -0,0 +1,38 @@ +FROM mcr.microsoft.com/devcontainers/python:3.10-bookworm + +# --------------------------------------------- +# Base build tools +# --------------------------------------------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential cmake ninja-build python3 curl xz-utils ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# --------------------------------------------- +# Install ARM GNU Toolchain (host autodetect) +# Works with or without TARGETARCH/BuildKit +# --------------------------------------------- +ARG ARM_GCC_VERSION=13.3.rel1 +ARG TARGETARCH # may be unset under legacy builder + +RUN set -e; \ + # Derive base arch: prefer TARGETARCH if provided, fallback to uname -m + BASE_ARCH="${TARGETARCH:-}"; \ + if [ -z "$BASE_ARCH" ]; then BASE_ARCH="$(uname -m)"; fi; \ + case "$BASE_ARCH" in \ + amd64|x86_64) HOSTARCH="x86_64" ;; \ + arm64|aarch64) HOSTARCH="aarch64" ;; \ + *) HOSTARCH="x86_64" ;; \ + esac; \ + TARBALL="arm-gnu-toolchain-${ARM_GCC_VERSION}-${HOSTARCH}-arm-none-eabi.tar.xz"; \ + URL="https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/${TARBALL}"; \ + echo "Downloading ${URL}"; \ + curl -fL -O "${URL}"; \ + tar -xf "${TARBALL}"; \ + rm "${TARBALL}"; \ + DIR="$(ls -d arm-gnu-toolchain-${ARM_GCC_VERSION}-*-arm-none-eabi)"; \ + mv "${DIR}" /opt/toolchain + +# Toolchain in PATH +ENV PATH="/opt/toolchain/bin:${PATH}" + +WORKDIR /src diff --git a/Dockerfile-slim b/Dockerfile-slim new file mode 100644 index 00000000..d5083276 --- /dev/null +++ b/Dockerfile-slim @@ -0,0 +1,51 @@ +# syntax=docker/dockerfile:1.6 +FROM debian:bookworm-slim + +ARG DEBIAN_FRONTEND=noninteractive +ARG TARGETARCH +ARG ARM_GCC_VERSION=13.3.rel1 + +# Install minimal runtime build deps (keep it small: no build-essential, no git, no python) +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates bash cmake ninja-build \ + && rm -rf /var/lib/apt/lists/* + +# Install ARM toolchain depending on container architecture +# - amd64/arm64: download official Arm tarball (glibc); remove curl/xz afterwards +# - arm (arm/v7): use Debian packages (no official tarball) +RUN set -eux; \ + case "${TARGETARCH}" in \ + amd64) \ + apt-get update && apt-get install -y --no-install-recommends curl xz-utils; \ + URL="https://developer.arm.com/-/media/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/arm-gnu-toolchain-${ARM_GCC_VERSION}-x86_64-arm-none-eabi.tar.xz"; \ + curl -L "$URL" -o /tmp/gcc.tar.xz; \ + mkdir -p /opt; tar -xJf /tmp/gcc.tar.xz -C /opt; rm -f /tmp/gcc.tar.xz; \ + ln -s /opt/arm-gnu-toolchain-${ARM_GCC_VERSION}-*/bin/* /usr/local/bin/; \ + apt-get purge -y curl xz-utils && apt-get autoremove -y; \ + rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ + ;; \ + arm64) \ + apt-get update && apt-get install -y --no-install-recommends curl xz-utils; \ + URL="https://developer.arm.com/-/media/Files/downloads/gnu/${ARM_GCC_VERSION}/binrel/arm-gnu-toolchain-${ARM_GCC_VERSION}-aarch64-arm-none-eabi.tar.xz"; \ + curl -L "$URL" -o /tmp/gcc.tar.xz; \ + mkdir -p /opt; tar -xJf /tmp/gcc.tar.xz -C /opt; rm -f /tmp/gcc.tar.xz; \ + ln -s /opt/arm-gnu-toolchain-${ARM_GCC_VERSION}-*/bin/* /usr/local/bin/; \ + apt-get purge -y curl xz-utils && apt-get autoremove -y; \ + rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ + ;; \ + arm) \ + apt-get update && apt-get install -y --no-install-recommends \ + gcc-arm-none-eabi binutils-arm-none-eabi gdb-multiarch \ + && rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man; \ + ;; \ + *) echo "Unsupported TARGETARCH=${TARGETARCH}"; exit 1; \ + esac + +# Optional: trim docs/examples inside the Arm toolchain to save a few MB +RUN set -eux; \ + if ls /opt/arm-gnu-toolchain-* >/dev/null 2>&1; then \ + find /opt/arm-gnu-toolchain-* -type d \( -name doc -o -name docs -o -name man -o -name info -o -name share \) -prune -exec rm -rf {} + || true; \ + fi + +WORKDIR /src +CMD ["bash"]