@@ -3,35 +3,102 @@ FROM ubuntu:20.04
33# Avoid interactive prompts during package installation
44ENV DEBIAN_FRONTEND=noninteractive
55
6- # Install build dependencies
6+ # Base build/runtime dependencies
77RUN apt-get update && apt-get install -y \
8- wget \
8+ ca-certificates \
99 curl \
10+ wget \
1011 git \
12+ xz-utils \
13+ tar \
14+ pkg-config \
1115 build-essential \
12- software-properties-common \
13- gnupg \
14- lsb-release \
16+ ninja-build \
17+ python3 \
18+ libzstd-dev zlib1g-dev libxml2-dev libffi-dev \
1519 && rm -rf /var/lib/apt/lists/*
1620
17- # Install LLVM 18
18- RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
19- && add-apt-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-18 main" \
20- && apt-get update \
21- && apt-get install -y \
22- llvm-18 llvm-18-dev llvm-18-runtime \
23- clang-18 libclang-18-dev \
24- libpolly-18-dev \
25- libzstd-dev zlib1g-dev libtinfo-dev libxml2-dev \
26- && rm -rf /var/lib/apt/lists/*
21+ # Install a modern CMake (>=3.20) from official binary tarball to avoid slow APT mirrors
22+ ARG CMAKE_VER=3.29.6
23+ RUN set -eux; \
24+ url1="https://cmake.org/files/v${CMAKE_VER%.*}/cmake-${CMAKE_VER}-linux-x86_64.tar.gz" ; \
25+ url2="https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-linux-x86_64.tar.gz" ; \
26+ echo "Downloading CMake ${CMAKE_VER}..." ; \
27+ ( \
28+ curl -fL --retry 5 --retry-delay 3 --retry-all-errors -o /tmp/cmake.tar.gz "$url1" \
29+ || wget -O /tmp/cmake.tar.gz --tries=5 --waitretry=3 --retry-connrefused "$url1" \
30+ || curl -fL --retry 5 --retry-delay 3 --retry-all-errors -o /tmp/cmake.tar.gz "$url2" \
31+ || wget -O /tmp/cmake.tar.gz --tries=5 --waitretry=3 --retry-connrefused "$url2" \
32+ ); \
33+ tar -C /opt -xzf /tmp/cmake.tar.gz; \
34+ cmake_dir=$(tar -tzf /tmp/cmake.tar.gz | head -1 | cut -f1 -d'/' ); \
35+ mv "/opt/${cmake_dir}" /opt/cmake; \
36+ ln -s /opt/cmake/bin/* /usr/local/bin/; \
37+ cmake --version; \
38+ rm -f /tmp/cmake.tar.gz
39+
40+ # Build and install LLVM 18.1.x from source with FFI disabled
41+ # This removes the runtime dependency on libffi while keeping needed targets.
42+ ARG LLVM_VER=18.1.8
43+ RUN set -eux; \
44+ base_url="https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VER}" ; \
45+ tar_xz="llvm-project-${LLVM_VER}.src.tar.xz" ; \
46+ alt_url="https://codeload.github.com/llvm/llvm-project/tar.xz/refs/tags/llvmorg-${LLVM_VER}" ; \
47+ echo "Downloading LLVM ${LLVM_VER} source tarball..." ; \
48+ ( \
49+ curl -fL --retry 5 --retry-delay 3 --retry-all-errors -o /tmp/llvm.tar.xz "$base_url/$tar_xz" \
50+ || wget -O /tmp/llvm.tar.xz --tries=5 --waitretry=3 --retry-connrefused "$base_url/$tar_xz" \
51+ || curl -fL --retry 5 --retry-delay 3 --retry-all-errors -o /tmp/llvm.tar.xz "$alt_url" \
52+ || wget -O /tmp/llvm.tar.xz --tries=5 --waitretry=3 --retry-connrefused "$alt_url" \
53+ ); \
54+ test -s /tmp/llvm.tar.xz; \
55+ mkdir -p /tmp/llvm && tar -C /tmp/llvm --strip-components=1 -xf /tmp/llvm.tar.xz; \
56+ cmake -G Ninja -S /tmp/llvm/llvm -B /tmp/llvm-build \
57+ -DCMAKE_BUILD_TYPE=Release \
58+ -DLLVM_ENABLE_PROJECTS=clang \
59+ -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
60+ -DLLVM_BUILD_LLVM_DYLIB=ON \
61+ -DLLVM_LINK_LLVM_DYLIB=ON \
62+ -DLLVM_ENABLE_FFI=OFF \
63+ -DLLVM_ENABLE_TERMINFO=OFF \
64+ -DLLVM_ENABLE_ZLIB=ON \
65+ -DLLVM_ENABLE_ZSTD=ON \
66+ -DCMAKE_INSTALL_PREFIX=/opt/llvm-18; \
67+ ninja -C /tmp/llvm-build install; \
68+ # Wrap llvm-config to filter out any stray -lffi from system-libs output
69+ if [ -x /opt/llvm-18/bin/llvm-config ]; then \
70+ mv /opt/llvm-18/bin/llvm-config /opt/llvm-18/bin/llvm-config.real; \
71+ cat > /opt/llvm-18/bin/llvm-config <<'WRAP' ; \
72+ # !/bin/sh
73+ REAL="/opt/llvm-18/bin/llvm-config.real"
74+ # Capture stdout+stderr and original exit status
75+ OUT="$($REAL " $@" 2>&1)" ; RC=$?
76+ if [ $RC -ne 0 ]; then
77+ printf '%s\n ' "$OUT" >&2
78+ exit $RC
79+ fi
80+ # Filter only library flag queries; pass-through otherwise
81+ case " $* " in
82+ *" --system-libs " *|*" --libs " *|*" --ldflags " *)
83+ printf '%s\n ' "$OUT" | sed -E 's/(^|[[:space:]])-lffi([[:space:]]|$)/\1\2 /g'
84+ ;;
85+ *)
86+ printf '%s\n ' "$OUT"
87+ ;;
88+ esac
89+ exit 0
90+ WRAP
91+ chmod +x /opt/llvm-18/bin/llvm-config; \
92+ fi; \
93+ rm -rf /tmp/llvm /tmp/llvm-build /tmp/llvm.tar.xz
2794
2895# Install Rust (version specified in rust-toolchain.toml will be used)
2996RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
3097ENV PATH="/root/.cargo/bin:$PATH"
3198
32- # Set LLVM environment variable
33- ENV LLVM_SYS_181_PREFIX=/usr/lib /llvm-18
34- ENV PATH="/usr/lib /llvm-18/bin:$PATH"
99+ # Expose LLVM to llvm-sys/inkwell
100+ ENV LLVM_SYS_181_PREFIX=/opt /llvm-18
101+ ENV PATH="/opt /llvm-18/bin:$PATH"
35102
36103# Set working directory
37104WORKDIR /workspace
0 commit comments