#!/bin/sh set -e SRCDIR=/usr/src KERNFRAG=${KERNFRAG:-/etc/kernfrag} errx() { printf "kern: %s\n" "$@" >&2 exit 1 } has_boot_mount() { awk '{print $2}' /etc/fstab | grep -q ^/boot$ } is_boot_mounted() { mountpoint -q /boot } get_latest_kernel() { eselect --brief kernel list | tail -n1 } get_current_kernel() { basename "$(eselect --brief kernel show 2>/dev/null)" } set_kernel() { kern=${1:-$(get_latest_kernel)} current=$(get_current_kernel) kerndir=$SRCDIR/$kern if test ! -d "$kerndir"; then errx "No such file or directory: $kerndir" fi if test "$kern" = "$current"; then errx "Latest kernel already selected: $kern" fi printf "Selecting kernel: %s\n" "$kern" sudo eselect kernel set "$kern" sudo chown -R "$(id -un)":"$(id -gn)" "$kerndir" } config_kernel() { host=${1:-$(hostname)} if test ! -d "$KERNFRAG"; then errx "No such file or directory: $KERNFRAG" fi printf "Starting merge for %s...\n\n" "$host" awk -v prefix="$KERNFRAG/fragments/" '{print prefix $0}' \ "$KERNFRAG/templates/base" "$KERNFRAG/templates/$host" | xargs scripts/kconfig/merge_config.sh } diff_kernel() { diff=${1:-/proc/config.gz} nvim -d .config "$diff" } build_kernel() { make -j"$(nproc)" } install_kernel() { if has_boot_mount && ! is_boot_mounted; then sudo mount /boot fi sudo make install modules_install } post_install_kernel() { sudo emerge --ask=n @module-rebuild } clean_kernel() { sudo eclean-kernel -An3 } test_diff() { dt=$(mktemp) zcat /proc/config.gz | sed -nE '/^(# )?CONFIG_.*/p' > "$dt" sed -nE '/^(# )?CONFIG_.*/p' .config | diff -q "$dt" - diffr=$? rm -f "$dt" if test $diffr -ne 0; then diff_kernel printf "Continue? [y/N] " read -r response if test "$response" = "y"; then return 0 fi fi return $diffr } all() { set_kernel cd /usr/src/linux config_kernel test_diff build_kernel install_kernel post_install_kernel clean_kernel } if test $# -eq 0; then all exit 0 fi cmd=$1 shift case $cmd in set) set_kernel "$@";; config) config_kernel "$@";; diff) diff_kernel "$@";; build) build_kernel;; install) install_kernel;; postinst) post_install_kernel;; clean) clean_kernel;; all) all;; esac