core/linux/ndmake.sh
$ cat ndmake.sh
#!/bin/sh -ue
NAME=linux
VERSION=6.18.2
RELEASE=1
SOURCE="https://github.com/xplshn/linox/archive/refs/tags/linox-${VERSION}.tar.gz
    https://codeberg.org/derivelinux/derive/raw/branch/main/config/kernel.config::noextract
    byacc-genksyms.patch"
PREFIX=""

_host_arch_to_karch() {
    case "${ARCH:-$(uname -m)}" in
        x86_64|amd64) printf '%s\n' x86 ;;
        i?86)         printf '%s\n' x86 ;;
        aarch64)      printf '%s\n' arm64 ;;
        arm*)         printf '%s\n' arm ;;
        riscv64)      printf '%s\n' riscv ;;
        ppc64*)       printf '%s\n' powerpc ;;
        s390x)        printf '%s\n' s390 ;;
        mips*)        printf '%s\n' mips ;;
        *)            printf '%s\n' "${ARCH:-$(uname -m)}" ;;
    esac
}

detect_kernel_compressor() {
    for c in zstd lz4 lzop xz gzip bzip2 lzma; do
        if command -v "$c" >/dev/null 2>&1; then
            printf '%s\n' "$c"
            return 0
        fi
    done
    return 1
}

compressor_to_kconfig() {
    case "$1" in
        zstd)   printf '%s\n' CONFIG_KERNEL_ZSTD ;;
        lz4)    printf '%s\n' CONFIG_KERNEL_LZ4 ;;
        lzop)   printf '%s\n' CONFIG_KERNEL_LZO ;;
        xz)     printf '%s\n' CONFIG_KERNEL_XZ ;;
        gzip)   printf '%s\n' CONFIG_KERNEL_GZIP ;;
        bzip2)  printf '%s\n' CONFIG_KERNEL_BZIP2 ;;
        lzma)   printf '%s\n' CONFIG_KERNEL_LZMA ;;
        *)      return 1 ;;
    esac
}

build() {
    msg "building linux kernel (linox)..."
    SRCDIR="$SRC/linox-linox-${VERSION}"
    [ -d "$SRCDIR" ] || die "source dir missing: $SRCDIR"
    if [ -f "$SRC/kernel.config" ]; then
        CONFIG_SRC="$SRC/kernel.config"
    elif [ -f "$SRC/kernel.config.tar.gz" ]; then
        CONFIG_SRC="$SRC/kernel.config.tar.gz"
    else
        die "kernel.config missing in $SRC"
    fi

    cd "$SRCDIR"
    KARCH="$(_host_arch_to_karch)"

    # Reflex treats %option full as -Cf, which conflicts with yylineno.
    sed -i 's/ full ecs/ ecs/' scripts/kconfig/lexer.l
    # byacc's header may not declare yylval; ensure it's available.
    sed -i '/#include "parse.tab.h"/a\
#ifndef YYLVAL_IS_DECLARED\
extern YYSTYPE yylval;\
#define YYLVAL_IS_DECLARED 1\
#endif\
#ifndef YY_FLEX_MAJOR_VERSION\
int yy_flex_debug;\
#endif' scripts/genksyms/lex.l
    # Ensure yy_flex_debug has a global weak definition on fresh trees.
    if ! grep -q 'yy_flex_debug' scripts/genksyms/genksyms.c; then
        sed -i '1i __attribute__((weak)) int yy_flex_debug;' \
            scripts/genksyms/genksyms.c
    else
        if ! grep -q '__attribute__((weak)) int yy_flex_debug;' scripts/genksyms/genksyms.c; then
            sed -i '1i __attribute__((weak)) int yy_flex_debug;' \
                scripts/genksyms/genksyms.c
        fi
    fi

    ln -sf "$CONFIG_SRC" .deriveconfig
    cp .deriveconfig .config

    if ! COMPRESSOR="$(detect_kernel_compressor)"; then
        die "no supported kernel compressor found"
    fi

    gmake \
        ARCH="$KARCH" \
        HOSTCC="${CC:-cc} -static" \
        YACC="${YACC:-yacc}" \
        LEX="${LEX:-lex}" \
        LEXFLAGS= \
        FLEXFLAGS= \
        olddefconfig

    KC_SYM="$(compressor_to_kconfig "$COMPRESSOR")"

    sed -i \
        -e 's/^CONFIG_KERNEL_\(GZIP\|BZIP2\|LZMA\|XZ\|LZO\|LZ4\|ZSTD\)=y/# CONFIG_KERNEL_\1 is not set/' \
        .config
    printf '%s=y\n' "$KC_SYM" >> .config

    gmake \
        -j"$NPROC" \
        ARCH="$KARCH" \
        CC="${CC:-cc}" \
        HOSTCC="${CC:-cc} -static" \
        YACC="${YACC:-yacc}" \
        LEX="${LEX:-lex}" \
        LEXFLAGS= \
        FLEXFLAGS=

    gmake \
        ARCH="$KARCH" \
        INSTALL_MOD_PATH="$PKG$PREFIX" \
        DEPMOD=/bin/true \
        modules_install

    if [ "$PREFIX" = "/" ] || [ -z "$PREFIX" ]; then
        BOOT_DIR="/boot"
    else
        BOOT_DIR="$PREFIX/boot"
    fi
    PKG_BOOT_DIR="$PKG$BOOT_DIR"
    mkdir -p "$PKG_BOOT_DIR"

    case "$KARCH" in
        x86)
            install -m0644 arch/x86/boot/bzImage \
                "$PKG_BOOT_DIR/vmlinuz-${VERSION}-linux"
            ;;
        arm64)
            install -m0644 arch/arm64/boot/Image \
                "$PKG_BOOT_DIR/Image-${VERSION}-linux"
            ;;
        arm)
            install -m0644 arch/arm/boot/zImage \
                "$PKG_BOOT_DIR/zImage-${VERSION}-linux"
            ;;
        *)
            die "unsupported arch install path"
            ;;
    esac

    ln -sfT "$PKG_BOOT_DIR/zImage-${VERSION}-linux" "$PKG_BOOT_DIR/vmlinuz"
    install -m0644 System.map \
        "$PKG_BOOT_DIR/System.map-${VERSION}-linux"
    install -m0644 .config \
        "$PKG_BOOT_DIR/config-${VERSION}-linux"
}

. ${0%/*}/../../libsh/libdmake.sh