mirror of
https://github.com/goplus/llgo.git
synced 2025-12-24 13:08:13 +08:00
152 lines
5.0 KiB
Docker
152 lines
5.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
ARG UBUNTU_VERSION=24.04
|
|
ARG BASE_IMAGE=ubuntu:${UBUNTU_VERSION}
|
|
FROM ${BASE_IMAGE} AS base
|
|
|
|
ARG DEBIAN_FRONTEND=noninteractive
|
|
ARG LLVM_VERSION=19
|
|
ARG GO_VERSION=1.24.2
|
|
ARG CARGS_VERSION=1.0.0
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
curl \
|
|
git \
|
|
bash \
|
|
rsync \
|
|
sudo \
|
|
lsb-release \
|
|
gnupg \
|
|
unzip \
|
|
wget \
|
|
build-essential \
|
|
pkg-config \
|
|
python3 \
|
|
python3-venv \
|
|
python3-pip \
|
|
python3-dev \
|
|
libgc-dev \
|
|
libssl-dev \
|
|
zlib1g-dev \
|
|
libffi-dev \
|
|
libcjson-dev \
|
|
libuv1-dev \
|
|
libsqlite3-dev \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# LLVM/Clang toolchain (matches .github/actions/setup-deps for Ubuntu).
|
|
RUN set -eux; \
|
|
. /etc/os-release; \
|
|
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.list; \
|
|
if ! curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /etc/apt/trusted.gpg.d/llvm.gpg; then \
|
|
echo "failed to fetch llvm gpg key; aborting (avoid unverified LLVM packages)" >&2; \
|
|
exit 1; \
|
|
fi; \
|
|
apt-get update; \
|
|
if ! apt-get install -y --no-install-recommends \
|
|
llvm-${LLVM_VERSION}-dev \
|
|
clang-${LLVM_VERSION} \
|
|
libclang-${LLVM_VERSION}-dev \
|
|
lld-${LLVM_VERSION} \
|
|
libunwind-${LLVM_VERSION}-dev \
|
|
libc++-${LLVM_VERSION}-dev \
|
|
; then \
|
|
echo "apt.llvm.org install failed; falling back to distro LLVM packages" >&2; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends llvm clang lld libunwind-dev libc++-dev; \
|
|
fi; \
|
|
if command -v "clang-${LLVM_VERSION}" >/dev/null 2>&1; then \
|
|
ln -sf "$(command -v "clang-${LLVM_VERSION}")" /usr/local/bin/clang; \
|
|
fi; \
|
|
if command -v "clang++-${LLVM_VERSION}" >/dev/null 2>&1; then \
|
|
ln -sf "$(command -v "clang++-${LLVM_VERSION}")" /usr/local/bin/clang++; \
|
|
fi; \
|
|
if command -v "lld-${LLVM_VERSION}" >/dev/null 2>&1; then \
|
|
ln -sf "$(command -v "lld-${LLVM_VERSION}")" /usr/local/bin/lld; \
|
|
fi; \
|
|
if command -v "ld.lld-${LLVM_VERSION}" >/dev/null 2>&1; then \
|
|
ln -sf "$(command -v "ld.lld-${LLVM_VERSION}")" /usr/local/bin/ld.lld; \
|
|
fi; \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Go toolchain (pin like CI to avoid toolchain auto-download flakiness).
|
|
RUN set -eux; \
|
|
arch="$(dpkg --print-architecture)"; \
|
|
case "$arch" in \
|
|
amd64) goarch="amd64" ;; \
|
|
arm64) goarch="arm64" ;; \
|
|
i386) goarch="386" ;; \
|
|
*) echo "unsupported arch: $arch" >&2; exit 1 ;; \
|
|
esac; \
|
|
curl -fL "https://go.dev/dl/go${GO_VERSION}.linux-${goarch}.tar.gz" -o /tmp/go.tgz; \
|
|
rm -rf /usr/local/go; \
|
|
tar -C /usr/local -xzf /tmp/go.tgz; \
|
|
rm -f /tmp/go.tgz
|
|
|
|
RUN python3 -m venv /opt/venv && /opt/venv/bin/pip install -U pip setuptools wheel
|
|
|
|
ENV GOPATH="/go"
|
|
ENV GOMODCACHE="/go/pkg/mod"
|
|
ENV GOCACHE="/root/.cache/go-build"
|
|
RUN mkdir -p "$GOMODCACHE" "$GOCACHE" "$GOPATH/bin"
|
|
|
|
ENV PATH="/opt/venv/bin:/usr/lib/llvm-${LLVM_VERSION}/bin:/usr/local/go/bin:${GOPATH}/bin:${PATH}"
|
|
ENV CC="clang"
|
|
ENV CXX="clang++"
|
|
ENV GOTOOLCHAIN="local"
|
|
ENV LLGO_ASSETS_DIR="/opt/llgo-assets"
|
|
|
|
WORKDIR /tmp/llgo-mod
|
|
COPY go.mod go.sum ./
|
|
COPY runtime/go.mod runtime/go.sum ./runtime/
|
|
RUN go mod download
|
|
|
|
ARG TARGETARCH
|
|
RUN set -eux; \
|
|
mkdir -p "${LLGO_ASSETS_DIR}/llama2-c"; \
|
|
curl -fL "https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin" -o "${LLGO_ASSETS_DIR}/llama2-c/stories15M.bin"; \
|
|
mkdir -p "${LLGO_ASSETS_DIR}/cargs"; \
|
|
if [ "${TARGETARCH}" = "amd64" ]; then \
|
|
cargs_pkg="cargs_linux_amd64.zip"; \
|
|
elif [ "${TARGETARCH}" = "arm64" ]; then \
|
|
cargs_pkg="cargs_linux_arm64.zip"; \
|
|
elif [ "${TARGETARCH}" = "386" ]; then \
|
|
cargs_pkg="cargs_linux_386.zip"; \
|
|
else \
|
|
echo "skip cargs linux asset for TARGETARCH=${TARGETARCH}"; \
|
|
cargs_pkg=""; \
|
|
fi; \
|
|
if [ -n "${cargs_pkg}" ]; then \
|
|
cargs_url="https://github.com/goplus/llpkg/releases/download/cargs/v${CARGS_VERSION}/${cargs_pkg}"; \
|
|
if curl -fL "${cargs_url}" -o /tmp/cargs.zip; then \
|
|
unzip -q /tmp/cargs.zip -d "${LLGO_ASSETS_DIR}/cargs"; \
|
|
rm -f /tmp/cargs.zip; \
|
|
else \
|
|
if [ "${TARGETARCH}" = "386" ]; then \
|
|
echo "warning: cargs asset not available (${cargs_url}); continuing without cargs" >&2; \
|
|
else \
|
|
echo "error: failed to download cargs asset (${cargs_url})" >&2; \
|
|
exit 1; \
|
|
fi; \
|
|
fi; \
|
|
prefix="${LLGO_ASSETS_DIR}/cargs"; \
|
|
if [ -d "${prefix}/lib/pkgconfig" ]; then \
|
|
for tmpl in "${prefix}/lib/pkgconfig"/*.pc.tmpl; do \
|
|
[ -f "${tmpl}" ] || continue; \
|
|
pc_file="${tmpl%.tmpl}"; \
|
|
sed "s|{{.Prefix}}|${prefix}|g" "${tmpl}" > "${pc_file}"; \
|
|
done; \
|
|
fi; \
|
|
fi
|
|
|
|
WORKDIR /repo
|
|
|
|
FROM base AS pydeps
|
|
|
|
# Optional demo deps used by _demo/py (numpy/torch). Keep in a separate target
|
|
# so users can build a smaller image when needed.
|
|
RUN set -eux; \
|
|
pip install numpy && \
|
|
(pip install torch --index-url https://download.pytorch.org/whl/cpu || pip install torch)
|