Dockerfile62 lines · 1963 chars FROM gcc:15.2.0 AS build
ENV DEBIAN_FRONTEND=noninteractive
# Install build dependencies (apt-based)
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
git \
lcov \
cflow \
ruby \
doxygen \
build-essential \
unifdef \
gcc-arm-none-eabi \
binutils-arm-none-eabi && \
rm -rf /var/lib/apt/lists/*
# Cross-compiler aliasing for makefiles that expect arm-elf-* tools
RUN ln -s /usr/bin/arm-none-eabi-gcc /usr/bin/arm-elf-gcc && \
ln -s /usr/bin/arm-none-eabi-objcopy /usr/bin/arm-elf-objcopy && \
ln -s /usr/bin/arm-none-eabi-ar /usr/bin/arm-elf-ar
WORKDIR /workspace
# Copy the source into the image
COPY . /workspace
# Initialize submodules if a .git directory is present
RUN if [ -d .git ]; then git submodule update --init --recursive; else echo "No .git directory; skipping submodules"; fi
# Attempt to build CMock tests, but allow build to proceed even if it fails (for environments without full sources)
RUN set -e; \
if [ -d FreeRTOS/Test/CMock ]; then \
echo "Starting CMock build..."; \
make -C FreeRTOS/Test/CMock ENABLE_SANITIZER=1 run_col_formatted || true; \
make -C FreeRTOS/Test/CMock lcovhtml || true; \
else \
echo "FreeRTOS/Test/CMock not present; skipping"; \
fi
# Collect built artifacts (if any)
RUN mkdir -p /artifacts/build /artifacts/coverage; \
if [ -d FreeRTOS/Test/CMock/build ]; then cp -a FreeRTOS/Test/CMock/build /artifacts/build/; fi; \
if [ -d FreeRTOS/Test/CMock/coverage ]; then cp -a FreeRTOS/Test/CMock/coverage /artifacts/coverage/; fi
# Final runtime image
FROM debian:bookworm-slim as final
LABEL maintainer="FreeRTOS BuildAgent"
RUN apt-get update -y && \
apt-get install -y --no-install-recommends bash ca-certificates && \
rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
# Copy artifacts from build stage
COPY --from=build /artifacts /workspace/artifacts
CMD ["bash"]