blob: 08bec174a2a5197d94536166f016c33bad68c11a [file] [edit]
# SPDX-FileCopyrightText: The Eigen Authors
# SPDX-License-Identifier: MPL-2.0
#
# CI image for the checkformat lint jobs and select:tests.
#
# Kept outside ci/docker/ on purpose: everything there is hashed into the test
# pass-cache fingerprint and forces the full affected-test suite, and nothing
# in this image can change a test's outcome.
#
# clang-format is built from the LLVM release rather than taken from a package:
# Alpine dropped clang17 after 3.22, and the PyPI musllinux wheel's
# patchelf-rewritten binary does not load under musl. The static build is
# ~3 MB against ~300 MB for Alpine's clang17-extra-tools.
#
# Rebuild and push when this file changes:
# docker buildx build --platform linux/amd64 \
# -t registry.gitlab.com/libeigen/eigen/alpine-lint:latest \
# --push ci/lint/
FROM alpine:3.24.2 AS clang-format
ARG LLVM_VERSION=17.0.6
# SHA-256 of the release tarball; its SHA-512 matches Alpine's llvm17 APKBUILD.
ARG LLVM_SHA256=58a8818c60e6627064f312dbf46c02d9949956558340938b71cf731ad8bc0813
RUN apk add --no-cache build-base cmake samurai python3 curl
WORKDIR /src
RUN curl -fsSLo llvm.tar.xz \
https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz \
&& echo "${LLVM_SHA256} llvm.tar.xz" | sha256sum -c - \
&& tar -xJf llvm.tar.xz --strip-components=1 \
&& rm llvm.tar.xz
# LLVM 17 predates GCC 15, whose libstdc++ no longer includes <cstdint>
# transitively.
RUN cmake -S llvm -B build -G Ninja \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_CXX_FLAGS="-include cstdint" \
-DCMAKE_EXE_LINKER_FLAGS="-static -s" \
-DLLVM_ENABLE_PROJECTS=clang \
-DLLVM_TARGETS_TO_BUILD=Native \
-DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_DOCS=OFF \
-DCLANG_INCLUDE_TESTS=OFF -DCLANG_INCLUDE_DOCS=OFF \
-DLLVM_ENABLE_ZLIB=OFF -DLLVM_ENABLE_ZSTD=OFF -DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_LIBXML2=OFF -DLLVM_ENABLE_LIBEDIT=OFF \
&& samu -C build clang-format \
&& install -D -m 755 build/bin/clang-format /out/clang-format \
&& install -D -m 755 clang/tools/clang-format/git-clang-format /out/git-clang-format
FROM alpine:3.24.2
COPY requirements.txt /tmp/
# After populating the venv, drop pip, ensurepip, and the stdlib's GUI,
# REPL-help, test and build parts. Pruning git's HTTP transport, OpenSSL and
# apk as well saves 5.6 MB compressed, not worth an image nobody can extend or
# debug with apk.
RUN apk add --no-cache python3 git \
&& python3 -m venv /opt/lint \
&& /opt/lint/bin/pip install --no-cache-dir -r /tmp/requirements.txt \
&& /opt/lint/bin/pip uninstall -q -y pip \
&& py=$(echo /usr/lib/python3.*) && dyn=$py/lib-dynload \
&& rm -rf $py/ensurepip $py/idlelib $py/tkinter $py/turtledemo $py/turtle.py \
$py/pydoc_data $py/test $py/config-3.* $py/__phello__ \
$dyn/_test*.so $dyn/_ctypes_test*.so $dyn/xxlimited*.so $dyn/_xxtestfuzz*.so \
/tmp/requirements.txt
COPY --from=clang-format /out/ /usr/local/bin/
ENV PATH=/opt/lint/bin:$PATH
# Fail the build, not every merge request's lint job, if the pruning above
# removed something a tool needs. The clang-format-17 name lets the commands
# in .agents/ci.md run unchanged inside the image.
RUN ln -s clang-format /usr/local/bin/clang-format-17 \
&& clang-format --version && git --version && codespell --version && reuse --version \
&& vermin --version && apk --version \
&& python3 -c 'import hashlib, json, subprocess' \
&& for f in /usr/bin/* /usr/libexec/git-core/* /usr/lib/python3.*/lib-dynload/*.so; do \
if /lib/ld-musl-x86_64.so.1 --list "$f" 2>&1 | grep -q 'Error loading'; then \
echo "missing shared library: $f"; exit 1; fi; \
done