2024-03-10 16:04:07 +01:00
#!/bin/bash
set -eo pipefail
# Banner
echo " _ _ _ _ _ _ _ _ "
echo " (_)___| |_ _ __ ___ | | _____ _ __ _ __ ___| | ___ _ __ | |_(_)_ __ ___ (_)_______ __| |"
echo " | / __| __| '_ \` _ \\ _____| |/ / _ \\ '__| '_ \\ / _ \\ |_____ / _ \\| '_ \\| __| | '_ \` _ \\| |_ / _ \\/ _\` |"
echo " | \\__ \\ |_| | | | | |_____| < __/ | | | | | __/ |_____| (_) | |_) | |_| | | | | | | |/ / __/ (_| |"
echo " _/ |___/\\__|_| |_| |_| |_|\\_\\___|_| |_| |_|\\___|_| \\___/| .__/ \\__|_|_| |_| |_|_/___\\___|\\__,_|"
echo "|__/ |_|"
echo ""
# Variables
export "BUILDTOOL_REPOSITORY=https://git.staropensource.de/JeremyStarTM/kernel-optimized.git"
export "BUILDTOOL_PACKAGES=base-devel git rustup"
export "BUILDTOOL_CLONEDIR=jstm-kernel-optimized"
2024-03-10 21:14:12 +01:00
export " BUILDTOOL_BUILDCMDLINE=nice -20 env MAKEFLAGS=-j $( nproc) "
2024-03-10 16:04:07 +01:00
# Checks
## Check for Arch Linux
(
source "/etc/os-release"
if [ " ${ NAME } " != "Arch Linux" ] || [ " ${ PRETTY_NAME } " != "Arch Linux" ] || [ " ${ ID } " != "arch" ] ; then
if [ " ${ BUILDTOOL_COMPILE_NONARCH } " != "true" ] ; then
echo ":: Error: Not running on Arch Linux."
echo " This kernel can only compile on Arch Linux."
echo " If you are sure that you want to compile this kernel on other distributions"
echo " set the \$BUILDTOOL_COMPILE_NONARCH environment variable to \"true\""
exit 1
else
echo ":: Warning: Compiling on a non-arch distribution. This may lead to unexpected errors!"
fi
fi
)
## Check for root
if [ " ${ UID } " = = "0" ] ; then
echo ":: Error: Can't build kernel as root."
echo " Please create a new user for building the kernel."
exit 1
fi
## Check for sudo
if ! which sudo & > /dev/null; then
echo ":: Error: Could not find sudo in \$PATH."
echo " Please ensure that you have sudo installed."
exit 1
fi
# Questions
## Ask if mold should replace ld/lld
function ask_mold( ) {
read -rp ":: Do you want to use mold as your linker (much faster) [Y/n]? " BUILDTOOL_MOLD
case " ${ BUILDTOOL_MOLD } " in
"y" | "Y" | "" )
export " BUILDTOOL_PACKAGES= ${ BUILDTOOL_PACKAGES } mold "
2024-03-10 21:14:12 +01:00
export " BUILDTOOL_BUILDCMDLINE= ${ BUILDTOOL_BUILDCMDLINE } LDFLAGS=-fuse-ld=mold RUSTFLAGS=\"-C link-arg=-fuse-ld=mold\" "
2024-03-10 16:04:07 +01:00
; ;
"n" | "N" ) ; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_mold
esac
}
## Ask if the governor should be adjusted
function ask_cpupower( ) {
read -rp ":: Do you want to adjust the cpu governor (improves build performance) [Y/n]? " BUILDTOOL_CPUPOWER
case " ${ BUILDTOOL_CPUPOWER } " in
"y" | "Y" | "" )
export " BUILDTOOL_PACKAGES= ${ BUILDTOOL_PACKAGES } cpupower "
; ;
"n" | "N" ) ; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_cpupower
esac
}
## Ask for building in tmpfs
function ask_tmpfs( ) {
read -rp ":: Do you want to build in a tmpfs (improves build performance, protects your disk from wearing out faster, ~32 GiB memory required) [Y/n]? " BUILDTOOL_TMPFS
case " ${ BUILDTOOL_TMPFS } " in
"y" | "Y" | "" )
export " BUILDTOOL_CLONEDIR=/tmp/ ${ BUILDTOOL_CLONEDIR } "
; ;
"n" | "N" )
export " BUILDTOOL_CLONEDIR= $( pwd ) / ${ BUILDTOOL_CLONEDIR } "
; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_tmpfs
esac
}
## Ask for kernel config modification using xconfig
function ask_xconfig( ) {
read -rp ":: Do you want to configure the kernel using xconfig before build [y/N]? " BUILDTOOL_XCONFIG
case " ${ BUILDTOOL_XCONFIG } " in
"y" | "Y" )
export "BUILDTOOL_PKGBUILD_XCONFIG=_makexconfig=SET"
; ;
"n" | "N" | "" )
export "BUILDTOOL_PKGBUILD_XCONFIG=_makexconfig="
; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_xconfig
esac
}
## Ask for kernel config modification using xconfig
function ask_nconfig( ) {
read -rp ":: Do you want to configure the kernel using nconfig before build [y/N]? " BUILDTOOL_NCONFIG
case " ${ BUILDTOOL_NCONFIG } " in
"y" | "Y" )
export "BUILDTOOL_PKGBUILD_NCONFIG=_makenconfig=SET"
; ;
"n" | "N" | "" )
export "BUILDTOOL_PKGBUILD_NCONFIG=_makenconfig="
; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_nconfig
esac
}
## Ask if the final kernel configuration should be copied
function ask_cpfinalconfig( ) {
read -rp ":: Do you want to copy the final kernel configuration before build [y/N]? " BUILDTOOL_CPFINALCONFIG
case " ${ BUILDTOOL_CPFINALCONFIG } " in
"y" | "Y" )
export "BUILDTOOL_PKGBUILD_CPFINALCONFIG=_copyfinalconfig=SET"
; ;
"n" | "N" | "" )
export "BUILDTOOL_PKGBUILD_CPFINALCONFIG=_copyfinalconfig="
; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_cpfinalconfig
esac
}
## Ask if only active modules should be compiled into the kernel
function ask_modprobeddb( ) {
read -rp ":: Do you want to only build active kernel modules (modprobed-db must be installed, read \"https://wiki.archlinux.org/index.php/Modprobed-db\" first) [y/N]? " BUILDTOOL_MODPROBEDDB
case " ${ BUILDTOOL_MODPROBEDDB } " in
"y" | "Y" )
if ! which modprobed-db & > /dev/null; then
echo ":: Error: Could not find modprobed-db in \$PATH."
echo " Please ensure that you have modprobed-db installed."
ask_modprobeddb
return 1
fi
export " BUILDTOOL_PACKAGES= ${ BUILDTOOL_PACKAGES } modprobed-db "
export "BUILDTOOL_PKGBUILD_MODPROBEDDB=_localmodcfg=SET"
; ;
"n" | "N" | "" )
export "BUILDTOOL_PKGBUILD_MODPROBEDDB=_localmodcfg="
; ;
*)
echo "Invalid answer. Please answer with Y or N."
ask_modprobeddb
esac
}
## Ask for sub architecture
function ask_subarchitecture( ) {
echo ":: Displaying sub architecture list"
echo " 1. AMD Opteron/Athlon64/Hammer/K8 (MK8)"
echo " 2. AMD Opteron/Athlon64/Hammer/K8 with SSE3 (MK8SSE3)"
echo " 3. AMD 61xx/7x50/PhenomX3/X4/II/K10 (MK10)"
echo " 4. AMD Barcelona (MBARCELONA)"
echo " 5. AMD Bobcat (MBOBCAT)"
echo " 6. AMD Jaguar (MJAGUAR)"
echo " 7. AMD Bulldozer (MBULLDOZER)"
echo " 8. AMD Piledriver (MPILEDRIVER)"
echo " 9. AMD Steamroller (MSTEAMROLLER)"
echo " 10. AMD Excavator (MEXCAVATOR)"
echo " 11. AMD Zen (MZEN)"
echo " 12. AMD Zen 2 (MZEN2)"
echo " 13. AMD Zen 3 (MZEN3)"
echo " 14. AMD Zen 4 (MZEN4)"
echo " 15. Intel P4 / older Netburst based Xeon (MPSC)"
echo " 16. Intel Core 2 (MCORE2)"
echo " 17. Intel Atom (MATOM)"
echo " 18. Intel Nehalem (MNEHALEM)"
echo " 19. Intel Westmere (MWESTMERE)"
echo " 20. Intel Silvermont (MSILVERMONT)"
echo " 21. Intel Goldmont (MGOLDMONT)"
echo " 22. Intel Goldmont Plus (MGOLDMONTPLUS)"
echo " 23. Intel Sandy Bridge (MSANDYBRIDGE)"
echo " 24. Intel Ivy Bridge (MIVYBRIDGE)"
echo " 25. Intel Haswell (MHASWELL)"
echo " 26. Intel Broadwell (MBROADWELL)"
echo " 27. Intel Skylake (MSKYLAKE)"
echo " 28. Intel Skylake X (MSKYLAKEX)"
echo " 29. Intel Cannon Lake (MCANNONLAKE)"
echo " 30. Intel Ice Lake (MICELAKE)"
echo " 31. Intel Cascade Lake (MCASCADELAKE)"
echo " 32. Intel Cooper Lake (MCOOPERLAKE)"
echo " 33. Intel Tiger Lake (MTIGERLAKE)"
echo " 34. Intel Sapphire Rapids (MSAPPHIRERAPIDS)"
echo " 35. Intel Rocket Lake (MROCKETLAKE)"
echo " 36. Intel Alder Lake (MALDERLAKE)"
echo " 37. Intel Raptor Lake (MRAPTORLAKE)"
echo " 38. Intel Meteor Lake (MMETEORLAKE)"
echo " 39. Intel Emerald Rapids (MEMERALDRAPIDS)"
echo " 40. Generic-x86-64 (GENERIC_CPU)"
echo " 41. Generic-x86-64-v2 (GENERIC_CPU2)"
echo " 42. Generic-x86-64-v3 (GENERIC_CPU3)"
echo " 43. Generic-x86-64-v4 (GENERIC_CPU4)"
echo " 44. Intel-Native optimizations autodetected by the compiler (MNATIVE_INTEL)"
echo " 45. AMD-Native optimizations autodetected by the compiler (MNATIVE_AMD)"
read -rp ":: Which sub architecture do you want to build Linux for (see above, enter 40 if unsure) [40]? " BUILDTOOL_SUBARCHITECTURE
case " ${ BUILDTOOL_SUBARCHITECTURE } " in
"" )
export "BUILDTOOL_PKGBUILD_SUBARCHITECTURE=_subarch=40"
; ;
*[ !0-9] *)
echo ":: Error: Invalid subarchitecture"
ask_subarchitecture
return 1
; ;
*)
if [ ! " ${ BUILDTOOL_SUBARCHITECTURE } " -gt 0 ] || [ ! " ${ BUILDTOOL_SUBARCHITECTURE } " -lt 46 ] ; then
echo ":: Error: Invalid subarchitecture."
ask_subarchitecture
else
export " BUILDTOOL_PKGBUILD_SUBARCHITECTURE=_subarch= ${ BUILDTOOL_SUBARCHITECTURE } "
fi
; ;
esac
}
## Ask for kernel debug mode
function ask_debug( ) {
read -rp ":: Do you want to enable kernel debug mode [y/N/i(gnore)]? " BUILDTOOL_DEBUG
case " ${ BUILDTOOL_DEBUG } " in
"y" | "Y" )
export "BUILDTOOL_PKGBUILD_DEBUG=_debug=y"
; ;
"n" | "N" | "" )
export "BUILDTOOL_PKGBUILD_DEBUG=_debug=n"
; ;
"i" | "I" )
export "BUILDTOOL_PKGBUILD_DEBUG=_debug="
; ;
*)
echo "Invalid answer. Please answer with Y, N or I."
ask_debug
esac
}
ask_mold
ask_cpupower
ask_tmpfs
ask_xconfig
ask_nconfig
ask_cpfinalconfig
ask_modprobeddb
ask_subarchitecture
ask_debug
# Pre-building
## Install dependencies
echo ":: Installing dependencies"
if ! sudo pacman -Syu --asdeps --needed ${ BUILDTOOL_PACKAGES } ; then
echo ":: Error: Installing dependencies failed: pacman returned with non-zero exit code"
exit 1
fi
if ! rustup default nightly; then
echo ":: Error: Installing dependencies failed: rustup returned with non-zero exit code"
exit 1
fi
## Adjust cpu governor
case " ${ BUILDTOOL_CPUPOWER } " in
"y" | "Y" | "" )
echo ":: Adjusting cpu governor"
if ! sudo cpupower frequency-set -g performance; then
echo ":: Error: Adjusting cpu governor failed: cpupower returned with non-zero exit code"
return 1
fi
; ;
"n" | "N" ) ; ;
*)
echo ":: Error: Internal inconsistency detected: Value of \$BUILDTOOL_CPUPOWER is not a valid boolean answer"
exit 2
; ;
esac
# Clone repository
echo ":: Cloning repository"
git clone " ${ BUILDTOOL_REPOSITORY } " " ${ BUILDTOOL_CLONEDIR } "
cd " ${ BUILDTOOL_CLONEDIR } "
2024-03-10 21:14:12 +01:00
# Print debug information
if [ " ${ BUILDTOOL_DEBUG } " = = "true" ] ; then
echo ":: Printing debug information"
echo "++ env ++"
env| grep "BUILDTOOL_" | sort
echo "++ env ++"
echo " build cmdline: ${ BUILDTOOL_BUILDCMDLINE } " ${ BUILDTOOL_PKGBUILD_XCONFIG } " " ${ BUILDTOOL_PKGBUILD_NCONFIG } " " ${ BUILDTOOL_PKGBUILD_CPFINALCONFIG } " " ${ BUILDTOOL_PKGBUILD_MODPROBEDDB } " " ${ BUILDTOOL_PKGBUILD_SUBARCHITECTURE } " " ${ BUILDTOOL_PKGBUILD_DEBUG } " makepkg --syncdeps -p PKGBUILD.buildtool"
fi
2024-03-10 16:04:07 +01:00
# Build kernel
echo ":: Building kernel"
2024-03-10 21:14:12 +01:00
${ BUILDTOOL_BUILDCMDLINE } " ${ BUILDTOOL_PKGBUILD_XCONFIG } " " ${ BUILDTOOL_PKGBUILD_NCONFIG } " " ${ BUILDTOOL_PKGBUILD_CPFINALCONFIG } " " ${ BUILDTOOL_PKGBUILD_MODPROBEDDB } " " ${ BUILDTOOL_PKGBUILD_SUBARCHITECTURE } " " ${ BUILDTOOL_PKGBUILD_DEBUG } " makepkg --syncdeps -p PKGBUILD.buildtool