From 35703cc96202ed3baf79a300f82971ee6052c1c8 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 10 Mar 2024 16:04:07 +0100 Subject: [PATCH] Add build tool --- PKGBUILD.buildtool | 269 ++++++++++++++++++++++++++++++++++++++++++ README.md | 8 ++ buildtool.sh | 288 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 565 insertions(+) create mode 100644 PKGBUILD.buildtool create mode 100644 README.md create mode 100755 buildtool.sh diff --git a/PKGBUILD.buildtool b/PKGBUILD.buildtool new file mode 100644 index 0000000..1a3a738 --- /dev/null +++ b/PKGBUILD.buildtool @@ -0,0 +1,269 @@ +# Maintainer: JeremyStarTM +# Maintainer: Josip Ponjavic + +# All build options have been removed as this PKGBUILD is exclusively used for buildtool.sh. +# If you want to build linux-jstm-optimized without using buildtool.sh use the other PKGBUILD file instead. + +_major=6.7 +_minor=9 +_srcname=linux-${_major} +_clr=${_major}.8-1413 +_gcc_more_v='20240221.2' +pkgbase=linux-jstm-optimized +pkgver=${_major}.${_minor} +pkgrel=1 +pkgdesc="Optimized Linux kernel. Includes Clear Linux's kernel config and some tweaks made by JeremyStarTM." +arch=('x86_64') +url="https://git.staropensource.de/JeremyStarTM/kernel-optimized" +license=('GPL2') +makedepends=('bc' 'cpio' 'git' 'libelf' 'pahole' 'xmlto') +if [ -n "$_use_llvm_lto" ]; then + makedepends+=(clang llvm lld python) +fi +options=('!strip') +source=( + "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${_major}.tar.xz" + "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${_major}.tar.sign" + "https://cdn.kernel.org/pub/linux/kernel/v6.x/patch-${pkgver}.xz" + "cl-linux::git+https://github.com/clearlinux-pkgs/linux.git#tag=${_clr}" + "more-uarches-$_gcc_more_v.tar.gz::https://github.com/graysky2/kernel_compiler_patch/archive/$_gcc_more_v.tar.gz" +) + +if [ -n "$_use_llvm_lto" ]; then + BUILD_FLAGS=( + LLVM=1 + LLVM_IAS=1 + ) +fi + +export KBUILD_BUILD_HOST=archlinux +export KBUILD_BUILD_USER=$pkgbase +export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})" + +prepare() { + cd ${_srcname} + + ### Add upstream patches + echo "Add upstream patches" + patch -Np1 -i ../patch-${pkgver} || true + + ### Setting version + echo "Setting version..." + echo "-$pkgrel" > localversion.10-pkgrel + echo "${pkgbase#linux}" > localversion.20-pkgname + + ### Add Clear Linux patches + for i in $(grep '^Patch' ${srcdir}/cl-linux/linux.spec |\ + grep -Ev '^Patch0132|^Patch0118|^Patch0113|^Patch0138|^Patch0139' | sed -n 's/.*: //p'); do + if [ -n "$_use_llvm_lto" ]; then + if [ "${i}" == "0162-extra-optmization-flags.patch" ] ; then + continue + fi + fi + echo "Applying patch ${i}..." + patch -Np1 -i "$srcdir/cl-linux/${i}" || true + done + + ### Copy config + echo "Copying config..." + cp -Tf "${startdir}/kconfig" ./.config + + if [ -n "$_use_llvm_lto" ]; then + scripts/config -d LTO_NONE \ + -e LTO \ + -e LTO_CLANG \ + -e ARCH_SUPPORTS_LTO_CLANG \ + -e ARCH_SUPPORTS_LTO_CLANG_THIN \ + -e HAS_LTO_CLANG \ + -e LTO_CLANG_THIN \ + -e HAVE_GCC_PLUGINS + fi + + if [ "$_debug" == "y" ]; then + scripts/config -e DEBUG_INFO \ + -e DEBUG_INFO_BTF \ + -e DEBUG_INFO_DWARF4 \ + -e PAHOLE_HAS_SPLIT_BTF \ + -e DEBUG_INFO_BTF_MODULES + elif [ "$_debug" == "n" ]; then + scripts/config -d DEBUG_INFO \ + -d DEBUG_INFO_BTF \ + -d DEBUG_INFO_DWARF4 \ + -d PAHOLE_HAS_SPLIT_BTF \ + -d DEBUG_INFO_BTF_MODULES + fi + + make ${BUILD_FLAGS[*]} olddefconfig + diff -u $srcdir/cl-linux/config .config || : + + # https://github.com/graysky2/kernel_compiler_patch + # make sure to apply after olddefconfig to allow the next section + echo "Patching to enable GCC optimization for other uarchs..." + patch -Np1 -i "$srcdir/kernel_compiler_patch-$_gcc_more_v/more-uarches-for-kernel-6.1.79-6.8-rc3.patch" + + if [ -n "$_subarch" ]; then + # user wants a subarch so apply choice defined above interactively via 'yes' + yes "$_subarch" | make ${BUILD_FLAGS[*]} oldconfig + else + # no subarch defined so allow user to pick one + make ${BUILD_FLAGS[*]} oldconfig + fi + + ### Optionally load needed modules for the make localmodconfig + # See https://aur.archlinux.org/packages/modprobed-db + if [ -n "$_localmodcfg" ]; then + if [ -e "$HOME/.config/modprobed.db" ]; then + echo "Running Steven Rostedt's make localmodconfig now" + make ${BUILD_FLAGS[*]} LSMOD=$HOME/.config/modprobed.db localmodconfig + else + echo "No modprobed.db data found" + exit + fi + fi + + make -s kernelrelease > version + echo "Prepared $pkgbase version $( /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" + export "BUILDTOOL_BUILDCMDLINE=${BUILDTOOL_BUILDCMDLINE} LDFLAGS=\"-fuse-ld=mold\" RUSTFLAGS=\"-C link-arg=-fuse-ld=mold\"" + ;; + "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}" + +# Build kernel +echo ":: Building kernel" +${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 \ No newline at end of file