View Raw Ebuild
# Copyright 2023-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v3
EAPI=8
KERNEL_IUSE_GENERIC_UKI=1
inherit kernel-install toolchain-funcs
# CachyOS release number mapping: Gentoo -rN -> CachyOS pkgrel
# -r0 (no revision) -> 1, -r1 -> 2, etc.
CACHYOS_PR="$((${PR#r} + 1))"
# CachyOS pre-patched source tarball (needed for modules_prepare)
MY_P="cachyos-$(ver_cut 1-3)-${CACHYOS_PR}"
# Binary package version string: {pkgver}-{pkgrel}
BINPKG_VER="${PV}-${CACHYOS_PR}"
# Mirror base URLs
MIRROR_V3="https://mirror.cachyos.org/repo/x86_64_v3/cachyos-v3"
DESCRIPTION="Pre-built CachyOS Linux kernel (BORE, LTO, BBR3 and more)"
HOMEPAGE="
https://github.com/CachyOS/linux-cachyos
https://github.com/Szowisz/CachyOS-kernels
"
# Source tarball (shared by all variants, needed for modules_prepare)
SRC_URI="
https://github.com/CachyOS/linux/releases/download/${MY_P}/${MY_P}.tar.gz
"
# Binary packages per variant (x86_64_v3 only for this version)
# Naming: linux-cachyos[-variant][-lto]-{ver}-{pkgrel}-{arch}.pkg.tar.zst
# The default "bore + lto" = "linux-cachyos" (no variant suffix in package name)
# Note: bmq excluded - not available at 6.19.10 on mirrors
SRC_URI+="
bore? (
lto? ( !gcc? (
${MIRROR_V3}/linux-cachyos-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
) )
!lto? ( !gcc? (
${MIRROR_V3}/linux-cachyos-bore-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-bore-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
) )
gcc? (
${MIRROR_V3}/linux-cachyos-gcc-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-gcc-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
eevdf? (
lto? (
${MIRROR_V3}/linux-cachyos-eevdf-lto-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-eevdf-lto-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
!lto? (
${MIRROR_V3}/linux-cachyos-eevdf-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-eevdf-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
hardened? (
lto? (
${MIRROR_V3}/linux-cachyos-hardened-lto-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-hardened-lto-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
!lto? (
${MIRROR_V3}/linux-cachyos-hardened-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-hardened-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
rt-bore? (
lto? (
${MIRROR_V3}/linux-cachyos-rt-bore-lto-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-rt-bore-lto-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
!lto? (
${MIRROR_V3}/linux-cachyos-rt-bore-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-rt-bore-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
deckify? (
lto? (
${MIRROR_V3}/linux-cachyos-deckify-lto-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-deckify-lto-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
!lto? (
${MIRROR_V3}/linux-cachyos-deckify-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-deckify-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
server? (
lto? (
${MIRROR_V3}/linux-cachyos-server-lto-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-server-lto-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
!lto? (
${MIRROR_V3}/linux-cachyos-server-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
${MIRROR_V3}/linux-cachyos-server-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst
)
)
"
S="${WORKDIR}"
LICENSE="GPL-2"
KEYWORDS="~amd64"
IUSE="+bore eevdf hardened rt-bore deckify server +lto gcc debug"
REQUIRED_USE="
^^ ( bore eevdf hardened rt-bore deckify server )
?? ( lto gcc )
gcc? ( bore )
"
RDEPEND="
!sys-kernel/cachyos-kernel:${SLOT}
"
BDEPEND="
app-alternatives/bc
app-alternatives/lex
dev-util/pahole
virtual/libelf
app-alternatives/yacc
lto? (
llvm-core/llvm
llvm-core/clang
llvm-core/lld
)
"
PDEPEND="
>=virtual/dist-kernel-${PV}
"
QA_PREBUILT='*'
# Compute the CachyOS variant suffix (matches localversion.20-pkgname in PKGBUILD)
# This determines the kernel release string: {PV}-{PR}-{suffix}
_cachyos_variant_suffix() {
if use bore; then
if use lto; then echo "cachyos"
elif use gcc; then echo "cachyos-gcc"
else echo "cachyos-bore"
fi
elif use eevdf; then
use lto && echo "cachyos-eevdf-lto" || echo "cachyos-eevdf"
elif use hardened; then
use lto && echo "cachyos-hardened-lto" || echo "cachyos-hardened"
elif use rt-bore; then
use lto && echo "cachyos-rt-bore-lto" || echo "cachyos-rt-bore"
elif use deckify; then
use lto && echo "cachyos-deckify-lto" || echo "cachyos-deckify"
elif use server; then
use lto && echo "cachyos-server-lto" || echo "cachyos-server"
fi
}
# Compute distfile name for the binary kernel package
_cachyos_bin_distfile() {
local variant=""
if use bore; then
if use lto; then variant=""
elif use gcc; then variant="-gcc"
else variant="-bore"
fi
elif use eevdf; then
use lto && variant="-eevdf-lto" || variant="-eevdf"
elif use hardened; then
use lto && variant="-hardened-lto" || variant="-hardened"
elif use rt-bore; then
use lto && variant="-rt-bore-lto" || variant="-rt-bore"
elif use deckify; then
use lto && variant="-deckify-lto" || variant="-deckify"
elif use server; then
use lto && variant="-server-lto" || variant="-server"
fi
echo "linux-cachyos${variant}-${BINPKG_VER}-x86_64_v3.pkg.tar.zst"
}
# Compute distfile name for the binary headers package
_cachyos_headers_distfile() {
local variant=""
if use bore; then
if use lto; then variant=""
elif use gcc; then variant="-gcc"
else variant="-bore"
fi
elif use eevdf; then
use lto && variant="-eevdf-lto" || variant="-eevdf"
elif use hardened; then
use lto && variant="-hardened-lto" || variant="-hardened"
elif use rt-bore; then
use lto && variant="-rt-bore-lto" || variant="-rt-bore"
elif use deckify; then
use lto && variant="-deckify-lto" || variant="-deckify"
elif use server; then
use lto && variant="-server-lto" || variant="-server"
fi
echo "linux-cachyos${variant}-headers-${BINPKG_VER}-x86_64_v3.pkg.tar.zst"
}
# Set KV_FULL and KV_LOCALVERSION based on USE flags
_cachyos_setup_kv() {
local suffix=$(_cachyos_variant_suffix)
KV_LOCALVERSION="-${CACHYOS_PR}-${suffix}"
KV_FULL="${PV}${KV_LOCALVERSION}"
}
pkg_setup() {
_cachyos_setup_kv
}
src_unpack() {
# Unpack the CachyOS kernel source tarball (for modules_prepare)
unpack "${MY_P}.tar.gz"
# Unpack the binary kernel package (pacman .pkg.tar.zst format)
mkdir -p "${WORKDIR}/binpkg" || die
tar -C "${WORKDIR}/binpkg" -xf "${DISTDIR}/$(_cachyos_bin_distfile)" || die
# Unpack the binary headers package
mkdir -p "${WORKDIR}/headerspkg" || die
tar -C "${WORKDIR}/headerspkg" -xf "${DISTDIR}/$(_cachyos_headers_distfile)" || die
}
src_prepare() {
_cachyos_setup_kv
cd "${WORKDIR}/${MY_P}" || die
# Set localversion files to match the CachyOS binary exactly
# These determine the kernel release string (uname -r)
echo "-${CACHYOS_PR}" > localversion.10-pkgrel || die
echo "-$(_cachyos_variant_suffix)" > localversion.20-pkgname || die
default
}
src_configure() {
_cachyos_setup_kv
# Determine the headers build directory from the binary package
local headers_build="${WORKDIR}/headerspkg/usr/lib/modules/${KV_FULL}/build"
if [[ ! -d "${headers_build}" ]]; then
# Try to auto-detect the module directory name
local moddir
moddir=( "${WORKDIR}/headerspkg/usr/lib/modules"/*/ )
if [[ ${#moddir[@]} -eq 1 && -d "${moddir[0]}/build" ]]; then
headers_build="${moddir[0]}/build"
# Update KV_FULL to match what was actually in the package
local detected_kv="${moddir[0]%/}"
detected_kv="${detected_kv##*/}"
ewarn "Auto-detected kernel version: ${detected_kv}"
ewarn "Expected: ${KV_FULL}"
KV_FULL="${detected_kv}"
KV_LOCALVERSION="${KV_FULL#${PV}}"
else
die "Cannot find headers build directory. Expected: ${headers_build}"
fi
fi
# Set up toolchain for modules_prepare
local HOSTLD="$(tc-getBUILD_LD)"
if type -P "${HOSTLD}.bfd" &>/dev/null; then
HOSTLD+=.bfd
fi
local LD="$(tc-getLD)"
if type -P "${LD}.bfd" &>/dev/null; then
LD+=.bfd
fi
tc-export_build_env
local makeargs=(
V=1
WERROR=0
HOSTCC="$(tc-getBUILD_CC)"
HOSTCXX="$(tc-getBUILD_CXX)"
HOSTLD="${HOSTLD}"
HOSTAR="$(tc-getBUILD_AR)"
HOSTCFLAGS="${BUILD_CFLAGS}"
HOSTLDFLAGS="${BUILD_LDFLAGS}"
ARCH="$(tc-arch-kernel)"
O="${WORKDIR}/modprep"
)
# For LTO kernels, use Clang toolchain
if use lto; then
makeargs+=(
LLVM=1
LLVM_IAS=1
CC=clang
LD=ld.lld
AR=llvm-ar
NM=llvm-nm
OBJCOPY=llvm-objcopy
OBJDUMP=llvm-objdump
READELF=llvm-readelf
STRIP=llvm-strip
)
else
makeargs+=(
CROSS_COMPILE=${CHOST}-
AS="$(tc-getAS)"
CC="$(tc-getCC)"
LD="${LD}"
AR="$(tc-getAR)"
NM="$(tc-getNM)"
STRIP="$(tc-getSTRIP)"
OBJCOPY="$(tc-getOBJCOPY)"
OBJDUMP="$(tc-getOBJDUMP)"
READELF="$(tc-getREADELF)"
)
fi
# Copy .config from the binary headers package
mkdir "${WORKDIR}/modprep" || die
cp "${headers_build}/.config" "${WORKDIR}/modprep/" || die
# Run modules_prepare on the source tree to compile build tools
# for the local system (needed for out-of-tree module building)
emake -C "${WORKDIR}/${MY_P}" "${makeargs[@]}" modules_prepare
}
src_test() {
_cachyos_setup_kv
local binpkg_modules="${WORKDIR}/binpkg/usr/lib/modules/${KV_FULL}"
local headers_build="${WORKDIR}/headerspkg/usr/lib/modules/${KV_FULL}/build"
kernel-install_test "${KV_FULL}" \
"${binpkg_modules}/vmlinuz" \
"${binpkg_modules}" \
"${headers_build}/.config"
}
src_install() {
_cachyos_setup_kv
local rel_kernel_dir="/usr/src/linux-${KV_FULL}"
local binpkg_modules="${WORKDIR}/binpkg/usr/lib/modules/${KV_FULL}"
local headers_build="${WORKDIR}/headerspkg/usr/lib/modules/${KV_FULL}/build"
# --- Install kernel modules from binary package ---
dodir "/lib/modules/${KV_FULL}"
# Copy module tree (kernel/, modules.order, modules.builtin, etc.)
local f
for f in "${binpkg_modules}"/*; do
local fname="${f##*/}"
# Skip build/source symlinks from pacman package
[[ "${fname}" == "build" || "${fname}" == "source" ]] && continue
# Skip vmlinuz (installed separately to source tree)
[[ "${fname}" == "vmlinuz" ]] && continue
# Skip pkgbase (pacman-specific)
[[ "${fname}" == "pkgbase" ]] && continue
cp -a "${f}" "${ED}/lib/modules/${KV_FULL}/" || die
done
# Create build/source symlinks (kernel-install_pkg_preinst will fix them)
dosym "../../../src/linux-${KV_FULL}" "/lib/modules/${KV_FULL}/build"
dosym "../../../src/linux-${KV_FULL}" "/lib/modules/${KV_FULL}/source"
# --- Install kernel source tree ---
dodir "${rel_kernel_dir}"
# Install kernel image at the standard dist-kernel location
insinto "${rel_kernel_dir}/arch/x86/boot"
newins "${binpkg_modules}/vmlinuz" bzImage
# Install System.map and .config from headers package
insinto "${rel_kernel_dir}"
doins "${headers_build}/System.map"
doins "${headers_build}/.config"
# Install vmlinux from headers (for debugging)
if [[ -f "${headers_build}/vmlinux" ]]; then
doins "${headers_build}/vmlinux"
fi
# --- Install modprep (prepared build tools for out-of-tree modules) ---
# Strip build artifacts from modprep, then overlay onto source tree
find "${WORKDIR}/modprep" -type f '(' \
-name Makefile -o \
-name '*.[ao]' -o \
'(' -name '.*' -a -not -name '.config' ')' \
')' -delete || die
rm -f "${WORKDIR}/modprep/source" 2>/dev/null
cp -p -R "${WORKDIR}/modprep/." "${ED}${rel_kernel_dir}/" || die
# --- Set dist-kernel identification ---
echo "${CATEGORY}/${PF}:${SLOT}" > "${ED}${rel_kernel_dir}/dist-kernel" || die
# Update timestamps on all modules
find "${ED}/lib" -name '*.ko' -o -name '*.ko.zst' -exec touch {} + 2>/dev/null || true
# Modules were already stripped by CachyOS
dostrip -x /lib/modules
kernel-install_compress_modules
if use debug; then
dostrip -x "${rel_kernel_dir}/vmlinux"
fi
}
pkg_preinst() {
_cachyos_setup_kv
kernel-install_pkg_preinst
}
pkg_postinst() {
_cachyos_setup_kv
kernel-install_pkg_postinst
ewarn ""
ewarn "${PN} is a pre-built CachyOS kernel from CachyOS mirrors."
ewarn "It is *not* supported by the Gentoo Kernel Project or CachyOS."
ewarn "If you need support, contact the overlay maintainer."
ewarn "Do *not* open bugs in Gentoo's bugzilla."
ewarn ""
ewarn "This kernel is built for x86-64-v3 (requires AVX2)."
ewarn "If your CPU does not support x86-64-v3, use sys-kernel/cachyos-kernel instead."
ewarn ""
}
pkg_postrm() {
_cachyos_setup_kv
kernel-install_pkg_postrm
}