# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
ROCM_VERSION="6.3"
inherit cmake cuda rocm linux-info
# Upstream publishes no usable release tags: the repository carries exactly one
# tag (t0002, a prerelease from 2025-07-22) and nothing resembling the b<N>
# series sci-ml/llama-cpp pins to. The package is therefore pinned to a dated
# commit snapshot, following sys-kernel/linux-firmware and app-editors/zed.
#
# Pinned commit de55d9e2f6c24d3f0c8a8a2a296e486b2ccf80b2, committed
# 2026-07-25 -- the date stamp in ${PV} is that committer date. The variable is
# named GIT_COMMIT because that is one of the names bentoolkit's commit applier
# rewrites (EGIT_COMMIT/GIT_COMMIT/BUILD_ID/COMMIT); under any other name the
# autoupdate bumps ${PV} and leaves the SHA stale, which silently ships the old
# tree under the new date stamp.
GIT_COMMIT="5f063b7bbae8f9a34dfc5c704aa77939e76494a9"
DESCRIPTION="llama.cpp fork with additional SOTA quants and improved performance"
HOMEPAGE="https://github.com/ikawrakow/ik_llama.cpp"
SRC_URI="https://github.com/ikawrakow/ik_llama.cpp/archive/${GIT_COMMIT}.tar.gz -> ${P}.tar.gz"
S="${WORKDIR}/ik_llama.cpp-${GIT_COMMIT}"
LICENSE="MIT"
SLOT="0"
# Deliberately ~amd64 only, unlike sci-ml/llama-cpp. The fork's reason to
# exist is its SOTA quantizations, which are hand-written for AVX2/AVX512; the
# ARM paths are far less exercised upstream and this snapshot has never been
# built on arm64. Promote only after a real arm64 chroot build.
KEYWORDS="~amd64"
# Only the flags this fork's ggml actually honours are exposed. It predates
# the GGML_SSE42/GGML_BMI2/GGML_AMX_* options that sci-ml/llama-cpp drives, and
# spells AVX-VNNI "GGML_AVXVNNI" rather than "GGML_AVX_VNNI".
X86_CPU_FLAGS=(
avx
avx_vnni
avx2
avx512f avx512cd avx512vl avx512dq avx512bw
avx512vbmi
avx512_vnni
avx512_bf16
fma3
f16c
)
CPU_FLAGS=( "${X86_CPU_FLAGS[@]/#/cpu_flags_x86_}" )
IUSE="curl cuda +openmp hip vulkan ${CPU_FLAGS[*]}"
REQUIRED_USE="
hip? ( ${ROCM_REQUIRED_USE} )
"
# curl is needed for pulling models from huggingface
CDEPEND="
curl? ( net-misc/curl:= )
openmp? ( llvm-runtimes/openmp:= )
hip? (
>=dev-util/hip-${ROCM_VERSION}
>=sci-libs/hipBLAS-${ROCM_VERSION}
>=sci-libs/rocBLAS-${ROCM_VERSION}
)
cuda? ( dev-util/nvidia-cuda-toolkit:= )
"
DEPEND="${CDEPEND}
vulkan? ( dev-util/vulkan-headers )
"
RDEPEND="${CDEPEND}
vulkan? ( media-libs/vulkan-loader )
"
BDEPEND="
vulkan? ( media-libs/shaderc )
"
pkg_setup() {
if use hip; then
linux-info_pkg_setup
if linux-info_get_any_version && linux_config_exists; then
if ! linux_chkconfig_present HSA_AMD_SVM; then
ewarn "To use ROCm/HIP, you need to have HSA_AMD_SVM option enabled in your kernel."
fi
fi
fi
}
src_prepare() {
use cuda && cuda_src_prepare
cmake_src_prepare
# build-info.cmake sets BUILD_NUMBER/BUILD_COMMIT as plain variables, which
# shadow anything passed as -DBUILD_NUMBER=/-DBUILD_COMMIT= on the command
# line, and its git probe finds no repository inside a release tarball.
# Patch the defaults instead, so the installed binaries report the snapshot
# they were built from rather than "build 0 (unknown)".
sed -i \
-e "s/^set(BUILD_NUMBER 0)$/set(BUILD_NUMBER ${PV#0_pre})/" \
-e "s/^set(BUILD_COMMIT \"unknown\")$/set(BUILD_COMMIT \"${GIT_COMMIT:0:7}\")/" \
cmake/build-info.cmake || die
}
src_configure() {
local mycmakeargs=(
-DCMAKE_SKIP_BUILD_RPATH=ON
-DGGML_CCACHE=OFF
-DLLAMA_BUILD_TESTS=OFF
-DLLAMA_BUILD_EXAMPLES=ON
-DLLAMA_BUILD_SERVER=ON
-DLLAMA_CURL=$(usex curl)
-DGGML_RPC=ON
-DGGML_CUDA=$(usex cuda)
-DGGML_OPENMP=$(usex openmp)
-DGGML_VULKAN=$(usex vulkan)
# find_package(NCCL) is automagic here: with USE=cuda it silently links
# whatever NCCL is lying around, and there is no dependency to express
# it. Keep the build reproducible instead.
-DGGML_NCCL=OFF
-DGGML_NATIVE=OFF
-DGGML_AVX=$(usex cpu_flags_x86_avx)
-DGGML_AVX2=$(usex cpu_flags_x86_avx2)
-DGGML_AVXVNNI=$(usex cpu_flags_x86_avx_vnni)
-DGGML_AVX512_VBMI=$(usex cpu_flags_x86_avx512vbmi)
-DGGML_AVX512_VNNI=$(usex cpu_flags_x86_avx512_vnni)
-DGGML_AVX512_BF16=$(usex cpu_flags_x86_avx512_bf16)
-DGGML_FMA=$(usex cpu_flags_x86_fma3)
-DGGML_F16C=$(usex cpu_flags_x86_f16c)
# Keep out of the way of sci-ml/llama-cpp, which installs libggml.so and
# libllama.so under the default libdir.
-DCMAKE_INSTALL_LIBDIR="${EPREFIX}/usr/$(get_libdir)/ik_llama.cpp"
-DCMAKE_INSTALL_RPATH="${EPREFIX}/usr/$(get_libdir)/ik_llama.cpp"
)
# ggml gates the whole AVX512 foundation behind a single option.
if use cpu_flags_x86_avx512f &&
use cpu_flags_x86_avx512cd &&
use cpu_flags_x86_avx512vl &&
use cpu_flags_x86_avx512dq &&
use cpu_flags_x86_avx512bw; then
mycmakeargs+=( -DGGML_AVX512=ON )
else
mycmakeargs+=( -DGGML_AVX512=OFF )
fi
if use cuda; then
local -x CUDAHOSTCXX="$(cuda_gccdir)"
# tries to recreate dev symlinks
cuda_add_sandbox
addpredict "/dev/char/"
fi
if use hip; then
export HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)"
mycmakeargs+=(
-DAMDGPU_TARGETS="$(get_amdgpu_flags)"
# This fork predates the GGML_HIP rename; the option it actually
# reads is GGML_HIPBLAS. -DGGML_HIP=ON is silently ignored.
-DGGML_HIPBLAS=ON
)
fi
cmake_src_configure
}
src_install() {
cmake_src_install
# The headers are the same llama.h/ggml*.h that sci-ml/llama-cpp installs,
# so this package ships no development files at all.
rm -r "${ED}/usr/include" || die
# llama.pc goes to a hardcoded lib/pkgconfig, escaping the isolated libdir
# set above, and it describes the headers just removed.
rm -r "${ED}/usr/lib/pkgconfig" || die
# Every binary is named llama-* upstream, exactly as in sci-ml/llama-cpp.
local f
shopt -s nullglob
for f in "${ED}"/usr/bin/*; do
mv "${f}" "${ED}/usr/bin/ik_${f##*/}" || die
done
shopt -u nullglob
}