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
