1# Build eval-cli for Linux.
2#
3# Usage (from the zed repo root):
4# docker build --platform linux/amd64 -f crates/eval_cli/Dockerfile -t eval-cli-builder .
5# docker cp "$(docker create eval-cli-builder)":/eval-cli ./target/eval-cli
6#
7# Or use the helper script:
8# crates/eval_cli/script/build-linux
9
10FROM rust:1.93.1-bookworm AS builder
11
12WORKDIR /app
13
14# Install build dependencies (subset of script/linux needed for headless GPUI).
15RUN apt-get update && apt-get install -y --no-install-recommends \
16 cmake \
17 clang \
18 g++ \
19 libasound2-dev \
20 libfontconfig-dev \
21 libgit2-dev \
22 libglib2.0-dev \
23 libssl-dev \
24 libwayland-dev \
25 libx11-xcb-dev \
26 libxkbcommon-x11-dev \
27 libzstd-dev \
28 libsqlite3-dev \
29 build-essential \
30 curl \
31 && rm -rf /var/lib/apt/lists/*
32
33# Install wild linker for faster linking (built from source to match bookworm's glibc).
34RUN cargo install --locked wild-linker --version 0.8.0 --root /usr/local
35
36# Download WASI SDK (needed by some dependencies).
37ARG TARGETARCH
38RUN mkdir -p /app/target && \
39 WASI_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64" || echo "x86_64") && \
40 curl -L "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-25/wasi-sdk-25.0-${WASI_ARCH}-linux.tar.gz" \
41 | tar -xz -C /app/target && \
42 mv /app/target/wasi-sdk-25.0-${WASI_ARCH}-linux /app/target/wasi-sdk
43
44# Pre-install the toolchain specified in rust-toolchain.toml so it is cached.
45RUN rustup toolchain install 1.93 --profile minimal \
46 --component rustfmt --component clippy --component rust-analyzer --component rust-src \
47 --target wasm32-wasip2 --target wasm32-unknown-unknown --target x86_64-unknown-linux-musl
48
49COPY . .
50
51ENV CC=clang CXX=clang++
52ENV RUSTFLAGS="-C linker=clang -C link-arg=--ld-path=wild"
53
54RUN --mount=type=cache,target=/usr/local/cargo/registry \
55 --mount=type=cache,target=/usr/local/cargo/git \
56 --mount=type=cache,target=/app/target \
57 cargo build --release --package eval_cli && \
58 cp /app/target/release/eval-cli /eval-cli && \
59 strip /eval-cli
60
61FROM scratch
62COPY --from=builder /eval-cli /eval-cli