View Raw Ebuild
# Copyright 2023-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v3
EAPI="8"
ETYPE="sources"
EXTRAVERSION="-cachyos"
# Prevent kernel-2.eclass from setting EXTRAVERSION before incremental patches
K_NOSETEXTRAVERSION="1"
# If RC version, enable below 2 lines
#K_USEPV="1"
#K_PREPATCHED="1"
# Use genpatches-6.15-5 (latest available) + manual upstream patches
K_WANT_GENPATCHES="base extras"
K_GENPATCHES_VER="13"
# Additional upstream incremental patches (kernel.org git diff format, requires -p1)
# Format: "from-to" for patches from /pub/linux/kernel/v6.x/incr/
# Applied in src_unpack right after genpatches, before EXTRAVERSION is set
ADDITIONAL_UPSTREAM_PATCH_VERSIONS=""
# Exclude genpatches that are already included in upstream incremental patches
UNIPATCH_EXCLUDE=""
ZFS_COMMIT="3bf17cf5387fa5e0044a6321e663aead38b45969"
# make sure kernel-2 know right version without guess
CKV="$(ver_cut 1-3)"
inherit kernel-2 optfeature
detect_version
# disable all patch from kernel-2
#UNIPATCH_LIST_DEFAULT=""
DESCRIPTION="Linux EEVDF + LTO + AutoFDO + Propeller Cachy Sauce Kernel by CachyOS with other patches and improvements."
HOMEPAGE="https://github.com/CachyOS/linux-cachyos"
LICENSE="GPL-3"
KEYWORDS="~amd64"
IUSE="
+bore bmq rt rt-bore eevdf
deckify kcfi
+autofdo +propeller
llvm-lto-thin llvm-lto-full +llvm-lto-thin-dist
kernel-builtin-zfs
hz_ticks_100 hz_ticks_250 hz_ticks_300 hz_ticks_500 hz_ticks_600 hz_ticks_750 +hz_ticks_1000
+per-gov tickrate_perodic tickrate_idle +tickrate_full +preempt_full preempt_lazy preempt_voluntary
+o3 os debug +bbr3
+hugepage_always hugepage_madvise
mgeneric mgeneric_v1 mgeneric_v2 mgeneric_v3 mgeneric_v4
+mnative mzen4
"
REQUIRED_USE="
^^ ( bore bmq rt rt-bore eevdf )
propeller? ( !llvm-lto-full )
autofdo? ( || ( llvm-lto-thin llvm-lto-full llvm-lto-thin-dist ) )
?? ( llvm-lto-thin llvm-lto-full llvm-lto-thin-dist )
^^ ( hz_ticks_100 hz_ticks_250 hz_ticks_300 hz_ticks_500 hz_ticks_600 hz_ticks_750 hz_ticks_1000 )
^^ ( tickrate_perodic tickrate_idle tickrate_full )
rt? ( ^^ ( preempt_full preempt_lazy preempt_voluntary ) )
rt-bore? ( ^^ ( preempt_full preempt_lazy preempt_voluntary ) )
?? ( o3 os debug )
^^ ( hugepage_always hugepage_madvise )
?? ( mgeneric mgeneric_v1 mgeneric_v2 mgeneric_v3 mgeneric_v4 mnative mzen4 )
"
# Helper function to build upstream incremental patch URLs
build_upstream_patch_urls() {
local urls=""
local range
for range in ${ADDITIONAL_UPSTREAM_PATCH_VERSIONS}; do
urls+=" https://cdn.kernel.org/pub/linux/kernel/v6.x/incr/patch-${range}.xz"
done
echo "${urls}"
}
RDEPEND+=" autofdo? ( dev-util/perf[libpfm] )"
SRC_URI="
${KERNEL_URI}
${GENPATCHES_URI}
$(build_upstream_patch_urls)
kernel-builtin-zfs? ( https://github.com/cachyos/zfs/archive/$ZFS_COMMIT.tar.gz -> zfs-$ZFS_COMMIT.tar.gz )
"
_set_hztick_rate() {
local _HZ_ticks=$1
if [[ $_HZ_ticks == 300 ]]; then
scripts/config -e HZ_300 --set-val HZ 300 || die
else
scripts/config -d HZ_300 -e "HZ_${_HZ_ticks}" --set-val HZ "${_HZ_ticks}" || die
fi
}
src_unpack() {
# Exclude genpatch that conflicts with BMQ scheduler
# 1810_sched_proxy_yield_the_donor_task.patch changes current->sched_class to rq->donor->sched_class
# which breaks BMQ's patch context for do_sched_yield() and yield_to()
use bmq && UNIPATCH_EXCLUDE+=" 1810_sched_proxy_yield_the_donor_task.patch"
kernel-2_src_unpack
# Apply upstream incremental patches immediately after genpatches
# Must be done here before any other patches modify the source
# kernel-2.eclass unipatch tries -p0 first which fails for git diff patches
cd "${S}" || die
local range
for range in ${ADDITIONAL_UPSTREAM_PATCH_VERSIONS}; do
einfo "Applying upstream incremental patch: patch-${range}"
xz -dc "${DISTDIR}/patch-${range}.xz" | patch -p1 --no-backup-if-mismatch -s || die "Failed to apply patch-${range}"
done
# Set EXTRAVERSION after incremental patches are applied
sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile || die
### Push ZFS to linux
use kernel-builtin-zfs && (unpack zfs-$ZFS_COMMIT.tar.gz && mv zfs-$ZFS_COMMIT zfs || die)
use kernel-builtin-zfs && (cp $FILESDIR/kernel-build.sh . || die)
}
src_prepare() {
files_dir="${FILESDIR}/${PVR}"
eapply "${files_dir}/all/0001-cachyos-base-all.patch"
# Fix AutoFDO/Propeller support for LTO_CLANG_THIN_DIST
# https://github.com/Szowisz/CachyOS-kernels/issues/35
eapply "${FILESDIR}/6.18.10/misc/0002-fix-autofdo-propeller-lto-thin-dist.patch"
if use bore; then
eapply "${files_dir}/sched/0001-bore-cachy.patch"
cp "${files_dir}/config-bore" .config || die
fi
if use bmq; then
eapply "${files_dir}/sched/0001-prjc-cachy.patch"
cp "${files_dir}/config-bmq" .config || die
fi
if use eevdf; then
cp "${files_dir}/config-eevdf" .config || die
fi
if use rt; then
eapply "${files_dir}/misc/0001-rt-i915.patch"
cp "${files_dir}/config-rt-bore" .config || die
fi
if use rt-bore; then
eapply "${files_dir}/misc/0001-rt-i915.patch"
eapply "${files_dir}/sched/0001-bore-cachy.patch"
cp "${files_dir}/config-rt-bore" .config || die
fi
if false; then
eapply "${files_dir}/misc/0001-hardened.patch"
cp "${files_dir}/config-hardened" .config || die
fi
if use deckify; then
cp "${files_dir}/config-deckify" .config || die
scripts/config -d RCU_LAZY_DEFAULT_OFF -e AMD_PRIVATE_COLOR || die
fi
eapply_user
# Remove CachyOS's localversion
#find . -name "localversion*" -delete || die
#scripts/config -u LOCALVERSION || die
### Selecting CachyOS config
scripts/config -e CACHY || die
### Selecting the CPU scheduler
# CachyOS Scheduler (BORE)
if use bore || false; then
scripts/config -e SCHED_BORE || die
fi
if use bmq; then
scripts/config -e SCHED_ALT -e SCHED_BMQ || die
fi
if use rt; then
scripts/config -e PREEMPT_RT || die
fi
if use rt-bore; then
scripts/config -e SCHED_BORE -e PREEMPT_RT || die
fi
### Enable KCFI
if use kcfi; then
scripts/config -e ARCH_SUPPORTS_CFI_CLANG -e CFI -e CFI_CLANG -e CFI_AUTO_DEFAULT || die
else
# https://github.com/openzfs/zfs/issues/15911
scripts/config -d CFI -d CFI_CLANG -e CFI_PERMISSIVE || die
fi
### Select LLVM level
if use llvm-lto-thin; then
scripts/config -e LTO_CLANG_THIN || die
elif use llvm-lto-thin-dist; then
scripts/config -e LTO_CLANG_THIN_DIST || die
elif use llvm-lto-full; then
scripts/config -e LTO_CLANG_FULL || die
else
scripts/config -e LTO_NONE || die
fi
if ! use llvm-lto-thin && ! use llvm-lto-full && ! use llvm-lto-thin-dist; then
scripts/config --set-str DRM_PANIC_SCREEN qr_code -e DRM_PANIC_SCREEN_QR_CODE \
--set-str DRM_PANIC_SCREEN_QR_CODE_URL "https://panic.archlinux.org/panic_report#" \
--set-val CONFIG_DRM_PANIC_SCREEN_QR_VERSION 40 || die
fi
## LLVM patch
if use kcfi || use llvm-lto-thin || use llvm-lto-full || use llvm-lto-thin-dist; then
eapply "${files_dir}/misc/dkms-clang.patch"
fi
### Select tick rate
if use hz_ticks_100; then
_set_hztick_rate 100
elif use hz_ticks_250; then
_set_hztick_rate 250
elif use hz_ticks_300; then
_set_hztick_rate 300
elif use hz_ticks_500; then
_set_hztick_rate 500
elif use hz_ticks_600; then
_set_hztick_rate 600
elif use hz_ticks_750; then
_set_hztick_rate 750
elif use hz_ticks_1000; then
_set_hztick_rate 1000
else
die "Invalid HZ_TICKS use flag. Please select a valid option."
fi
### Select performance governor
if use per-gov; then
scripts/config -d CPU_FREQ_DEFAULT_GOV_SCHEDUTIL -e CPU_FREQ_DEFAULT_GOV_PERFORMANCE || die
fi
### Select tick type
if use tickrate_perodic; then
scripts/config -d NO_HZ_IDLE -d NO_HZ_FULL -d NO_HZ -d NO_HZ_COMMON -e HZ_PERIODIC || die
fi
if use tickrate_idle; then
scripts/config -d HZ_PERIODIC -d NO_HZ_FULL -e NO_HZ_IDLE -e NO_HZ -e NO_HZ_COMMON || die
fi
if use tickrate_full; then
scripts/config -d HZ_PERIODIC -d NO_HZ_IDLE -d CONTEXT_TRACKING_FORCE -e NO_HZ_FULL_NODEF -e NO_HZ_FULL -e NO_HZ -e NO_HZ_COMMON -e CONTEXT_TRACKING || die
fi
### Select preempt type
if use preempt_full; then
scripts/config -e PREEMPT_DYNAMIC -e PREEMPT -d PREEMPT_VOLUNTARY -d PREEMPT_LAZY -d PREEMPT_NONE || die
elif use preempt_lazy; then
scripts/config -e PREEMPT_DYNAMIC -d PREEMPT -d PREEMPT_VOLUNTARY -e PREEMPT_LAZY -d PREEMPT_NONE || die
elif use preempt_voluntary; then
scripts/config -d PREEMPT_DYNAMIC -d PREEMPT -e PREEMPT_VOLUNTARY -d PREEMPT_LAZY -d PREEMPT_NONE || die
else
scripts/config -d PREEMPT_DYNAMIC -d PREEMPT -d PREEMPT_VOLUNTARY -d PREEMPT_LAZY -e PREEMPT_NONE || die
fi
### Enable O3
if use o3; then
scripts/config -d CC_OPTIMIZE_FOR_PERFORMANCE -e CC_OPTIMIZE_FOR_PERFORMANCE_O3 || die
fi
if use os; then
scripts/config -d CC_OPTIMIZE_FOR_PERFORMANCE -e CONFIG_CC_OPTIMIZE_FOR_SIZE || die
fi
if use debug; then
scripts/config -d CC_OPTIMIZE_FOR_PERFORMANCE \
-d CC_OPTIMIZE_FOR_PERFORMANCE_O3 \
-e CONFIG_CC_OPTIMIZE_FOR_SIZE \
-d SLUB_DEBUG \
-d PM_DEBUG \
-d PM_ADVANCED_DEBUG \
-d PM_SLEEP_DEBUG \
-d ACPI_DEBUG \
-d LATENCYTOP \
-d SCHED_DEBUG \
-d DEBUG_PREEMPT || die
fi
### Enable BBR3
if use bbr3; then
scripts/config -m TCP_CONG_CUBIC \
-d DEFAULT_CUBIC \
-e TCP_CONG_BBR \
-e DEFAULT_BBR \
--set-str DEFAULT_TCP_CONG bbr \
-m NET_SCH_FQ_CODEL \
-e NET_SCH_FQ \
-d CONFIG_DEFAULT_FQ_CODEL \
-e CONFIG_DEFAULT_FQ || die
fi
### Select THP
if use hugepage_always; then
scripts/config -d TRANSPARENT_HUGEPAGE_MADVISE -e TRANSPARENT_HUGEPAGE_ALWAYS || die
fi
if use hugepage_madvise; then
scripts/config -d TRANSPARENT_HUGEPAGE_ALWAYS -e TRANSPARENT_HUGEPAGE_MADVISE || die
fi
### Select CPU optimization
march_list=(mgeneric mgeneric_v1 mgeneric_v2 mgeneric_v3 mgeneric_v4 mnative mzen4)
march_found=false
for MMARCH in "${march_list[@]}"; do
if use "${MMARCH}"; then
MARCH_TRIMMED=${MMARCH:1}
MARCH=$(echo "$MARCH_TRIMMED" | tr '[:lower:]' '[:upper:]')
case "$MARCH" in
GENERIC_V[1-4])
scripts/config -e GENERIC_CPU -d MZEN4 -d X86_NATIVE_CPU \
--set-val X86_64_VERSION "${MARCH//GENERIC_V/}" || die
;;
ZEN4)
scripts/config -d GENERIC_CPU -e MZEN4 -d X86_NATIVE_CPU || die
;;
NATIVE)
scripts/config -d GENERIC_CPU -d MZEN4 -e X86_NATIVE_CPU || die
;;
esac
march_found=true
break
fi
done
if [ "$march_found" = false ]; then
scripts/config -d GENERIC_CPU -d MZEN4 -e X86_NATIVE_CPU || die
fi
### Enable USER_NS_UNPRIVILEGED
scripts/config -e USER_NS || die
### Enable Clang AutoFDO
if use autofdo; then
scripts/config -e AUTOFDO_CLANG || die
fi
### Propeller Optimization
if use propeller; then
scripts/config -e PROPELLER_CLANG || die
fi
### Change hostname
scripts/config --set-str DEFAULT_HOSTNAME "gentoo" || die
### Set LOCALVERSION
#scripts/config --set-str LOCALVERSION "${PVR}" || die
}
pkg_postinst() {
kernel-2_pkg_postinst
optfeature "userspace KSM helper" sys-process/uksmd
optfeature "NVIDIA opensource module" "x11-drivers/nvidia-drivers[kernel-open]"
optfeature "NVIDIA module" x11-drivers/nvidia-drivers
optfeature "ZFS support" sys-fs/zfs
optfeature "sched_ext schedulers" sys-kernel/scx-loader
if use kernel-builtin-zfs; then
ewarn "WARNING: You are using kernel-builtin-zfs USE flag."
ewarn "It is STRONGLY RECOMMENDED to use sys-fs/zfs instead of building ZFS into the kernel."
ewarn "sys-fs/zfs provides better compatibility and easier updates."
ewarn "ZFS support build way: https://github.com/CachyOS/linux-cachyos/blob/f843b48b52fb52c00f76b7d29f70ba1eb2b4cc06/linux-cachyos-server/PKGBUILD#L573, and you can check linux/kernel-build.sh as example"
fi
(use autofdo || use propeller) && ewarn "AutoFDO support build way: https://cachyos.org/blog/2411-kernel-autofdo, and you can check https://github.com/xz-dev/kernel-autofdo-container as example"
}
pkg_postrm() {
kernel-2_pkg_postrm
}
# 5ece16c7b4a7d1261da68153cafc318a60b78ce8