mirror of
https://github.com/mudler/LocalAI.git
synced 2026-11-04 19:43:17 -05:00
* feat(sycl): make the intel llama.cpp backend self-contained on any host The SYCL backend shipped an incomplete oneAPI runtime AND relied on a host-provided GPU driver, so it only ran inside the build container. On a bare host it died with "libze_loader.so.1 / libdnnl.so.3: cannot open shared object file", and even with the host's Intel driver installed it SIGSEGV'd during SYCL init when the host driver was built against a newer glibc than the backend's bundled loader (rolling-release distros). package_intel_libs now bundles the complete, coherent oneAPI runtime (the missing MKL ILP64 / sycl_blas / tbb_thread + oneDNN + the dlopen'd UR adapters, plus a sweep of the backend binaries' own direct deps) and the Intel GPU userspace driver (libze_intel_gpu + libigdrcl + IGC + gmm) with its OpenCL ICD manifest, mirroring how package_vulkan_libs bundles Mesa. run.sh points the Level Zero and OpenCL loaders at the bundled driver, and install-base-deps.sh installs it in the SYCL build image. Bundling the driver is safe across kernels because it talks to the host i915/xe via the stable DRM UAPI (unlike NVIDIA's kernel-locked userspace). Validated on Arch (glibc 2.43, i915): the backend loads and runs on an Iris Xe with no host Intel packages installed. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me> * fix(sycl): install a driver that exists, and let the user choose their own The driver install added earlier in this branch asked apt for intel-level-zero-gpu, which is not a package in Ubuntu 24.04. apt fails outright on an unknown name, so neither driver was installed, nothing was there to copy, and the images carried no driver at all. It now comes from Intel's own repository, which has 25.18 for this Ubuntu release, against 23.43 from late 2023 in the Ubuntu archive. The archive driver does not know any card released since, so a machine with a recent Intel GPU would end up carrying a driver that cannot drive it. Anything that goes wrong during that install fails the build on purpose: an unreachable repository is a passing problem that a retry fixes, while quietly carrying a different driver, or none, is a difference nobody would notice until a user reports an idle GPU. run.sh used to overwrite whatever driver the user had chosen. Level Zero uses only the driver it is given, so on a machine with a card too new for the carried driver, the GPU would go unused with no way back. Both that setting and the OpenCL one are now left alone when already set, and the docs say how to point a backend at the machine's own driver. The OpenCL setting also used to be applied whenever the backend held a driver list, even when the driver it named had not been copied, which leaves OpenCL with nothing instead of falling back to the machine's own driver. It now requires the copied driver to be present, and the packaging leaves out the list entry of any driver it did not copy. The oneAPI images list a processor-only OpenCL library, which was being carried with nothing behind it. Two more corrections in the packaging. The scan for libraries a program is linked against only looked at files named llama-cpp-*, so turboquant and bonsai, which are also built for Intel GPUs, were left with the incomplete set of libraries this branch set out to fix; it now looks at every program in the directory. And a build that should carry a driver but ends up without one now says so, which is what a stale prebuilt base image looks like: such a backend still runs on a machine that has its own driver, so nothing fails and the only other symptom is a user reporting an idle GPU. Backends now also ask the driver to report how much graphics memory is free, without which llama.cpp reads zero on an integrated GPU, since such a chip shares the system memory instead of having its own. turboquant and bonsai get the same run.sh handling as llama.cpp. The driver is only carried by the builds that start through run.sh, because run.sh is what points Level Zero and OpenCL at it. The Python backends for Intel GPUs start differently and would never load it, so they keep using the machine's own driver rather than carrying several hundred megabytes they cannot use. Checked in a container on Ubuntu 24.04: the install brings driver 25.18 with the files where the packaging expects them, an unreachable repository fails the build, and the copied set resolves on its own once the machine's Intel packages are moved away. Assisted-by: Claude:claude-opus-5 Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me> * fix(ci): rebuild every Linux backend when the GPU packaging script changes scripts/build/package-gpu-libs.sh decides which GPU libraries end up inside an image. The filter that builds the backend matrix listed it as an input of the Python images only, so changing it rebuilt no Go and no C++ backend, even though those run it from their own package.sh. A packaging fix aimed at the Intel llama.cpp backend could merge and reach no image, which is the same failure this rule was written to prevent. Assisted-by: Claude:claude-opus-5 Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me> * fix(sycl): carry only the driver Level Zero uses, not the OpenCL one llama.cpp reaches an Intel GPU through Level Zero, which hands the driver programs that are already compiled and so needs only the back end of the graphics compiler. The OpenCL driver can be handed source code instead, so it needs the compiler's front end as well, and that arrives with its own copy of clang. Carrying it cost about 139 MB in every backend built for Intel GPUs, and took the carried set from 123 MB to 261 MB. Nothing here takes that path. No LocalAI code selects an OpenCL device, each backend image holds one backend, and the documentation never described OpenCL as a way to run models: the only mentions are a stale clblas row in the BUILD_TYPE table, for a llama.cpp backend that no longer exists and that no build matrix entry uses, and the sycl-ls troubleshooting hint. Before this branch the packaging carried the OpenCL loader and adapter but no driver, so the path could not work in a released image either. There is nobody to keep working. The driver list that OpenCL reads is no longer carried, and run.sh no longer sets OCL_ICD_VENDORS, so OpenCL inside a container keeps using whatever the image provides rather than being pointed at a directory with no driver in it. Checked in a container against the real 25.18 driver: the carried set is 123 MB with nothing unresolved, and Level Zero still reports the GPU with the machine's own Intel packages moved out of the way. Neither the Level Zero driver nor the compiler back end names the front end or clang among the libraries it opens by name, so the leaner set is complete for this path. Assisted-by: Claude:claude-opus-5 Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me> --------- Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me> Co-authored-by: localai-org-maint-bot <bot-opensource@localaisrl.com>
299 lines
14 KiB
Bash
Executable File
299 lines
14 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Single source of truth for builder-base contents.
|
|
#
|
|
# Used by:
|
|
# - backend/Dockerfile.base-grpc-builder (CI prebuilt-base source of truth)
|
|
# - backend/Dockerfile.llama-cpp (builder-fromsource stage)
|
|
# - backend/Dockerfile.ik-llama-cpp (builder-fromsource stage)
|
|
# - backend/Dockerfile.turboquant (builder-fromsource stage)
|
|
#
|
|
# All four files invoke this script via
|
|
# RUN --mount=type=bind,source=.docker/install-base-deps.sh,target=/usr/local/sbin/install-base-deps \
|
|
# --mount=type=bind,source=.docker/apt-mirror.sh,target=/usr/local/sbin/apt-mirror \
|
|
# bash /usr/local/sbin/install-base-deps
|
|
#
|
|
# so the prebuilt CI base image and the from-source local-dev path are
|
|
# bit-equivalent by construction.
|
|
#
|
|
# Inputs (env, populated from Dockerfile ARG/ENV):
|
|
# BUILD_TYPE ("cublas"|"l4t"|"hipblas"|"vulkan"|"sycl"|"clblas"|"")
|
|
# CUDA_MAJOR_VERSION ("12" | "13" | "")
|
|
# CUDA_MINOR_VERSION ("8" | "0" | "")
|
|
# TARGETARCH ("amd64" | "arm64")
|
|
# UBUNTU_VERSION ("2204" | "2404")
|
|
# SKIP_DRIVERS ("false" | "true")
|
|
# CMAKE_FROM_SOURCE ("false" | "true")
|
|
# CMAKE_VERSION ("3.31.10")
|
|
# GRPC_VERSION ("v1.65.0")
|
|
# GRPC_MAKEFLAGS ("-j4 -Otarget")
|
|
# APT_MIRROR / APT_PORTS_MIRROR (optional; consumed by /usr/local/sbin/apt-mirror)
|
|
# AMDGPU_TARGETS (optional; only relevant for hipblas downstream)
|
|
#
|
|
# IMPORTANT: install logic is copied verbatim from the prior in-Dockerfile
|
|
# RUN blocks. Do not paraphrase apt invocations / version pins / sed line
|
|
# numbers / deb URLs — the bit-equivalence guarantee depends on it.
|
|
|
|
set -eux
|
|
|
|
# --- 0. apt mirror rewrite (no-op when APT_MIRROR / APT_PORTS_MIRROR unset) ---
|
|
if [ -x /usr/local/sbin/apt-mirror ]; then
|
|
APT_MIRROR="${APT_MIRROR:-}" APT_PORTS_MIRROR="${APT_PORTS_MIRROR:-}" \
|
|
sh /usr/local/sbin/apt-mirror
|
|
fi
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
export MAKEFLAGS="${GRPC_MAKEFLAGS:-}"
|
|
|
|
# --- 1. Base apt build deps ---
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
ccache git \
|
|
ca-certificates \
|
|
make \
|
|
pkg-config libcurl4-openssl-dev \
|
|
curl unzip \
|
|
libssl-dev wget
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# --- 2. Vulkan SDK (BUILD_TYPE=vulkan) ---
|
|
# NB: this block intentionally installs `cmake` via apt as part of the
|
|
# Vulkan tooling — must run before the dedicated CMake step below.
|
|
if [ "${BUILD_TYPE:-}" = "vulkan" ] && [ "${SKIP_DRIVERS:-false}" = "false" ]; then
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
software-properties-common pciutils wget gpg-agent
|
|
apt-get install -y libglm-dev cmake libxcb-dri3-0 libxcb-present0 libpciaccess0 \
|
|
libpng-dev libxcb-keysyms1-dev libxcb-dri3-dev libx11-dev g++ gcc \
|
|
libwayland-dev libxrandr-dev libxcb-randr0-dev libxcb-ewmh-dev \
|
|
git python-is-python3 bison libx11-xcb-dev liblz4-dev libzstd-dev \
|
|
ocaml-core ninja-build pkg-config libxml2-dev wayland-protocols python3-jsonschema \
|
|
clang-format qtbase5-dev qt6-base-dev libxcb-glx0-dev sudo xz-utils
|
|
# Mesa Vulkan ICD drivers (ANV/RADV/lavapipe + Arm SoC) and their ICD
|
|
# manifests. The LunarG SDK below only provides the loader and shader
|
|
# tooling, not hardware drivers — without Mesa the packaged Vulkan backend
|
|
# would ship a loader that finds no GPU. package-gpu-libs.sh bundles these
|
|
# .so files plus their deps into the backend so it stays self-contained.
|
|
apt-get install -y mesa-vulkan-drivers libdrm2
|
|
if [ "amd64" = "${TARGETARCH:-}" ]; then
|
|
wget "https://sdk.lunarg.com/sdk/download/1.4.335.0/linux/vulkansdk-linux-x86_64-1.4.335.0.tar.xz"
|
|
tar -xf vulkansdk-linux-x86_64-1.4.335.0.tar.xz
|
|
rm vulkansdk-linux-x86_64-1.4.335.0.tar.xz
|
|
mkdir -p /opt/vulkan-sdk
|
|
mv 1.4.335.0 /opt/vulkan-sdk/
|
|
( cd /opt/vulkan-sdk/1.4.335.0 && \
|
|
./vulkansdk --no-deps --maxjobs \
|
|
vulkan-loader \
|
|
vulkan-validationlayers \
|
|
vulkan-extensionlayer \
|
|
vulkan-tools \
|
|
shaderc )
|
|
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/bin/* /usr/bin/
|
|
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/lib/* /usr/lib/x86_64-linux-gnu/
|
|
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/include/* /usr/include/
|
|
cp -rfv /opt/vulkan-sdk/1.4.335.0/x86_64/share/* /usr/share/
|
|
rm -rf /opt/vulkan-sdk
|
|
fi
|
|
if [ "arm64" = "${TARGETARCH:-}" ]; then
|
|
mkdir vulkan
|
|
( cd vulkan && \
|
|
curl -L -o vulkan-sdk.tar.xz https://github.com/mudler/vulkan-sdk-arm/releases/download/1.4.335.0/vulkansdk-ubuntu-24.04-arm-1.4.335.0.tar.xz && \
|
|
tar -xvf vulkan-sdk.tar.xz && \
|
|
rm vulkan-sdk.tar.xz && \
|
|
cd 1.4.335.0 && \
|
|
cp -rfv aarch64/bin/* /usr/bin/ && \
|
|
cp -rfv aarch64/lib/* /usr/lib/aarch64-linux-gnu/ && \
|
|
cp -rfv aarch64/include/* /usr/include/ && \
|
|
cp -rfv aarch64/share/* /usr/share/ )
|
|
rm -rf vulkan
|
|
fi
|
|
ldconfig
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
fi
|
|
|
|
# --- 2b. Intel graphics driver (BUILD_TYPE=sycl*) ---
|
|
# The Intel oneAPI base image brings the compilers and the oneAPI libraries, but
|
|
# not the driver that talks to the graphics card. The packaging step copies that
|
|
# driver into the backend, so that the backend works on a machine which has no
|
|
# Intel graphics packages of its own, for the same reason the Vulkan section
|
|
# above installs the Mesa drivers. Install it here so there is something to copy.
|
|
#
|
|
# Only the sycl builds are covered, because those are the ones whose packaging
|
|
# copies the driver. See package_intel_libs in scripts/build/package-gpu-libs.sh.
|
|
#
|
|
# The driver comes from Intel's own package repository, not from the Ubuntu
|
|
# archive. The archive has 23.43 from late 2023, which does not know any card
|
|
# released since, so a machine with a recent Intel GPU would end up carrying a
|
|
# driver that cannot drive it. Intel's repository has 25.18 for the same Ubuntu
|
|
# release.
|
|
#
|
|
# Anything that goes wrong here fails the build, on purpose. An unreachable
|
|
# repository is a passing problem that a retry fixes, whereas carrying a
|
|
# different driver than intended, or none, is a difference nobody would notice
|
|
# until a user reports an idle GPU.
|
|
if case "${BUILD_TYPE:-}" in sycl*) true;; *) false;; esac \
|
|
&& [ "${SKIP_DRIVERS:-false}" = "false" ]; then
|
|
# Ubuntu release name, which is what the repository is indexed by.
|
|
ubuntu_codename=$(. /etc/os-release && echo "${VERSION_CODENAME:-}")
|
|
if [ -z "$ubuntu_codename" ]; then
|
|
echo "ERROR: cannot tell which Ubuntu release this image is, so cannot pick the Intel driver repository" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# The key is armored text, which apt reads directly from a .asc file, so
|
|
# there is no need for gnupg here. "unified" is the component Intel ships
|
|
# its current driver in.
|
|
mkdir -p /usr/share/keyrings
|
|
curl -fsSL https://repositories.intel.com/gpu/intel-graphics.key \
|
|
-o /usr/share/keyrings/intel-graphics.asc
|
|
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.asc] https://repositories.intel.com/gpu/ubuntu ${ubuntu_codename} unified" \
|
|
> /etc/apt/sources.list.d/intel-graphics.list
|
|
apt-get update
|
|
# The first package holds the driver OpenCL talks to, the second the driver
|
|
# Level Zero talks to. Between them they pull in the compiler and the memory
|
|
# manager that both need.
|
|
apt-get install -y --no-install-recommends \
|
|
intel-opencl-icd \
|
|
libze-intel-gpu1
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
fi
|
|
|
|
# --- 3. CUDA toolkit (BUILD_TYPE=cublas|l4t) ---
|
|
if { [ "${BUILD_TYPE:-}" = "cublas" ] || [ "${BUILD_TYPE:-}" = "l4t" ]; } && [ "${SKIP_DRIVERS:-false}" = "false" ]; then
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
software-properties-common pciutils
|
|
if [ "amd64" = "${TARGETARCH:-}" ]; then
|
|
curl -O "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/cuda-keyring_1.1-1_all.deb"
|
|
fi
|
|
if [ "arm64" = "${TARGETARCH:-}" ]; then
|
|
if [ "${CUDA_MAJOR_VERSION}" = "13" ]; then
|
|
curl -O "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/sbsa/cuda-keyring_1.1-1_all.deb"
|
|
else
|
|
curl -O "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/arm64/cuda-keyring_1.1-1_all.deb"
|
|
fi
|
|
fi
|
|
dpkg -i cuda-keyring_1.1-1_all.deb
|
|
rm -f cuda-keyring_1.1-1_all.deb
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
"cuda-nvcc-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcufft-dev-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcurand-dev-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcublas-dev-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcusparse-dev-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcusolver-dev-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}"
|
|
if [ "${CUDA_MAJOR_VERSION}" = "13" ] && [ "arm64" = "${TARGETARCH:-}" ]; then
|
|
apt-get install -y --no-install-recommends \
|
|
"libcufile-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libcudnn9-cuda-${CUDA_MAJOR_VERSION}" \
|
|
"cuda-cupti-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}" \
|
|
"libnvjitlink-${CUDA_MAJOR_VERSION}-${CUDA_MINOR_VERSION}"
|
|
fi
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
fi
|
|
|
|
# --- 4. cuDSS / NVPL on arm64 + cublas (legacy JetPack / Tegra) ---
|
|
# https://github.com/NVIDIA/Isaac-GR00T/issues/343
|
|
if [ "${BUILD_TYPE:-}" = "cublas" ] && [ "${TARGETARCH:-}" = "arm64" ]; then
|
|
wget "https://developer.download.nvidia.com/compute/cudss/0.6.0/local_installers/cudss-local-tegra-repo-ubuntu${UBUNTU_VERSION}-0.6.0_0.6.0-1_arm64.deb"
|
|
dpkg -i "cudss-local-tegra-repo-ubuntu${UBUNTU_VERSION}-0.6.0_0.6.0-1_arm64.deb"
|
|
cp /var/cudss-local-tegra-repo-ubuntu"${UBUNTU_VERSION}"-0.6.0/cudss-*-keyring.gpg /usr/share/keyrings/
|
|
apt-get update
|
|
apt-get -y install cudss "cudss-cuda-${CUDA_MAJOR_VERSION}"
|
|
wget "https://developer.download.nvidia.com/compute/nvpl/25.5/local_installers/nvpl-local-repo-ubuntu${UBUNTU_VERSION}-25.5_1.0-1_arm64.deb"
|
|
dpkg -i "nvpl-local-repo-ubuntu${UBUNTU_VERSION}-25.5_1.0-1_arm64.deb"
|
|
cp /var/nvpl-local-repo-ubuntu"${UBUNTU_VERSION}"-25.5/nvpl-*-keyring.gpg /usr/share/keyrings/
|
|
apt-get update
|
|
apt-get install -y nvpl
|
|
fi
|
|
|
|
# --- 5. clBLAS (BUILD_TYPE=clblas) ---
|
|
# Present in variant Dockerfiles' from-source path but not in master's
|
|
# Dockerfile.base-grpc-builder. No CI matrix entry currently uses this,
|
|
# but keep parity so a future BUILD_TYPE=clblas build doesn't drift.
|
|
if [ "${BUILD_TYPE:-}" = "clblas" ] && [ "${SKIP_DRIVERS:-false}" = "false" ]; then
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
libclblast-dev
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
fi
|
|
|
|
# --- 6. ROCm / HIP build deps (BUILD_TYPE=hipblas) ---
|
|
if [ "${BUILD_TYPE:-}" = "hipblas" ] && [ "${SKIP_DRIVERS:-false}" = "false" ]; then
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends \
|
|
hipblas-dev \
|
|
hipblaslt-dev \
|
|
rocblas-dev
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
# I have no idea why, but the ROCM lib packages don't trigger ldconfig after they install,
|
|
# which results in local-ai and others not being able to locate the libraries.
|
|
# We run ldconfig ourselves to work around this packaging deficiency.
|
|
ldconfig
|
|
# Log which GPU architectures have rocBLAS kernel support
|
|
echo "rocBLAS library data architectures:"
|
|
(ls /opt/rocm*/lib/rocblas/library/Kernels* 2>/dev/null || ls /opt/rocm*/lib64/rocblas/library/Kernels* 2>/dev/null) | grep -oP 'gfx[0-9a-z+-]+' | sort -u || \
|
|
echo "WARNING: No rocBLAS kernel data found"
|
|
fi
|
|
|
|
echo "TARGETARCH: ${TARGETARCH:-}"
|
|
|
|
# --- 7. protoc (always) ---
|
|
# The version in 22.04 is too old. We will create one as part of installing
|
|
# the GRPC build below but that will also bring in a newer version of absl
|
|
# which stablediffusion cannot compile with. This version of protoc is only
|
|
# here so that we can generate the grpc code for the stablediffusion build.
|
|
if [ "amd64" = "${TARGETARCH:-}" ]; then
|
|
curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v27.1/protoc-27.1-linux-x86_64.zip -o protoc.zip
|
|
unzip -j -d /usr/local/bin protoc.zip bin/protoc
|
|
rm protoc.zip
|
|
fi
|
|
if [ "arm64" = "${TARGETARCH:-}" ]; then
|
|
curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v27.1/protoc-27.1-linux-aarch_64.zip -o protoc.zip
|
|
unzip -j -d /usr/local/bin protoc.zip bin/protoc
|
|
rm protoc.zip
|
|
fi
|
|
|
|
# --- 8. CMake (apt or compiled from source) ---
|
|
# The version in 22.04 is too old. Vulkan path above already pulled cmake
|
|
# via apt; the from-source branch here will install over it which is fine.
|
|
if [ "${CMAKE_FROM_SOURCE:-false}" = "true" ]; then
|
|
curl -L -s "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}.tar.gz" -o cmake.tar.gz
|
|
tar xvf cmake.tar.gz
|
|
( cd "cmake-${CMAKE_VERSION}" && ./configure && make && make install )
|
|
else
|
|
apt-get update
|
|
apt-get install -y \
|
|
cmake
|
|
apt-get clean
|
|
rm -rf /var/lib/apt/lists/*
|
|
fi
|
|
|
|
# --- 9. gRPC compile + install at /opt/grpc ---
|
|
# We install GRPC to a different prefix here so that we can copy in only
|
|
# the build artifacts later — saves several hundred MB on the final docker
|
|
# image size vs copying in the entire GRPC source tree and running
|
|
# `make install` in the target container.
|
|
#
|
|
# The TESTONLY abseil sed patch and /opt/grpc prefix are load-bearing —
|
|
# downstream Dockerfiles `COPY` /opt/grpc to /usr/local (or rely on the
|
|
# prebuilt base having it at /opt/grpc).
|
|
mkdir -p /build
|
|
cd /build
|
|
git clone --recurse-submodules --jobs 4 -b "${GRPC_VERSION}" --depth 1 --shallow-submodules https://github.com/grpc/grpc
|
|
mkdir -p /build/grpc/cmake/build
|
|
cd /build/grpc/cmake/build
|
|
sed -i "216i\\ TESTONLY" "../../third_party/abseil-cpp/absl/container/CMakeLists.txt"
|
|
cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX:PATH=/opt/grpc ../..
|
|
make
|
|
make install
|
|
cd /
|
|
rm -rf /build
|