{"id":260,"date":"2026-09-08T23:00:20","date_gmt":"2026-09-08T23:00:20","guid":{"rendered":"https:\/\/satellite.foundation\/?p=260"},"modified":"2026-09-08T23:00:25","modified_gmt":"2026-09-08T23:00:25","slug":"universal-linux-kernel-build-script","status":"publish","type":"post","link":"https:\/\/satellite.foundation\/?p=260","title":{"rendered":"Universal Linux Kernel Build Script"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This script works on enterprise linux, and it&#8217;s supposed to work on debian\/ubuntu too. It grabs the latest kernel available, you just have to run it twice to install the kernel; First here&#8217;s the instructions:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#222222\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#E6E6E6;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>cd to the directory containing the script (after you extract it)\n\nrun the script:\n.\/universal_linux_kernel_build.sh\n\nafter the script is done running and it builds the kernel, type in this command:\nexport INSTALL=1\n\nThen we have to run the script with the variable INSTALL set to 1:\n.\/universal_linux_kernel_build.sh<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki slack-dark\" style=\"background-color: #222222\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">cd<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">directory<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">containing<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">script<\/span><span style=\"color: #E6E6E6\"> (after <\/span><span style=\"color: #CE9178\">you<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">extract<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">it<\/span><span style=\"color: #E6E6E6\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">run<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">script:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">.\/universal_linux_kernel_build.sh<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">after<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">script<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">is<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">done<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">running<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">and<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">it<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">builds<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">kernel,<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">type<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">in<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">this<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">command:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">export<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #9CDCFE\">INSTALL<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Then<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">we<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">have<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">run<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">script<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">with<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">the<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">variable<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">INSTALL<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">set<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #E6E6E6\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #CE9178\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">.\/universal_linux_kernel_build.sh<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">If you happen to have an AMD Graphics Card, it will build AMDGPU for you as well! Here&#8217;s the download button:<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-743f6833-6c83-4a08-b1d3-70084d80cfbb\" href=\"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/09\/universal_linux_kernel_build.tar.xz\">universal_linux_kernel_build.tar<\/a><a href=\"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/09\/universal_linux_kernel_build.tar.xz\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-743f6833-6c83-4a08-b1d3-70084d80cfbb\">Download<\/a><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the complete build script for you to look at but I wouldn&#8217;t copy and paste it, just use the &#8220;Download&#8221; button and extract it. If you copy and paste it, some of the characters will not be copied and it might not work. You can compare the number of lines and file size of both though, if your worried about viruses!<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#!\/usr\/bin\/env bash\n#\n# universal_linux_kernel_build.sh\n#\n# Download, configure, build and install a mainline Linux kernel that works on\n# whatever graphics you actually have -- AMD, NVIDIA, Intel, a virtual machine,\n# or a headless server -- with the GPU compute and NPU (\"AI\") paths turned on.\n#\n# It starts from your running distro's config so your existing hardware keeps\n# working, then enforces the options GPU compute needs and that hand-rolled\n# configs most often get wrong.\n#\n#   .\/universal_linux_kernel_build.sh                 # detect, build only\n#   INSTALL=1 .\/universal_linux_kernel_build.sh       # build, then install\n#\n#   GPU=auto        detect from lspci (default)\n#   GPU=all         every vendor -- a kernel that boots on anything\n#   GPU=amd,intel   a comma-separated list: amd nvidia intel vm\n#\n#   KVER=6.12.9 .\/universal_linux_kernel_build.sh     # a specific release\n#   SRC=~\/src\/linux .\/universal_linux_kernel_build.sh # an existing tree\n#   TOOLCHAIN=llvm LLVM_PREFIX=$HOME\/opt\/clang-current\/bin\/ .\/universal_...sh\n#\n#   CLEAN=auto      mrproper the tree only if the last attempt did not finish\n#   CLEAN=always    mrproper first, every time\n#   CLEAN=never     never clean; always build incrementally\n#\n#   CONFIG_BASE=auto      keep the tree's .config if it has one, else the distro's\n#   CONFIG_BASE=distro    always reseed from \/boot\/config-$(uname -r)\n#   CONFIG_BASE=defconfig start from the arch defconfig\n#   CONFIG_BASE=&lt;path>    start from a config file you name\n#   FRAME_WARN=8192 -Wframe-larger-than=; 0 disables the check entirely\n#\n# Two files are written beside this script (override with STATE_FILE= \/ BUILD_LOG=):\n#   kernel_build.ini   what was done to each source tree, one &#91;section&#93; each\n#   kernel_build.log   full output of the last build (previous kept as .log.prev)\n#\n# THE ONE THING THIS SCRIPT EXISTS TO GET RIGHT: GPU drivers are MODULES.\n# Built-in (=y) is the most common mistake in hand-rolled GPU kernel configs.\n# A built-in driver probes before the root filesystem is mounted, so all of its\n# firmware must already be in the initramfs -- but dracut and initramfs-tools\n# decide which firmware to include by looking at which MODULES are installed,\n# and a built-in driver is not a module. The result is a driver that cannot load\n# its firmware: no display, no \/dev\/kfd. As modules they also stay unloadable\n# and blacklistable, which the NVIDIA proprietary stack requires.\n#\n# Licence: public domain \/ CC0. No warranty. It installs a kernel; read it first.\n\nset -euo pipefail\n\n# --- integrity self-check -------------------------------------------------\n# This file must be pure ASCII.  Copying a script out of a web page or a chat\n# window silently replaces ordinary spaces with U+00A0 (non-breaking space),\n# which bash treats as part of a command name -- you get \"command not found\"\n# on a line that looks perfectly correct.\n#\n# NOTE: the body below is deliberately NOT indented.  Leading whitespace is\n# exactly what gets converted, so an indented error handler is unable to report\n# the corruption it just detected -- it fails as \"printf: command not found\".\nif LC_ALL=C tr -d '\\11\\12\\40-\\176' &lt; \"$0\" | head -c 1 | LC_ALL=C grep -q .; then\nprintf 'ERROR: %s contains non-ASCII bytes.\\n' \"$0\" >&amp;2\nprintf 'It was almost certainly corrupted by copy-paste from a web page.\\n' >&amp;2\nprintf 'Repair it with:\\n' >&amp;2\nprintf \"    sed -i 's\/%s\/ \/g' %s\\n\" '\\xc2\\xa0' \"$0\" >&amp;2\nprintf 'or, better, download the file directly instead of pasting it.\\n' >&amp;2\nexit 1\nfi\n# --------------------------------------------------------------------------\n\nGPU=\"${GPU:-auto}\"\nKVER=\"${KVER:-}\"                                  # empty = latest stable\nSRC=\"${SRC:-}\"                                    # empty = download a tarball\nWORK=\"${WORK:-$HOME\/src}\"\nLOCALVERSION=\"${LOCALVERSION:--gpu}\"\nFRAME_WARN=\"${FRAME_WARN:-8192}\"     # -Wframe-larger-than=; 0 disables, 8192 is the Kconfig max\n# De-export it.  This is OUR knob, but kbuild has a variable of the SAME NAME\n# and means something else by it: scripts\/setlocalversion ends with\n#     echo \"${KERNELVERSION}${file_localversion}${config_localversion}${LOCALVERSION}${scm_version}\"\n# so a LOCALVERSION that is in make's ENVIRONMENT is appended on top of the\n# CONFIG_LOCALVERSION this script sets below -- and the release comes out as\n# 7.2.0-gpu-gpu.  It only bites when the value arrived from the environment\n# (an orchestrator, or `LOCALVERSION=-x .\/this.sh`), because a plain assignment\n# does not export, but a value inherited from the environment stays exported\n# through re-assignment.  The config setting below is the only path we want.\nexport -n LOCALVERSION 2>\/dev\/null || true\n# ------------------------------------------------------------- build bookkeeping\n# Two files live next to this script.  kernel_build.ini records what was done to\n# each source tree so a later run can tell an interrupted or failed tree from a\n# finished one; kernel_build.log is the full output of the last build.\n#\n# The .ini is keyed by SOURCE TREE, not by version -- one &#91;section&#93; per tree --\n# because a single machine easily ends up with several (a KVER= build in ~\/src\n# beside an SRC=\/KERNEL_SRC= tree elsewhere), and a state file that assumed one\n# tree would confidently report the wrong one.  Delete it any time: a missing\n# entry simply reads as \"previous attempt unknown\".\nSELF_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE&#91;0&#93;}\")\" >\/dev\/null 2>&amp;1 &amp;&amp; pwd)\" || SELF_DIR=\"$PWD\"\nSTATE_FILE=\"${STATE_FILE:-$SELF_DIR\/kernel_build.ini}\"\nBUILD_LOG=\"${BUILD_LOG:-$SELF_DIR\/kernel_build.log}\"\nCLEAN=\"${CLEAN:-auto}\"    # auto: clean only an unfinished tree | always | never\n# Where the configuration comes from.  \"auto\" keeps a .config the tree already\n# has and only seeds from the running distro when there is none, so re-running\n# no longer throws away work between runs.  The enforcement below re-applies to\n# whatever base is chosen, and the verify block still refuses to install a\n# config that did not come out right, so keeping an existing one is safe.\nCONFIG_BASE=\"${CONFIG_BASE:-auto}\"   # auto | distro | defconfig | \/path\/to\/config\n# Both are touched only AFTER this script has chdir'd into $WORK and then $SRC,\n# so a relative override would land somewhere the user did not mean.  Resolve\n# them against the directory we were invoked from, once, while that is still cwd.\ncase $STATE_FILE in \/*) ;; *) STATE_FILE=\"$PWD\/$STATE_FILE\" ;; esac\ncase $BUILD_LOG  in \/*) ;; *) BUILD_LOG=\"$PWD\/$BUILD_LOG\"   ;; esac\nJOBS=\"${JOBS:-$(nproc)}\"\nINSTALL=\"${INSTALL:-0}\"\nINSTALL_DEPS=\"${INSTALL_DEPS:-1}\"\nTOOLCHAIN=\"${TOOLCHAIN:-gcc}\"                     # gcc | llvm\nLLVM_PREFIX=\"${LLVM_PREFIX:-}\"                    # e.g. $HOME\/opt\/clang-current\/bin\/  (TRAILING SLASH)\nKEEP_DEBUG_INFO=\"${KEEP_DEBUG_INFO:-0}\"           # 1 keeps DWARF+BTF (far bigger, far slower)\n\nsay()  { printf '\\n\\033[1m==> %s\\033[0m\\n' \"$*\"; }\nwarn() { printf '\\033[33mwarning:\\033[0m %s\\n' \"$*\" >&2; }\ndie()  { printf '\\n\\033[31mERROR:\\033[0m %s\\n' \"$*\" >&2; exit 1; }\n\n# ---------------------------------------------------------------- state helpers\n# Loaded into an associative array and flushed whole, rather than edited in\n# place.  Sections for OTHER trees are copied through verbatim, so two trees\n# never clobber each other, and a flush after every set means the record\n# survives a kill -9 mid-build -- which is exactly the case it exists to detect.\ndeclare -A STATE=()\nSTATE_OK=0\nSTATE_STAGE=startup\n\nstate_init() {\n    local d; d=\"$(dirname \"$STATE_FILE\")\"\n    if &#91; -d \"$d\" &#93; &amp;&amp; &#91; -w \"$d\" &#93; &amp;&amp; { &#91; ! -e \"$STATE_FILE\" &#93; || &#91; -w \"$STATE_FILE\" &#93;; }; then\n        STATE_OK=1\n    else\n        warn \"cannot write $STATE_FILE -- continuing without build-state tracking.\n       Set STATE_FILE=&lt;path> to somewhere writable, or pass CLEAN=always\/never\n       to decide about cleaning explicitly.\"\n    fi\n}\n\nstate_load() {\n    &#91; \"$STATE_OK\" = 1 &#93; &amp;&amp; &#91; -f \"$STATE_FILE\" &#93; || return 0\n    local line k v inm=0\n    while IFS= read -r line; do\n        case \"$line\" in\n            \"&#91;$SRC&#93;\") inm=1; continue ;;\n            \\[*)      inm=0; continue ;;\n            ''|'#'*)  continue ;;\n        esac\n        &#91; \"$inm\" = 1 &#93; || continue\n        case \"$line\" in *=*) ;; *) continue ;; esac\n        k=${line%%=*}; v=${line#*=}\n        k=${k\/\/ \/}; k=${k\/\/$'\\t'\/}; v=${v# }\n        # An if, not `&#91; -n \"$k\" &#93; &amp;&amp; ...`: a while-read returns the status of the\n        # last command in its body, so a trailing blank key would make state_load\n        # return 1 and `set -e` would kill the run silently at the call site.\n        if &#91; -n \"$k\" &#93;; then STATE&#91;\"$k\"&#93;=\"$v\"; fi\n    done &lt; \"$STATE_FILE\"\n    return 0\n}\n\nstate_flush() {\n    &#91; \"$STATE_OK\" = 1 &#93; || return 0\n    local tmp k\n    tmp=\"$(mktemp \"${STATE_FILE}.XXXXXX\" 2>\/dev\/null)\" || return 0\n    {\n        printf '# universal_linux_kernel_build.sh -- build state, one &#91;section&#93; per source tree.\\n'\n        printf '# Written automatically; safe to delete.\\n'\n        # cat -s squeezes the blank line that the awk pass preserves and the\n        # printf below re-emits; without it the file gains one blank per write.\n        &#91; -f \"$STATE_FILE\" &#93; &amp;&amp; awk -v sec=\"&#91;$SRC&#93;\" '\/^\\[\/ { keep = ($0 != sec) } keep' \"$STATE_FILE\" | cat -s\n        printf '\\n&#91;%s&#93;\\n' \"$SRC\"\n        for k in \"${!STATE&#91;@&#93;}\"; do printf '%s = %s\\n' \"$k\" \"${STATE&#91;$k&#93;}\"; done | sort\n    } > \"$tmp\" 2>\/dev\/null &amp;&amp; mv -f \"$tmp\" \"$STATE_FILE\" || rm -f \"$tmp\"\n}\n\nstate_set() { &#91; \"$STATE_OK\" = 1 &#93; || return 0; STATE&#91;\"$1\"&#93;=\"$2\"; state_flush; }\n\n# Records a failure without changing the exit status.  `local rc=$?` must stay\n# the first statement or it captures the wrong command.\n_state_on_exit() {\n    local rc=$?\n    if &#91; \"$STATE_OK\" = 1 &#93; &amp;&amp; &#91; \"$rc\" -ne 0 &#93;; then\n        STATE&#91;status&#93;=failed\n        STATE&#91;stage&#93;=\"$STATE_STAGE\"\n        STATE&#91;exit_code&#93;=\"$rc\"\n        STATE&#91;finished&#93;=\"$(date -Is 2>\/dev\/null || date 2>\/dev\/null || true)\"\n        state_flush\n    fi\n    return 0\n}\n\nDNF_PKGS=\"gcc make flex bison bc openssl-devel elfutils-libelf-devel dwarves\n          ncurses-devel rsync cpio perl python3 xz zstd git tar pciutils\"\nAPT_PKGS=\"build-essential flex bison bc libssl-dev libelf-dev dwarves\n          libncurses-dev rsync cpio perl python3 xz-utils zstd git tar pciutils\"\n\n# Best-effort, deliberately.  A package manager exits non-zero for reasons that\n# have nothing to do with the packages asked for -- one third-party repo with an\n# unverifiable GPG key is enough, and dnf then refuses to load metadata and\n# exits 1 in the first ten seconds.  Under `set -e` a bare install call would\n# take a multi-hour build down with it for a reason the user cannot see from the\n# error.  So warn and carry on: the Preflight loop immediately below is the real\n# gate, and it names the tool that is actually missing.\nif &#91; \"$INSTALL_DEPS\" = 1 &#93;; then\n    say \"Installing build dependencies (sudo)\"\n    if command -v dnf >\/dev\/null; then\n        sudo dnf install -y $DNF_PKGS \\\n            || warn \"dnf could not install every dependency; continuing.\n       If the build fails on a missing header, that is where to look.  A single\n       broken repo is the usual cause -- retry with\n           sudo dnf install -y --disablerepo=&lt;broken> $DNF_PKGS\n       or set INSTALL_DEPS=0 if you know the packages are already present.\"\n    elif command -v apt-get >\/dev\/null; then\n        # Separate statements, not `update &amp;&amp; install`: chained, a failed update\n        # makes the whole list non-zero and set -e kills the script with nothing\n        # printed.  A stale index is not a reason to refuse to build.\n        sudo apt-get update || warn \"apt-get update failed; using the cached package lists\"\n        sudo apt-get install -y $APT_PKGS \\\n            || warn \"apt-get could not install every dependency; continuing.\"\n    else\n        warn \"no dnf\/apt-get -- install kernel build deps yourself, then re-run with INSTALL_DEPS=0\"\n    fi\nfi\n\nsay \"Preflight\"\nfor t in make gcc flex bison bc rsync cpio; do command -v \"$t\" >\/dev\/null || die \"missing: $t\"; done\n&#91; \"$(id -u)\" -ne 0 &#93; || die \"do not run this whole script as root.\n       The build runs as you; only the install steps use sudo.\"\n\n# ------------------------------------------------------------------ GPU detect\n#\n# VM\/legacy drivers are ALWAYS enabled. They are a few hundred KB of modules and\n# they are the difference between \"this kernel boots on my machine\" and \"this\n# kernel boots anywhere\" -- a VM, a server with an ASPEED BMC, a rescue boot on\n# unfamiliar hardware. There is no reason to leave them out.\n\nW_AMD=0; W_NV=0; W_INTEL=0\nif command -v lspci >\/dev\/null; then\n    while IFS= read -r line; do\n        case \"$line\" in\n            *&#91;Aa&#93;&#91;Mm&#93;&#91;Dd&#93;*|*ATI*) W_AMD=1;   printf '  found: %s\\n' \"$line\" ;;\n            *NVIDIA*|*nVidia*)    W_NV=1;    printf '  found: %s\\n' \"$line\" ;;\n            *Intel*)              W_INTEL=1; printf '  found: %s\\n' \"$line\" ;;\n        esac\n    done &lt; &lt;(lspci -nn 2>\/dev\/null | grep -Ei 'vga|3d|display' || true)\nfi\n\ncase \"$GPU\" in\n  auto)\n    if &#91; \"$W_AMD$W_NV$W_INTEL\" = \"000\" &#93;; then\n        warn \"no AMD\/NVIDIA\/Intel GPU detected (headless, VM, or unknown hardware).\n         Enabling all vendors so the kernel boots anywhere. Use GPU= to narrow it.\"\n        W_AMD=1; W_NV=1; W_INTEL=1\n    fi ;;\n  all) W_AMD=1; W_NV=1; W_INTEL=1 ;;\n  *)\n    W_AMD=0; W_NV=0; W_INTEL=0\n    IFS=',' read -ra want &lt;&lt;&lt; \"$GPU\"\n    for v in \"${want&#91;@&#93;}\"; do case \"${v\/\/ \/}\" in\n        amd) W_AMD=1 ;; nvidia|nv) W_NV=1 ;; intel) W_INTEL=1 ;; vm|none) ;;\n        *) die \"unknown GPU vendor '$v' (use: auto all amd nvidia intel vm)\" ;;\n    esac; done ;;\nesac\nprintf '  enabling  : %s%s%s%s\\n' \\\n    \"$(&#91; \"$W_AMD\" = 1 &#93; &amp;&amp; echo 'AMD ')\" \"$(&#91; \"$W_NV\" = 1 &#93; &amp;&amp; echo 'NVIDIA ')\" \\\n    \"$(&#91; \"$W_INTEL\" = 1 &#93; &amp;&amp; echo 'Intel ')\" 'VM\/legacy(always)'\n\nMAKE_ARGS=(-j\"$JOBS\")\nif &#91; \"$TOOLCHAIN\" = llvm &#93;; then\n    &#91; -n \"$LLVM_PREFIX\" &#93; &amp;&amp; case \"$LLVM_PREFIX\" in *\/) ;; *) die \"LLVM_PREFIX must end in a slash -- kbuild treats it as a path prefix\";; esac\n    MAKE_ARGS+=(LLVM=\"${LLVM_PREFIX:-1}\")\n    # tools\/lib\/bpf can be compiled by gcc (non-PIC) while the host link runs\n    # clang\/ld.lld, which defaults to PIE. That mix fails building\n    # tools\/bpf\/resolve_btfids with R_X86_64_32 relocation errors.\n    MAKE_ARGS+=(HOSTLDFLAGS=-no-pie)\n    printf '  toolchain : clang (%s)\\n' \"${LLVM_PREFIX:-from PATH}\"\nelse\n    printf '  toolchain : %s\\n' \"$(gcc --version | head -1)\"\nfi\n\n# ---------------------------------------------------------------------- source\n\nif &#91; -z \"$SRC\" &#93;; then\n    if &#91; -z \"$KVER\" &#93;; then\n        KVER=$(curl -fsSL https:\/\/www.kernel.org\/finger_banner 2>\/dev\/null \\\n            | awk '\/latest stable\/{print $NF; exit}') || true\n        &#91; -n \"$KVER\" &#93; || die \"could not determine the latest kernel version; set KVER=\"\n    fi\n    SRC=\"$WORK\/linux-$KVER\"\n    if &#91; ! -d \"$SRC\" &#93;; then\n        mkdir -p \"$WORK\"; cd \"$WORK\"\n        say \"Downloading linux-$KVER\"\n        curl -fL --progress-bar -O \"https:\/\/cdn.kernel.org\/pub\/linux\/kernel\/v${KVER%%.*}.x\/linux-$KVER.tar.xz\"\n        tar xf \"linux-$KVER.tar.xz\"\n    fi\nfi\n&#91; -f \"$SRC\/Makefile\" &#93; || die \"no kernel source at $SRC\"\ncd \"$SRC\"\n# Canonicalise now that we are standing in it, BEFORE it becomes a state key.\n# SRC is the &#91;section&#93; name, and a trailing slash from tab-completion, a\n# relative \".\" or a symlinked path would each key the same tree differently --\n# and a key that misses reads as \"no previous attempt\", which under CLEAN=auto\n# means mrproper on a tree that was perfectly good.  pwd -P resolves all three.\nSRC=\"$(pwd -P)\"\nprintf '  source    : %s (%s)\\n  jobs      : %s\\n' \"$SRC\" \"$(make -s kernelversion)\" \"$JOBS\"\n\n# ------------------------------------------------------- previous build attempt\n\nstate_init\nstate_load\ntrap _state_on_exit EXIT\n\nsay \"Previous build attempt\"\nprev_status=\"${STATE&#91;status&#93;:-}\"\n# -print -quit stops at the first hit: on a fully built tree this answers in\n# milliseconds, where counting all ~16000 objects would walk 4.6G of tree.\nobjects=\"$(find . -name '*.o' -not -path '.\/scripts\/*' -print -quit 2>\/dev\/null || true)\"\n\nif &#91; -n \"$prev_status\" &#93;; then\n    printf '  recorded  : %s' \"$prev_status\"\n    [ -n \"${STATE&#91;finished&#93;:-}\" ] &amp;&amp; printf ' (%s)' \"${STATE&#91;finished&#93;}\"\n    &#91; \"$prev_status\" = failed &#93; &amp;&amp; printf ' at stage %s' \"${STATE&#91;stage&#93;:-unknown}\"\n    printf '\\n'\nelse\n    printf '  recorded  : nothing -- no entry for this tree in %s\\n' \"$STATE_FILE\"\nfi\n\ndo_clean=0; clean_why=\"\"\ncase \"$CLEAN\" in\n  never)  clean_why=\"CLEAN=never\" ;;\n  always) do_clean=1; clean_why=\"CLEAN=always\" ;;\n  auto)\n    if &#91; -z \"$objects\" &#93;; then\n        clean_why=\"no object files present -- nothing to clean\"\n    else\n        case \"$prev_status\" in\n          built|installed) clean_why=\"the previous run finished ($prev_status); rebuilding incrementally is correct and far faster\" ;;\n          building)        do_clean=1; clean_why=\"a previous run started and never recorded finishing -- interrupted or killed\" ;;\n          failed)          do_clean=1; clean_why=\"the previous run failed at stage ${STATE&#91;stage&#93;:-unknown}\" ;;\n          \"\")              do_clean=1; clean_why=\"objects are present but nothing recorded how they got there\" ;;\n          *)               do_clean=1; clean_why=\"recorded status '$prev_status' is not a completed build\" ;;\n        esac\n    fi ;;\n  *) die \"CLEAN must be auto, always or never (got '$CLEAN')\" ;;\nesac\n\n# Back up BEFORE announcing or doing anything, and re-test afterwards.  If the\n# configuration cannot be saved then cleaning would destroy it outright, and not\n# cleaning is always the safer of the two -- an incremental build on a suspect\n# tree is a slow problem, a deleted config is an unrecoverable one.\nif &#91; \"$do_clean\" = 1 &#93;; then\n    _bk=\"\"\n    if &#91; -f .config &#93;; then\n        # The FIRST backup is the valuable one: by the second cleaning run\n        # .config may no longer be the user's file, so overwriting a fixed name\n        # would replace the only copy of their original.  Keep the first,\n        # timestamp the rest.  --remove-destination because a plain `cp -a` onto\n        # an existing symlink writes THROUGH it, clobbering its target.\n        _bk=.config.before-clean\n        &#91; -e \"$_bk\" &#93; &amp;&amp; _bk=\".config.before-clean.$(date +%Y%m%d-%H%M%S 2>\/dev\/null || echo prev)\"\n        if cp -a --remove-destination .config \"$_bk\" 2>\/dev\/null; then\n            printf '  saved     : .config -> %s\\n' \"$_bk\"\n        else\n            do_clean=0; _bk=\"\"\n            clean_why=\"could not save .config, so cleaning would destroy it\"\n            warn \"cannot back up $SRC\/.config -- NOT cleaning this tree.\n       Fix its permissions, or move it aside yourself, or pass CLEAN=never to\n       stop being asked.  Building incrementally instead.\"\n        fi\n    fi\nfi\n\n# A SECOND test, not an else: $do_clean can have been cleared just above, and\n# the previous version of this block set it there and then cleaned anyway --\n# printing \"not cleaning\" immediately before deleting the file it could not save.\nif &#91; \"$do_clean\" = 1 &#93;; then\n    printf '  cleaning  : %s\\n' \"$clean_why\"\n    # mrproper, not clean: the failure this recovers from is a tree left\n    # inconsistent, and `make clean` keeps include\/config and the generated\n    # headers that are the usual culprits.  It deletes .config too, which is\n    # incidental -- cleaning is about build PRODUCTS, not your configuration --\n    # so that is restored immediately afterwards.\n    STATE_STAGE=clean\n    make -s mrproper\n    printf '  cleaned   : %s\\n' \"$SRC\"\n    # Only for CONFIG_BASE=auto: the other modes are an explicit instruction\n    # about where the config comes from, and restoring one would contradict it.\n    if &#91; \"$CONFIG_BASE\" = auto &#93; &amp;&amp; &#91; -n \"$_bk\" &#93; &amp;&amp; &#91; -f \"$_bk\" &#93;; then\n        cp -a --remove-destination \"$_bk\" .config \\\n            &amp;&amp; printf '  restored  : .config kept across the clean (from %s)\\n' \"$_bk\"\n    fi\nelse\n    printf '  keeping   : %s\\n' \"$clean_why\"\nfi\n\nstate_set tree      \"$SRC\"\nstate_set version   \"$(make -s kernelversion)\"\nstate_set toolchain \"$TOOLCHAIN\"\nstate_set jobs      \"$JOBS\"\nstate_set log       \"$BUILD_LOG\"\nstate_set started   \"$(date -Is 2>\/dev\/null || date 2>\/dev\/null || true)\"\nstate_set status    configuring\nstate_set stage     \"\"\nstate_set exit_code \"\"\nstate_set finished  \"\"      # or the previous run's finish time reads as this one's\nSTATE_STAGE=configure\n\n# --------------------------------------------------------------------- configure\n\nsay \"Configuring\"\n\n# Copy the running distro's config in.  Factored out because CONFIG_BASE=auto\n# calls it only as a fallback, where the old code called it unconditionally and\n# so destroyed a tuned .config on every single run.\n# Never write .config in place.  A redirect truncates the target before the\n# first byte arrives, so a corrupt source or a killed run leaves a FRAGMENT --\n# and under CONFIG_BASE=auto the next run would adopt that fragment as its base,\n# with olddefconfig silently defaulting every symbol the fragment never reached.\n# Writing to a temp and renaming makes the swap atomic; rename also replaces a\n# .config SYMLINK rather than writing through it to whatever it points at.\ninstall_config() {\n    local src=\"$1\" tmp\n    tmp=\".config.seed.$$\"\n    case \"$src\" in\n      *.gz) zcat \"$src\" > \"$tmp\" ;;\n      *)    cp    \"$src\"   \"$tmp\" ;;\n    esac || { rm -f \"$tmp\"; die \"could not read the config at $src\"; }\n    &#91; -s \"$tmp\" &#93; || { rm -f \"$tmp\"; die \"the config at $src is empty\"; }\n    mv -f \"$tmp\" .config\n}\n\nseed_from_distro() {\n    local c base=\"\"\n    for c in \"\/boot\/config-$(uname -r)\" \/proc\/config.gz; do\n        &#91; -r \"$c\" &#93; &amp;&amp; { base=\"$c\"; break; }\n    done\n    if &#91; -n \"$base\" &#93;; then\n        printf '  base: %s\\n' \"$base\"\n        install_config \"$base\"\n    else\n        warn \"no distro config found; starting from defconfig -- review before installing\"\n        make defconfig >\/dev\/null\n    fi\n}\n\ncase \"$CONFIG_BASE\" in\n  auto)\n      # Cheap sanity gate before adopting it: a truncated or empty file would\n      # otherwise be taken as authoritative and quietly defaulted by\n      # olddefconfig into a config nobody chose.\n      if &#91; -s .config &#93; &amp;&amp; grep -q '^CONFIG_&#91;A-Z0-9_&#93;*=' .config 2>\/dev\/null; then\n          printf '  base: the .config already in this tree -- kept, not replaced\\n'\n          printf '        (CONFIG_BASE=distro to reseed from the running kernel)\\n'\n      else\n          &#91; -e .config &#93; &amp;&amp; warn \"$SRC\/.config is empty or has no CONFIG_ lines -- ignoring it\n       and seeding from the running kernel instead.  The old file is kept as\n       .config.rejected if you want to look at it.\"\n          &#91; -e .config &#93; &amp;&amp; mv -f .config .config.rejected\n          seed_from_distro\n      fi ;;\n  distro)\n      seed_from_distro ;;\n  defconfig)\n      printf '  base: make defconfig\\n'\n      make defconfig >\/dev\/null ;;\n  *)\n      &#91; -r \"$CONFIG_BASE\" &#93; || die \"CONFIG_BASE=$CONFIG_BASE is not a readable file.\n       Expected: auto, distro, defconfig, or a path to a kernel config.\"\n      printf '  base: %s\\n' \"$CONFIG_BASE\"\n      install_config \"$CONFIG_BASE\" ;;\nesac\n\n# Bring whatever base was chosen up to date with THIS tree's Kconfig before the\n# enforcement below.  A config from another kernel version is missing symbols\n# this one has; without this, scripts\/config sets options against a stale symbol\n# table and the second olddefconfig quietly drops them again.\nmake olddefconfig >\/dev\/null\nstate_set config_base \"$CONFIG_BASE\"\n\ncfg() { .\/scripts\/config \"$@\"; }\n\n# --- shared GPU-compute plumbing ---------------------------------------------\n# These are DEPENDENCIES, not preferences. HSA_AMD_SVM depends on DEVICE_PRIVATE\n# and HSA_AMD_P2P depends on PCI_P2PDMA; with those off, asking for them\n# silently does nothing and olddefconfig quietly drops them. The same machinery\n# backs NVIDIA UVM\/GPUDirect and Intel's shared virtual memory.\ncfg --enable ZONE_DEVICE\ncfg --enable DEVICE_PRIVATE          # unaddressable device memory (HMM)\ncfg --enable PCI_P2PDMA              # peer-to-peer DMA between GPUs over PCIe\ncfg --enable HMM_MIRROR\ncfg --enable MMU_NOTIFIER\ncfg --enable DMA_SHARED_BUFFER\ncfg --enable DRM_ACCEL               # the accel subsystem both NPUs live under\n\n# --- always: a console before any GPU driver, and the VM\/BMC drivers ---------\ncfg --enable SYSFB_SIMPLEFB\ncfg --module DRM_SIMPLEDRM           # EFI\/VESA framebuffer -- your rescue console\ncfg --module DRM_VIRTIO_GPU          # QEMU\/KVM, virt-manager, most Linux VMs\ncfg --module DRM_VMWGFX              # VMware\ncfg --module DRM_QXL                 # SPICE\ncfg --module DRM_BOCHS               # QEMU -vga std\ncfg --module DRM_AST                 # ASPEED BMC -- almost every rack server\ncfg --module DRM_HYPERV              # Hyper-V \/ WSL2\ncfg --module DRM_UDL                 # DisplayLink USB adapters\n\nif &#91; \"$W_AMD\" = 1 &#93;; then\n    # --- AMD: display, ROCm compute, and the Ryzen AI NPU --------------------\n    cfg --module DRM_AMDGPU              # MODULE, not built-in -- see the header\n    cfg --enable  DRM_AMD_DC             # modern display stack: atomic KMS, DP\/HDMI audio\n    cfg --enable  DRM_AMDGPU_USERPTR     # required by ROCm and by GL\/Vulkan interop\n    cfg --enable  DRM_AMDGPU_SI          # Southern Islands (older GCN)\n    cfg --enable  DRM_AMDGPU_CIK         # Sea Islands\n    cfg --enable  HSA_AMD                # KFD -- creates \/dev\/kfd, ROCm's entry point\n    cfg --enable  HSA_AMD_SVM            # shared virtual memory: HIP managed memory\n    cfg --enable  HSA_AMD_P2P            # direct GPU-to-GPU transfers\n    cfg --enable  AMD_IOMMU              # DRM_ACCEL_AMDXDNA depends on it\n    cfg --module  DRM_ACCEL_AMDXDNA      # \"AMD AI Engine\" NPU, Ryzen AI 300+\nfi\n\nif &#91; \"$W_NV\" = 1 &#93;; then\n    # --- NVIDIA --------------------------------------------------------------\n    # nouveau is the in-tree open driver. Build it as a MODULE even if you intend\n    # to use NVIDIA's proprietary or open-kernel modules: those require nouveau\n    # to be absent at load time, and you can only blacklist a module.\n    #\n    # NVIDIA's own modules are out-of-tree and built by DKMS against\n    # \/lib\/modules\/$KREL\/build, which `make modules_install` creates. Nothing\n    # else in the config is needed for them -- except that an unsigned\n    # out-of-tree module must be loadable, hence MODULE_SIG_FORCE off below.\n    #\n    # NOVA (the Rust GSP driver for Turing and later) is deliberately NOT\n    # enabled: it depends on CONFIG_RUST and a matching rustc\/bindgen, and is\n    # still early. Enable RUST first, then NOVA_CORE and DRM_NOVA.\n    cfg --module DRM_NOUVEAU\nfi\n\nif &#91; \"$W_INTEL\" = 1 &#93;; then\n    # --- Intel: graphics, compute, and the Meteor Lake+ NPU ------------------\n    # i915 and xe overlap on Tiger Lake .. Meteor Lake. Building BOTH as modules\n    # is correct and safe: only one binds a given device, chosen by the driver's\n    # own device table and overridable with i915.force_probe \/ xe.force_probe.\n    cfg --module DRM_I915                # Gen2 .. Gen12: everything up to Alder\/Raptor Lake\n    cfg --module DRM_XE                  # Xe: Arc, Lunar Lake, Battlemage, newer iGPUs\n    cfg --module DRM_ACCEL_IVPU          # \"Intel NPU\", Meteor Lake (14th gen) and newer\nfi\n\n# --- things that break a copied distro config --------------------------------\n# Distro configs point at signing keys and revocation lists shipped in their own\n# source package. Those files are not in the upstream tarball and the build dies\n# late with a confusing openssl error.\ncfg --set-str SYSTEM_TRUSTED_KEYS \"\"\ncfg --set-str SYSTEM_REVOCATION_KEYS \"\"\n# Same shape, one kernel release later: distro configs point EFI_SBAT_FILE at\n# kernel.sbat, which also lives only in their kernel SOURCE package.  The rule\n# in arch\/x86\/boot\/compressed\/Makefile is a bare file dependency --\n#     $(obj)\/sbat.o: $(CONFIG_EFI_SBAT_FILE)\n# -- so a missing file is not a warning but a hard stop before a single object\n# of the boot stub links:\n#     No rule to make target 'kernel.sbat', needed by '...\/compressed\/sbat.o'.\n# EFI_SBAT is `def_bool y if EFI_SBAT_FILE!=\"\"`, so it cannot be switched off\n# directly; clearing the string is what turns it off.  Nothing is lost -- SBAT\n# generations are Secure Boot revocation policy owned by whoever holds the\n# signing certificate, and upstream defines no components at all.\ncfg --set-str EFI_SBAT_FILE \"\"\ncfg --disable EFI_SBAT\ncfg --disable MODULE_SIG_FORCE       # or no out-of-tree GPU module will load\n# Distro configs set CONFIG_WERROR=y, which is reasonable for the exact kernel\n# and exact compiler that distro tests -- and wrong for every other pairing.\n# This script deliberately feeds a distro config into a DIFFERENT kernel\n# version, and often with a different compiler; the new warnings that follow\n# are normal, and with WERROR they are all fatal, hours into the build.\ncfg --disable WERROR\n\n# The AMD display DML files (display_mode_vba_31 \/ _314 and friends) build ~2.4K\n# frames doing floating-point mode validation, so a distro config's 2048 warns on\n# every single build.  Raised here so the setting survives -- .config is copied\n# fresh from \/boot\/config-$(uname -r) on every run, which silently reverts a\n# hand-edit.  Note what this does NOT do: -Wframe-larger-than is a diagnostic\n# threshold, not an allocation.  No function gets a byte more room, vmlinux is\n# unchanged, and the real bound is THREAD_SIZE (16K on x86_64, set by\n# THREAD_SIZE_ORDER in arch\/x86\/include\/asm\/page_64_types.h).  It is consumed\n# once, globally, at scripts\/Makefile.warn:25.  FRAME_WARN=3072 keeps the check\n# useful while still covering the DML files; FRAME_WARN=0 turns it off entirely.\ncfg --set-val FRAME_WARN \"$FRAME_WARN\"\n\nif &#91; \"$KEEP_DEBUG_INFO\" != 1 &#93;; then\n    # Full DWARF makes the build far slower and modules roughly 10x bigger. Set\n    # KEEP_DEBUG_INFO=1 if you need BTF, bpftrace, or kernel debugging.\n    cfg --disable DEBUG_INFO_BTF\n    cfg --disable DEBUG_INFO_BTF_MODULES\n    # The DWARF-version choice has to be cleared BEFORE selecting NONE, and the\n    # order is not cosmetic.  scripts\/config edits in place, so enabling\n    # DEBUG_INFO_NONE only rewrites the '# CONFIG_DEBUG_INFO_NONE is not set'\n    # line where it already sits -- which in a distro config is the line ABOVE\n    # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y.  Kconfig resolves a choice by\n    # \"the last one read wins\" (confdata.c), so the DWARF entry won, selected\n    # DEBUG_INFO, and full debug info stayed on for every module -- silently,\n    # because nothing below checked for it.\n    cfg --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT\n    cfg --disable DEBUG_INFO_DWARF4\n    cfg --disable DEBUG_INFO_DWARF5\n    cfg --enable  DEBUG_INFO_NONE\nfi\n\ncfg --set-str LOCALVERSION \"$LOCALVERSION\"\ncfg --disable LOCALVERSION_AUTO\nmake olddefconfig >\/dev\/null\n\n# --------------------------------------------------------------------- verify\n\nsay \"Verifying the configuration\"\nfail=0\ncheck() {\n    got=$(grep -E \"^(# )?CONFIG_$1&#91; =&#93;\" .config | head -1)\n    if &#91; \"$got\" = \"CONFIG_$1=$2\" &#93;; then printf '  ok   CONFIG_%-24s = %s\\n' \"$1\" \"$2\"\n    else printf '  FAIL CONFIG_%-24s want %s, got: %s\\n' \"$1\" \"$2\" \"${got:-&lt;absent>}\"; fail=1; fi\n}\nnote() {  # informational: hardware- or arch-gated, absence is not an error\n    got=$(grep -E \"^(# )?CONFIG_$1&#91; =&#93;\" .config | head -1)\n    printf '  --   CONFIG_%-24s %s\\n' \"$1\" \"${got:-&lt;absent>}\"\n}\ncheck DEVICE_PRIVATE y\ncheck PCI_P2PDMA y\ncheck DRM_SIMPLEDRM m\ncheck DRM_VIRTIO_GPU m\n# Verified, not assumed: this one failed silently for a long time, and the only\n# symptom was a build that took far longer and modules ten times the size.\n&#91; \"$KEEP_DEBUG_INFO\" = 1 &#93; || check DEBUG_INFO_NONE y\nif &#91; \"$W_AMD\" = 1 &#93;; then\n    check DRM_AMDGPU m; check DRM_AMD_DC y; check DRM_AMDGPU_USERPTR y\n    check HSA_AMD y;    check HSA_AMD_SVM y; check HSA_AMD_P2P y\n    note  DRM_ACCEL_AMDXDNA          # x86_64 + AMD_IOMMU only\nfi\n&#91; \"$W_NV\" = 1 &#93;    &amp;&amp; check DRM_NOUVEAU m\nif &#91; \"$W_INTEL\" = 1 &#93;; then\n    check DRM_I915 m\n    note  DRM_XE                     # newer trees only\n    note  DRM_ACCEL_IVPU             # x86_64 only\nfi\n&#91; \"$fail\" -eq 0 &#93; || die \"the config did not come out as intended -- do NOT install this kernel.\n       Each FAIL is a dependency that is off, not a typo. Run 'make menuconfig'\n       and search (\/) for the symbol to see what it needs.\"\n\nKREL=$(make -s kernelrelease)\nprintf '  kernel release: %s\\n' \"$KREL\"\nstate_set release \"$KREL\"\nstate_set modules \"\/lib\/modules\/$KREL\"\n\n# ------------------------------------------------------------------------ build\n\nsay \"Building -- this takes a while. Use tmux\/screen over ssh.\"\nSTATE_STAGE=build\nstate_set status building\n# The previous log is kept as .prev rather than appended to, so the file cannot\n# grow without bound across runs.  pipefail (set at the top) is what makes the\n# tee honest: without it the pipeline would report tee's exit status and a\n# failed build would look like a successful one.\nif &#91; -f \"$BUILD_LOG\" &#93;; then mv -f \"$BUILD_LOG\" \"$BUILD_LOG.prev\" 2>\/dev\/null || true; fi\nif { : > \"$BUILD_LOG\"; } 2>\/dev\/null; then    # braces: else the error escapes fd2\n    printf '  logging to: %s\\n' \"$BUILD_LOG\"\n    make \"${MAKE_ARGS&#91;@&#93;}\" 2>&amp;1 | tee \"$BUILD_LOG\"\nelse\n    warn \"cannot write $BUILD_LOG -- building without a log.  Set BUILD_LOG=&lt;path>.\"\n    make \"${MAKE_ARGS&#91;@&#93;}\"\nfi\nstate_set status built\nstate_set finished \"$(date -Is 2>\/dev\/null || date 2>\/dev\/null || true)\"\n\n&#91; \"$INSTALL\" = 1 &#93; || {\n    say \"Built, not installed.\"\n    printf '  Re-run with INSTALL=1, or install by hand:\\n'\n    printf '      sudo make %s modules_install\\n      sudo make %s install\\n' \"${MAKE_ARGS&#91;*&#93;}\" \"${MAKE_ARGS&#91;*&#93;}\"\n    exit 0\n}\n\n# ---------------------------------------------------------------------- install\n\nif command -v dkms >\/dev\/null &amp;&amp; dkms status 2>\/dev\/null | grep -q '^amdgpu'; then\n    warn \"amdgpu-dkms is installed. It exists to backport amdgpu to OLD enterprise\n         kernels; the in-tree driver you just built is newer. It will try, and\n         fail, to build against $KREL. To stop it without breaking your distro\n         kernel, cap it:\n             sudo sh -c 'echo BUILD_EXCLUSIVE_KERNEL_MAX=\\\"$(uname -r | cut -d- -f1)\\\" >> \/usr\/src\/amdgpu-*\/dkms.conf'\"\nfi\nif command -v dkms >\/dev\/null &amp;&amp; dkms status 2>\/dev\/null | grep -q '^nvidia'; then\n    printf '  note: nvidia-dkms will rebuild for %s automatically once\\n' \"$KREL\"\n    printf '        modules_install creates \/lib\/modules\/%s\/build.\\n' \"$KREL\"\n    printf '        Remember to blacklist nouveau if you use the proprietary driver.\\n'\nfi\n\nsay \"Installing modules and kernel (sudo)\"\nSTATE_STAGE=install\nstate_set status installing\nsudo make \"${MAKE_ARGS&#91;@&#93;}\" modules_install\nsudo make \"${MAKE_ARGS&#91;@&#93;}\" install\nstate_set status installed\nstate_set finished \"$(date -Is 2>\/dev\/null || date 2>\/dev\/null || true)\"\n\nsay \"Post-install checks\"\nimg=\"\"\nfor i in \"\/boot\/initramfs-$KREL.img\" \"\/boot\/initrd.img-$KREL\"; do &#91; -f \"$i\" &#93; &amp;&amp; img=\"$i\"; done\nif &#91; -n \"$img\" &#93;; then\n    lsi=\"\"; command -v lsinitrd >\/dev\/null &amp;&amp; lsi=lsinitrd\n    &#91; -z \"$lsi\" &#93; &amp;&amp; command -v lsinitramfs >\/dev\/null &amp;&amp; lsi=lsinitramfs\n    if &#91; -n \"$lsi\" &#93;; then\n        for fw in amdgpu nvidia i915 xe; do\n            &#91; \"$fw\" = amdgpu &#93; &amp;&amp; &#91; \"$W_AMD\"   != 1 &#93; &amp;&amp; continue\n            &#91; \"$fw\" = nvidia &#93; &amp;&amp; &#91; \"$W_NV\"    != 1 &#93; &amp;&amp; continue\n            { &#91; \"$fw\" = i915 &#93; || &#91; \"$fw\" = xe &#93;; } &amp;&amp; &#91; \"$W_INTEL\" != 1 &#93; &amp;&amp; continue\n            n=$(sudo \"$lsi\" \"$img\" 2>\/dev\/null | grep -c \"firmware\/$fw\" || true)\n            &#91; \"${n:-0}\" -gt 0 &#93; &amp;&amp; printf '  ok   %s %s firmware files in the initramfs\\n' \"$n\" \"$fw\" \\\n                                || warn \"no $fw firmware in $img -- install linux-firmware and\n         regenerate the initramfs BEFORE rebooting, or that GPU will not come up.\"\n        done\n    fi\nfi\n&#91; -e \"\/lib\/modules\/$KREL\/build\" &#93; \\\n    &amp;&amp; printf '  ok   \/lib\/modules\/%s\/build present -- DKMS and out-of-tree modules can build\\n' \"$KREL\" \\\n    || warn \"\/lib\/modules\/$KREL\/build is missing; DKMS modules cannot build against this kernel\"\n# Driver presence check.\n#\n# NOTE ON SPELLING: these are FILE names, and kernel module files keep their\n# hyphens -- virtio-gpu.ko, snd-hda-intel.ko, xen-blkfront.ko.  Nearly 40% of\n# the modules in a typical kernel have a hyphen.  It is the module's internal\n# NAME that uses underscores, which is what lsmod, modinfo -F name, \/proc\/modules\n# and \/sys\/module\/ all display.  Since this searches with find -name, the hyphen\n# is correct; \"fixing\" virtio-gpu to virtio_gpu here finds nothing.\n#\n# A driver absent from \/lib\/modules is not necessarily a failure -- it may be\n# built in (=y), which is a perfectly good outcome and produces no .ko at all.\n# The old version of this loop printed nothing in that case, so a driver that\n# genuinely failed to build looked identical to one that succeeded as built-in.\n# Consult .config to tell those two apart.\nfor entry in \"amdgpu:DRM_AMDGPU\" \"nouveau:DRM_NOUVEAU\" \"i915:DRM_I915\" \\\n             \"xe:DRM_XE\" \"simpledrm:DRM_SIMPLEDRM\" \"virtio-gpu:DRM_VIRTIO_GPU\"; do\n    m=\"${entry%%:*}\"; sym=\"${entry#*:}\"\n    if find \"\/lib\/modules\/$KREL\" -name \"$m.ko*\" 2>\/dev\/null | head -1 | grep -q .; then\n        printf '  ok   %-12s installed as a module (%s.ko)\\n' \"$m\" \"$m\"\n    elif grep -q \"^CONFIG_$sym=y\" .config 2>\/dev\/null; then\n        printf '  ok   %-12s built into the kernel image (CONFIG_%s=y)\\n' \"$m\" \"$sym\"\n    elif grep -q \"^CONFIG_$sym=m\" .config 2>\/dev\/null; then\n        warn \"$m: CONFIG_$sym=m was requested but no $m.ko was installed.\n       That is a real failure -- check the modules_install step.\"\n    else\n        printf '  --   %-12s not enabled in this config\\n' \"$m\"\n    fi\ndone\n\nsay \"Done. Keep your current kernel in the boot menu until $KREL is proven.\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\">#!\/usr\/bin\/env bash<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># universal_linux_kernel_build.sh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Download, configure, build and install a mainline Linux kernel that works on<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># whatever graphics you actually have -- AMD, NVIDIA, Intel, a virtual machine,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># or a headless server -- with the GPU compute and NPU (&quot;AI&quot;) paths turned on.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># It starts from your running distro&#39;s config so your existing hardware keeps<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># working, then enforces the options GPU compute needs and that hand-rolled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># configs most often get wrong.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   .\/universal_linux_kernel_build.sh                 # detect, build only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   INSTALL=1 .\/universal_linux_kernel_build.sh       # build, then install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   GPU=auto        detect from lspci (default)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   GPU=all         every vendor -- a kernel that boots on anything<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   GPU=amd,intel   a comma-separated list: amd nvidia intel vm<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   KVER=6.12.9 .\/universal_linux_kernel_build.sh     # a specific release<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   SRC=~\/src\/linux .\/universal_linux_kernel_build.sh # an existing tree<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   TOOLCHAIN=llvm LLVM_PREFIX=$HOME\/opt\/clang-current\/bin\/ .\/universal_...sh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CLEAN=auto      mrproper the tree only if the last attempt did not finish<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CLEAN=always    mrproper first, every time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CLEAN=never     never clean; always build incrementally<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CONFIG_BASE=auto      keep the tree&#39;s .config if it has one, else the distro&#39;s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CONFIG_BASE=distro    always reseed from \/boot\/config-$(uname -r)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CONFIG_BASE=defconfig start from the arch defconfig<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   CONFIG_BASE=&lt;path&gt;    start from a config file you name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   FRAME_WARN=8192 -Wframe-larger-than=; 0 disables the check entirely<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Two files are written beside this script (override with STATE_FILE= \/ BUILD_LOG=):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   kernel_build.ini   what was done to each source tree, one &#91;section&#93; each<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#   kernel_build.log   full output of the last build (previous kept as .log.prev)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># THE ONE THING THIS SCRIPT EXISTS TO GET RIGHT: GPU drivers are MODULES.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Built-in (=y) is the most common mistake in hand-rolled GPU kernel configs.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># A built-in driver probes before the root filesystem is mounted, so all of its<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># firmware must already be in the initramfs -- but dracut and initramfs-tools<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># decide which firmware to include by looking at which MODULES are installed,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and a built-in driver is not a module. The result is a driver that cannot load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># its firmware: no display, no \/dev\/kfd. As modules they also stay unloadable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and blacklistable, which the NVIDIA proprietary stack requires.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Licence: public domain \/ CC0. No warranty. It installs a kernel; read it first.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-euo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">pipefail<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --- integrity self-check -------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># This file must be pure ASCII.  Copying a script out of a web page or a chat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># window silently replaces ordinary spaces with U+00A0 (non-breaking space),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># which bash treats as part of a command name -- you get &quot;command not found&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># on a line that looks perfectly correct.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># NOTE: the body below is deliberately NOT indented.  Leading whitespace is<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># exactly what gets converted, so an indented error handler is unable to report<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># the corruption it just detected -- it fails as &quot;printf: command not found&quot;.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> LC_ALL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">C<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">tr<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-d<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\11\\12\\40-\\176&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$0<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">head<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-c<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> LC_ALL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">C<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;ERROR: %s contains non-ASCII bytes.\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$0<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;It was almost certainly corrupted by copy-paste from a web page.\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;Repair it with:\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;    sed -i &#39;s\/%s\/ \/g&#39; %s\\n&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\xc2\\xa0&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$0<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;or, better, download the file directly instead of pasting it.\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --------------------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">GPU<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">GPU<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">auto<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">KVER<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">KVER<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">                                  <\/span><span style=\"color: #88846F\"># empty = latest stable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SRC<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">SRC<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">                                    <\/span><span style=\"color: #88846F\"># empty = download a tarball<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">WORK<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">WORK<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">$HOME<\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #F8F8F2\">src<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">LOCALVERSION<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">LOCALVERSION<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">-gpu<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">FRAME_WARN<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">FRAME_WARN<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">8192<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">     <\/span><span style=\"color: #88846F\"># -Wframe-larger-than=; 0 disables, 8192 is the Kconfig max<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># De-export it.  This is OUR knob, but kbuild has a variable of the SAME NAME<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and means something else by it: scripts\/setlocalversion ends with<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#     echo &quot;${KERNELVERSION}${file_localversion}${config_localversion}${LOCALVERSION}${scm_version}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># so a LOCALVERSION that is in make&#39;s ENVIRONMENT is appended on top of the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># CONFIG_LOCALVERSION this script sets below -- and the release comes out as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># 7.2.0-gpu-gpu.  It only bites when the value arrived from the environment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># (an orchestrator, or `LOCALVERSION=-x .\/this.sh`), because a plain assignment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># does not export, but a value inherited from the environment stays exported<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># through re-assignment.  The config setting below is the only path we want.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">export<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">LOCALVERSION<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ------------------------------------------------------------- build bookkeeping<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Two files live next to this script.  kernel_build.ini records what was done to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># each source tree so a later run can tell an interrupted or failed tree from a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># finished one; kernel_build.log is the full output of the last build.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># The .ini is keyed by SOURCE TREE, not by version -- one &#91;section&#93; per tree --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># because a single machine easily ends up with several (a KVER= build in ~\/src<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># beside an SRC=\/KERNEL_SRC= tree elsewhere), and a state file that assumed one<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># tree would confidently report the wrong one.  Delete it any time: a missing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># entry simply reads as &quot;previous attempt unknown&quot;.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SELF_DIR<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #E6DB74\"> &quot;$(<\/span><span style=\"color: #A6E22E\">dirname<\/span><span style=\"color: #E6DB74\"> &quot;${<\/span><span style=\"color: #F8F8F2\">BASH_SOURCE<\/span><span style=\"color: #E6DB74\">&#91;0&#93;}&quot;)&quot; <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">2&gt;&amp;1<\/span><span style=\"color: #E6DB74\"> &amp;&amp; <\/span><span style=\"color: #66D9EF\">pwd<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> SELF_DIR<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$PWD<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_FILE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE_FILE<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">$SELF_DIR<\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #F8F8F2\">kernel_build<\/span><span style=\"color: #E6DB74\">.<\/span><span style=\"color: #F8F8F2\">ini<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">BUILD_LOG<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">BUILD_LOG<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">$SELF_DIR<\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #F8F8F2\">kernel_build<\/span><span style=\"color: #E6DB74\">.<\/span><span style=\"color: #F8F8F2\">log<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">CLEAN<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">CLEAN<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">auto<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># auto: clean only an unfinished tree | always | never<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Where the configuration comes from.  &quot;auto&quot; keeps a .config the tree already<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># has and only seeds from the running distro when there is none, so re-running<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># no longer throws away work between runs.  The enforcement below re-applies to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># whatever base is chosen, and the verify block still refuses to install a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># config that did not come out right, so keeping an existing one is safe.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">CONFIG_BASE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">CONFIG_BASE<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">auto<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #88846F\"># auto | distro | defconfig | \/path\/to\/config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Both are touched only AFTER this script has chdir&#39;d into $WORK and then $SRC,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># so a relative override would land somewhere the user did not mean.  Resolve<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># them against the directory we were invoked from, once, while that is still cwd.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> $STATE_FILE <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> \/<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) ;; <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) STATE_FILE=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$PWD<\/span><span style=\"color: #E6DB74\">\/<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;; <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> $BUILD_LOG  <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> \/<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) ;; <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) BUILD_LOG=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$PWD<\/span><span style=\"color: #E6DB74\">\/<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">   ;; <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">JOBS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">JOBS<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #F8F8F2\">nproc<\/span><span style=\"color: #E6DB74\">)}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">INSTALL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">INSTALL<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">0<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">INSTALL_DEPS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">INSTALL_DEPS<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">1<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">TOOLCHAIN<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">TOOLCHAIN<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">gcc<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">                     <\/span><span style=\"color: #88846F\"># gcc | llvm<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">LLVM_PREFIX<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">LLVM_PREFIX<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">                    <\/span><span style=\"color: #88846F\"># e.g. $HOME\/opt\/clang-current\/bin\/  (TRAILING SLASH)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">KEEP_DEBUG_INFO<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">KEEP_DEBUG_INFO<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">0<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #88846F\"># 1 keeps DWARF+BTF (far bigger, far slower)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\">()  { <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\n\\033[1m==&gt; %s\\033[0m\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F\">$*<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\">() { <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\033[33mwarning:\\033[0m %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F\">$*<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\">()  { <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\n\\033[31mERROR:\\033[0m %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F\">$*<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;&amp;2<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #66D9EF\">exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ---------------------------------------------------------------- state helpers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Loaded into an associative array and flushed whole, rather than edited in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># place.  Sections for OTHER trees are copied through verbatim, so two trees<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># never clobber each other, and a flush after every set means the record<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># survives a kill -9 mid-build -- which is exactly the case it exists to detect.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">declare<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-A<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">STATE=<\/span><span style=\"color: #F8F8F2\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_OK<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_STAGE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">startup<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_init<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">d<\/span><span style=\"color: #F8F8F2\">; d<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">dirname<\/span><span style=\"color: #E6DB74\"> &quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-d<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$d<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; &#91; <\/span><span style=\"color: #F92672\">-w<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$d<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; { &#91; <\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-w<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; }; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        STATE_OK<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;cannot write <\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\"> -- continuing without build-state tracking.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       Set STATE_FILE=&lt;path&gt; to somewhere writable, or pass CLEAN=always\/never<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       to decide about cleaning explicitly.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_load<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_OK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">line<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">k<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">inm=<\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">while<\/span><span style=\"color: #F8F8F2\"> IFS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">read<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-r<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">line<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&quot;&#91;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&#93;&quot;<\/span><span style=\"color: #F8F8F2\">) inm=1; <\/span><span style=\"color: #F92672\">continue<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #AE81FF\">\\[<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)      inm=0; <\/span><span style=\"color: #F92672\">continue<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #E6DB74\">&#39;&#39;<\/span><span style=\"color: #F8F8F2\">|<\/span><span style=\"color: #E6DB74\">&#39;#&#39;<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)  <\/span><span style=\"color: #F92672\">continue<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$inm<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">=<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) ;; <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #F92672\">continue<\/span><span style=\"color: #F8F8F2\"> ;; <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        k<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">${line<\/span><span style=\"color: #F92672\">%%<\/span><span style=\"color: #F8F8F2\">=<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">}; v<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">${line<\/span><span style=\"color: #F92672\">#*<\/span><span style=\"color: #F8F8F2\">=}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        k<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">${k<\/span><span style=\"color: #F92672\">\/\/<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #F8F8F2\">}; k<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">${k<\/span><span style=\"color: #F92672\">\/\/<\/span><span style=\"color: #E6DB74\">$&#39;<\/span><span style=\"color: #AE81FF\">\\t<\/span><span style=\"color: #E6DB74\">&#39;<\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #F8F8F2\">}; v<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">${v<\/span><span style=\"color: #F92672\">#<\/span><span style=\"color: #F8F8F2\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># An if, not `&#91; -n &quot;$k&quot; &#93; &amp;&amp; ...`: a while-read returns the status of the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># last command in its body, so a trailing blank key would make state_load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># return 1 and `set -e` would kill the run silently at the call site.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$k<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">STATE&#91;<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #F8F8F2\">$k<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #A6E22E\">&#93;<\/span><span style=\"color: #F8F8F2\">=<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #F8F8F2\">$v<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">done<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_flush<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_OK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">tmp<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">k<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    tmp<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">mktemp<\/span><span style=\"color: #E6DB74\"> &quot;${<\/span><span style=\"color: #F8F8F2\">STATE_FILE<\/span><span style=\"color: #E6DB74\">}.XXXXXX&quot; <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;# universal_linux_kernel_build.sh -- build state, one &#91;section&#93; per source tree.\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;# Written automatically; safe to delete.\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># cat -s squeezes the blank line that the awk pass preserves and the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># printf below re-emits; without it the file gains one blank per write.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #A6E22E\">awk<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">sec=&quot;&#91;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&#93;&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\/^\\[\/ { keep = ($0 != sec) } keep&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">cat<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\n&#91;%s&#93;\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> k <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;%s = %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$k<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;$k&#93;}&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">done<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">sort<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    } <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #F8F8F2\">\/dev\/null &amp;&amp; <\/span><span style=\"color: #A6E22E\">mv<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">rm<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\">() { &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_OK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">STATE&#91;<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #A6E22E\">&#93;<\/span><span style=\"color: #F8F8F2\">=<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$2<\/span><span style=\"color: #A6E22E\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">state_flush<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Records a failure without changing the exit status.  `local rc=$?` must stay<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># the first statement or it captures the wrong command.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">_state_on_exit<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> rc<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #FD971F\">$?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_OK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$rc<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-ne<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        STATE&#91;status&#93;<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">failed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        STATE&#91;stage&#93;<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_STAGE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        STATE&#91;exit_code&#93;<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$rc<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        STATE&#91;finished&#93;<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-Is<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">state_flush<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">DNF_PKGS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;gcc make flex bison bc openssl-devel elfutils-libelf-devel dwarves<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">          ncurses-devel rsync cpio perl python3 xz zstd git tar pciutils&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">APT_PKGS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;build-essential flex bison bc libssl-dev libelf-dev dwarves<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">          libncurses-dev rsync cpio perl python3 xz-utils zstd git tar pciutils&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Best-effort, deliberately.  A package manager exits non-zero for reasons that<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># have nothing to do with the packages asked for -- one third-party repo with an<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># unverifiable GPG key is enough, and dnf then refuses to load metadata and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># exits 1 in the first ten seconds.  Under `set -e` a bare install call would<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># take a multi-hour build down with it for a reason the user cannot see from the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># error.  So warn and carry on: the Preflight loop immediately below is the real<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># gate, and it names the tool that is actually missing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$INSTALL_DEPS<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Installing build dependencies (sudo)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">dnf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">dnf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> $DNF_PKGS <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;dnf could not install every dependency; continuing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       If the build fails on a missing header, that is where to look.  A single<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       broken repo is the usual cause -- retry with<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">           sudo dnf install -y --disablerepo=&lt;broken&gt; <\/span><span style=\"color: #F8F8F2\">$DNF_PKGS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       or set INSTALL_DEPS=0 if you know the packages are already present.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># Separate statements, not `update &amp;&amp; install`: chained, a failed update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># makes the whole list non-zero and set -e kills the script with nothing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># printed.  A stale index is not a reason to refuse to build.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">update<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;apt-get update failed; using the cached package lists&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">apt-get<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-y<\/span><span style=\"color: #F8F8F2\"> $APT_PKGS <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;apt-get could not install every dependency; continuing.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;no dnf\/apt-get -- install kernel build deps yourself, then re-run with INSTALL_DEPS=0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Preflight&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> t <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> make gcc flex bison bc rsync cpio; <\/span><span style=\"color: #F92672\">do<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$t<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;missing: <\/span><span style=\"color: #F8F8F2\">$t<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">done<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">id<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-u<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-ne<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;do not run this whole script as root.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       The build runs as you; only the install steps use sudo.&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ------------------------------------------------------------------ GPU detect<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># VM\/legacy drivers are ALWAYS enabled. They are a few hundred KB of modules and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># they are the difference between &quot;this kernel boots on my machine&quot; and &quot;this<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># kernel boots anywhere&quot; -- a VM, a server with an ASPEED BMC, a rescue boot on<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># unfamiliar hardware. There is no reason to leave them out.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">W_AMD<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; W_NV<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; W_INTEL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">lspci<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">while<\/span><span style=\"color: #F8F8F2\"> IFS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">read<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-r<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">line<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">&#91;Aa&#93;&#91;Mm&#93;&#91;Dd&#93;<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">|<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">ATI<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) W_AMD=1;   <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  found: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">NVIDIA<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">|<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">nVidia<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)    W_NV=1;    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  found: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">Intel<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)              W_INTEL=1; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  found: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$line<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">done<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&lt;(<\/span><span style=\"color: #A6E22E\">lspci<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-nn<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-Ei<\/span><span style=\"color: #E6DB74\"> &#39;vga|3d|display&#39; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$GPU<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  auto)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_AMD$W_NV$W_INTEL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;000&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;no AMD\/NVIDIA\/Intel GPU detected (headless, VM, or unknown hardware).<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">         Enabling all vendors so the kernel boots anywhere. Use GPU= to narrow it.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        W_AMD<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">; W_NV<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">; W_INTEL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  all) W_AMD=1; W_NV<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">; W_INTEL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    W_AMD<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; W_NV<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; W_INTEL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    IFS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&#39;,&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">read<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-ra<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">want<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&lt;&lt;&lt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$GPU<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> v <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">want<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">v<\/span><span style=\"color: #F92672\">\/\/<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">\/<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        amd) W_AMD=1 ;; nvidia|nv) W_NV=1 ;; intel) W_INTEL=1 ;; vm|none) ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) die <\/span><span style=\"color: #E6DB74\">&quot;unknown GPU vendor &#39;<\/span><span style=\"color: #F8F8F2\">$v<\/span><span style=\"color: #E6DB74\">&#39; (use: auto all amd nvidia intel vm)&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">esac<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">done<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  enabling  : %s%s%s%s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #E6DB74\">&quot;$(&#91; &quot;<\/span><span style=\"color: #F8F8F2\">$W_AMD<\/span><span style=\"color: #E6DB74\">&quot; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #E6DB74\"> &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #E6DB74\"> &#39;AMD &#39;)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;$(&#91; &quot;<\/span><span style=\"color: #F8F8F2\">$W_NV<\/span><span style=\"color: #E6DB74\">&quot; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #E6DB74\"> &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #E6DB74\"> &#39;NVIDIA &#39;)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #E6DB74\">&quot;$(&#91; &quot;<\/span><span style=\"color: #F8F8F2\">$W_INTEL<\/span><span style=\"color: #E6DB74\">&quot; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #E6DB74\"> &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #E6DB74\"> &#39;Intel &#39;)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;VM\/legacy(always)&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">-j&quot;<\/span><span style=\"color: #F8F8F2\">$JOBS<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$TOOLCHAIN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> llvm &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$LLVM_PREFIX<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$LLVM_PREFIX<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">\/) ;; <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) die <\/span><span style=\"color: #E6DB74\">&quot;LLVM_PREFIX must end in a slash -- kbuild treats it as a path prefix&quot;<\/span><span style=\"color: #F8F8F2\">;; <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    MAKE_ARGS<\/span><span style=\"color: #F92672\">+=<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">LLVM=&quot;${<\/span><span style=\"color: #F8F8F2\">LLVM_PREFIX<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">1<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># tools\/lib\/bpf can be compiled by gcc (non-PIC) while the host link runs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># clang\/ld.lld, which defaults to PIE. That mix fails building<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># tools\/bpf\/resolve_btfids with R_X86_64_32 relocation errors.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    MAKE_ARGS<\/span><span style=\"color: #F92672\">+=<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">HOSTLDFLAGS=-no-pie<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  toolchain : clang (%s)\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">LLVM_PREFIX<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">from<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F8F8F2\">PATH<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  toolchain : %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">gcc<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">--version<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">head<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-1<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ---------------------------------------------------------------------- source<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-z<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-z<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        KVER<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">curl<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-fsSL<\/span><span style=\"color: #E6DB74\"> https:\/\/www.kernel.org\/finger_banner <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">            <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">awk<\/span><span style=\"color: #E6DB74\"> &#39;\/latest stable\/{print $NF; exit}&#39;)<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;could not determine the latest kernel version; set KVER=&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    SRC<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$WORK<\/span><span style=\"color: #E6DB74\">\/linux-<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-d<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">mkdir<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-p<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$WORK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$WORK<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Downloading linux-<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">curl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-fL<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--progress-bar<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-O<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;https:\/\/cdn.kernel.org\/pub\/linux\/kernel\/v${<\/span><span style=\"color: #F8F8F2\">KVER<\/span><span style=\"color: #F92672\">%%<\/span><span style=\"color: #E6DB74\">.<\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #E6DB74\">}.x\/linux-<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">.tar.xz&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">tar<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">xf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;linux-<\/span><span style=\"color: #F8F8F2\">$KVER<\/span><span style=\"color: #E6DB74\">.tar.xz&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">\/Makefile&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;no kernel source at <\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Canonicalise now that we are standing in it, BEFORE it becomes a state key.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># SRC is the &#91;section&#93; name, and a trailing slash from tab-completion, a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># relative &quot;.&quot; or a symlinked path would each key the same tree differently --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and a key that misses reads as &quot;no previous attempt&quot;, which under CLEAN=auto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># means mrproper on a tree that was perfectly good.  pwd -P resolves all three.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SRC<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #66D9EF\">pwd<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-P<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  source    : %s (%s)\\n  jobs      : %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-s<\/span><span style=\"color: #E6DB74\"> kernelversion)&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$JOBS<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ------------------------------------------------------- previous build attempt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_init<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">trap<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">_state_on_exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">EXIT<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Previous build attempt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">prev_status<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;status&#93;<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># -print -quit stops at the first hit: on a fully built tree this answers in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># milliseconds, where counting all ~16000 objects would walk 4.6G of tree.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">objects<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">find<\/span><span style=\"color: #E6DB74\"> . <\/span><span style=\"color: #AE81FF\">-name<\/span><span style=\"color: #E6DB74\"> &#39;*.o&#39; <\/span><span style=\"color: #AE81FF\">-not<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-path<\/span><span style=\"color: #E6DB74\"> &#39;.\/scripts\/*&#39; <\/span><span style=\"color: #AE81FF\">-print<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-quit<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  recorded  : %s&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    [ <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;finished&#93;<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\"> ] &amp;&amp; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39; (%s)&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;finished&#93;}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> failed &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39; at stage %s&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;stage&#93;<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">unknown<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  recorded  : nothing -- no entry for this tree in %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$STATE_FILE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">do_clean<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CLEAN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  never)  clean_why=<\/span><span style=\"color: #E6DB74\">&quot;CLEAN=never&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  always) do_clean=1; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;CLEAN=always&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  auto)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-z<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$objects<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;no object files present -- nothing to clean&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          built|installed) clean_why=<\/span><span style=\"color: #E6DB74\">&quot;the previous run finished (<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">); rebuilding incrementally is correct and far faster&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          building)        do_clean=1; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;a previous run started and never recorded finishing -- interrupted or killed&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          failed)          do_clean=1; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;the previous run failed at stage ${<\/span><span style=\"color: #F8F8F2\">STATE<\/span><span style=\"color: #E6DB74\">&#91;stage&#93;<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">unknown<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">)              do_clean=1; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;objects are present but nothing recorded how they got there&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)               do_clean=1; clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;recorded status &#39;<\/span><span style=\"color: #F8F8F2\">$prev_status<\/span><span style=\"color: #E6DB74\">&#39; is not a completed build&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">) die <\/span><span style=\"color: #E6DB74\">&quot;CLEAN must be auto, always or never (got &#39;<\/span><span style=\"color: #F8F8F2\">$CLEAN<\/span><span style=\"color: #E6DB74\">&#39;)&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Back up BEFORE announcing or doing anything, and re-test afterwards.  If the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># configuration cannot be saved then cleaning would destroy it outright, and not<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># cleaning is always the safer of the two -- an incremental build on a suspect<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># tree is a slow problem, a deleted config is an unrecoverable one.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$do_clean<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    _bk<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> .config &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># The FIRST backup is the valuable one: by the second cleaning run<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># .config may no longer be the user&#39;s file, so overwriting a fixed name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># would replace the only copy of their original.  Keep the first,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># timestamp the rest.  --remove-destination because a plain `cp -a` onto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #88846F\"># an existing symlink writes THROUGH it, clobbering its target.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        _bk<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">.config.before-clean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &#91; <\/span><span style=\"color: #F92672\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; _bk<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;.config.before-clean.$(<\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> +%Y%m%d-%H%M%S <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">echo<\/span><span style=\"color: #E6DB74\"> prev)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">cp<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-a<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--remove-destination<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  saved     : .config -&gt; %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            do_clean<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">; _bk<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            clean_why<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;could not save .config, so cleaning would destroy it&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;cannot back up <\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">\/.config -- NOT cleaning this tree.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       Fix its permissions, or move it aside yourself, or pass CLEAN=never to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       stop being asked.  Building incrementally instead.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># A SECOND test, not an else: $do_clean can have been cleared just above, and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># the previous version of this block set it there and then cleaned anyway --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># printing &quot;not cleaning&quot; immediately before deleting the file it could not save.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$do_clean<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  cleaning  : %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$clean_why<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># mrproper, not clean: the failure this recovers from is a tree left<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># inconsistent, and `make clean` keeps include\/config and the generated<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># headers that are the usual culprits.  It deletes .config too, which is<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># incidental -- cleaning is about build PRODUCTS, not your configuration --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># so that is restored immediately afterwards.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    STATE_STAGE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">clean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-s<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">mrproper<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  cleaned   : %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># Only for CONFIG_BASE=auto: the other modes are an explicit instruction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># about where the config comes from, and restoring one would contradict it.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> auto &#93; &amp;&amp; &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">cp<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-a<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--remove-destination<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &amp;&amp; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  restored  : .config kept across the clean (from %s)\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$_bk<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  keeping   : %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$clean_why<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">tree<\/span><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">version<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-s<\/span><span style=\"color: #E6DB74\"> kernelversion)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">toolchain<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$TOOLCHAIN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">jobs<\/span><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$JOBS<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">log<\/span><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">started<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-Is<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #E6DB74\">configuring<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">stage<\/span><span style=\"color: #F8F8F2\">     <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">exit_code<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">finished<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #88846F\"># or the previous run&#39;s finish time reads as this one&#39;s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_STAGE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">configure<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --------------------------------------------------------------------- configure<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Configuring&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Copy the running distro&#39;s config in.  Factored out because CONFIG_BASE=auto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># calls it only as a fallback, where the old code called it unconditionally and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># so destroyed a tuned .config on every single run.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Never write .config in place.  A redirect truncates the target before the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># first byte arrives, so a corrupt source or a killed run leaves a FRAGMENT --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and under CONFIG_BASE=auto the next run would adopt that fragment as its base,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># with olddefconfig silently defaulting every symbol the fragment never reached.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Writing to a temp and renaming makes the swap atomic; rename also replaces a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># .config SYMLINK rather than writing through it to whatever it points at.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">install_config<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> src<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">tmp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    tmp<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;.config.seed.<\/span><span style=\"color: #FD971F\">$$<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$src<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">.gz) zcat <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$src<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)    cp    <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$src<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">esac<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> { <\/span><span style=\"color: #A6E22E\">rm<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;could not read the config at <\/span><span style=\"color: #F8F8F2\">$src<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #F92672\">-s<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> { <\/span><span style=\"color: #A6E22E\">rm<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;the config at <\/span><span style=\"color: #F8F8F2\">$src<\/span><span style=\"color: #E6DB74\"> is empty&quot;<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">mv<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$tmp<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">seed_from_distro<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">local<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">c<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">base=&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> c <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/boot\/config-$(<\/span><span style=\"color: #A6E22E\">uname<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-r<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><span style=\"color: #F8F8F2\"> \/proc\/config.gz; <\/span><span style=\"color: #F92672\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &#91; <\/span><span style=\"color: #F92672\">-r<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$c<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; { base<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$c<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">break<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">done<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$base<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  base: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$base<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">install_config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$base<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;no distro config found; starting from defconfig -- review before installing&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">defconfig<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">case<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  auto)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #88846F\"># Cheap sanity gate before adopting it: a truncated or empty file would<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #88846F\"># otherwise be taken as authoritative and quietly defaulted by<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #88846F\"># olddefconfig into a config nobody chose.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-s<\/span><span style=\"color: #F8F8F2\"> .config &#93; &amp;&amp; <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;^CONFIG_&#91;A-Z0-9_&#93;*=&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  base: the .config already in this tree -- kept, not replaced\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;        (CONFIG_BASE=distro to reseed from the running kernel)\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          &#91; <\/span><span style=\"color: #F92672\">-e<\/span><span style=\"color: #F8F8F2\"> .config &#93; &amp;&amp; <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$SRC<\/span><span style=\"color: #E6DB74\">\/.config is empty or has no CONFIG_ lines -- ignoring it<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       and seeding from the running kernel instead.  The old file is kept as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       .config.rejected if you want to look at it.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          &#91; <\/span><span style=\"color: #F92672\">-e<\/span><span style=\"color: #F8F8F2\"> .config &#93; &amp;&amp; <\/span><span style=\"color: #A6E22E\">mv<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config.rejected<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #A6E22E\">seed_from_distro<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">fi<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  distro)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #A6E22E\">seed_from_distro<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  defconfig)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  base: make defconfig\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">defconfig<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      &#91; <\/span><span style=\"color: #F92672\">-r<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;CONFIG_BASE=<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\"> is not a readable file.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       Expected: auto, distro, defconfig, or a path to a kernel config.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  base: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #A6E22E\">install_config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> ;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">esac<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Bring whatever base was chosen up to date with THIS tree&#39;s Kconfig before the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># enforcement below.  A config from another kernel version is missing symbols<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># this one has; without this, scripts\/config sets options against a stale symbol<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># table and the second olddefconfig quietly drops them again.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">olddefconfig<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">config_base<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$CONFIG_BASE<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\">() { <\/span><span style=\"color: #A6E22E\">.\/scripts\/config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$@<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --- shared GPU-compute plumbing ---------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># These are DEPENDENCIES, not preferences. HSA_AMD_SVM depends on DEVICE_PRIVATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and HSA_AMD_P2P depends on PCI_P2PDMA; with those off, asking for them<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># silently does nothing and olddefconfig quietly drops them. The same machinery<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># backs NVIDIA UVM\/GPUDirect and Intel&#39;s shared virtual memory.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">ZONE_DEVICE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEVICE_PRIVATE<\/span><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\"># unaddressable device memory (HMM)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">PCI_P2PDMA<\/span><span style=\"color: #F8F8F2\">              <\/span><span style=\"color: #88846F\"># peer-to-peer DMA between GPUs over PCIe<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">HMM_MIRROR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">MMU_NOTIFIER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DMA_SHARED_BUFFER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_ACCEL<\/span><span style=\"color: #F8F8F2\">               <\/span><span style=\"color: #88846F\"># the accel subsystem both NPUs live under<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --- always: a console before any GPU driver, and the VM\/BMC drivers ---------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">SYSFB_SIMPLEFB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_SIMPLEDRM<\/span><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #88846F\"># EFI\/VESA framebuffer -- your rescue console<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_VIRTIO_GPU<\/span><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\"># QEMU\/KVM, virt-manager, most Linux VMs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_VMWGFX<\/span><span style=\"color: #F8F8F2\">              <\/span><span style=\"color: #88846F\"># VMware<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_QXL<\/span><span style=\"color: #F8F8F2\">                 <\/span><span style=\"color: #88846F\"># SPICE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_BOCHS<\/span><span style=\"color: #F8F8F2\">               <\/span><span style=\"color: #88846F\"># QEMU -vga std<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_AST<\/span><span style=\"color: #F8F8F2\">                 <\/span><span style=\"color: #88846F\"># ASPEED BMC -- almost every rack server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_HYPERV<\/span><span style=\"color: #F8F8F2\">              <\/span><span style=\"color: #88846F\"># Hyper-V \/ WSL2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_UDL<\/span><span style=\"color: #F8F8F2\">                 <\/span><span style=\"color: #88846F\"># DisplayLink USB adapters<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_AMD<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># --- AMD: display, ROCm compute, and the Ryzen AI NPU --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU<\/span><span style=\"color: #F8F8F2\">              <\/span><span style=\"color: #88846F\"># MODULE, not built-in -- see the header<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_AMD_DC<\/span><span style=\"color: #F8F8F2\">             <\/span><span style=\"color: #88846F\"># modern display stack: atomic KMS, DP\/HDMI audio<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU_USERPTR<\/span><span style=\"color: #F8F8F2\">     <\/span><span style=\"color: #88846F\"># required by ROCm and by GL\/Vulkan interop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU_SI<\/span><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\"># Southern Islands (older GCN)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU_CIK<\/span><span style=\"color: #F8F8F2\">         <\/span><span style=\"color: #88846F\"># Sea Islands<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">HSA_AMD<\/span><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #88846F\"># KFD -- creates \/dev\/kfd, ROCm&#39;s entry point<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">HSA_AMD_SVM<\/span><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\"># shared virtual memory: HIP managed memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">HSA_AMD_P2P<\/span><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #88846F\"># direct GPU-to-GPU transfers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">AMD_IOMMU<\/span><span style=\"color: #F8F8F2\">              <\/span><span style=\"color: #88846F\"># DRM_ACCEL_AMDXDNA depends on it<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_ACCEL_AMDXDNA<\/span><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #88846F\"># &quot;AMD AI Engine&quot; NPU, Ryzen AI 300+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_NV<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># --- NVIDIA --------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># nouveau is the in-tree open driver. Build it as a MODULE even if you intend<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># to use NVIDIA&#39;s proprietary or open-kernel modules: those require nouveau<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># to be absent at load time, and you can only blacklist a module.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># NVIDIA&#39;s own modules are out-of-tree and built by DKMS against<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># \/lib\/modules\/$KREL\/build, which `make modules_install` creates. Nothing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># else in the config is needed for them -- except that an unsigned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># out-of-tree module must be loadable, hence MODULE_SIG_FORCE off below.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># NOVA (the Rust GSP driver for Turing and later) is deliberately NOT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># enabled: it depends on CONFIG_RUST and a matching rustc\/bindgen, and is<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># still early. Enable RUST first, then NOVA_CORE and DRM_NOVA.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_NOUVEAU<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_INTEL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># --- Intel: graphics, compute, and the Meteor Lake+ NPU ------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># i915 and xe overlap on Tiger Lake .. Meteor Lake. Building BOTH as modules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># is correct and safe: only one binds a given device, chosen by the driver&#39;s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># own device table and overridable with i915.force_probe \/ xe.force_probe.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_I915<\/span><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #88846F\"># Gen2 .. Gen12: everything up to Alder\/Raptor Lake<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_XE<\/span><span style=\"color: #F8F8F2\">                  <\/span><span style=\"color: #88846F\"># Xe: Arc, Lunar Lake, Battlemage, newer iGPUs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--module<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_ACCEL_IVPU<\/span><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\"># &quot;Intel NPU&quot;, Meteor Lake (14th gen) and newer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --- things that break a copied distro config --------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Distro configs point at signing keys and revocation lists shipped in their own<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># source package. Those files are not in the upstream tarball and the build dies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># late with a confusing openssl error.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--set-str<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">SYSTEM_TRUSTED_KEYS<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--set-str<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">SYSTEM_REVOCATION_KEYS<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Same shape, one kernel release later: distro configs point EFI_SBAT_FILE at<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># kernel.sbat, which also lives only in their kernel SOURCE package.  The rule<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># in arch\/x86\/boot\/compressed\/Makefile is a bare file dependency --<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#     $(obj)\/sbat.o: $(CONFIG_EFI_SBAT_FILE)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># -- so a missing file is not a warning but a hard stop before a single object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># of the boot stub links:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#     No rule to make target &#39;kernel.sbat&#39;, needed by &#39;...\/compressed\/sbat.o&#39;.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># EFI_SBAT is `def_bool y if EFI_SBAT_FILE!=&quot;&quot;`, so it cannot be switched off<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># directly; clearing the string is what turns it off.  Nothing is lost -- SBAT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># generations are Secure Boot revocation policy owned by whoever holds the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># signing certificate, and upstream defines no components at all.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--set-str<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">EFI_SBAT_FILE<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">EFI_SBAT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">MODULE_SIG_FORCE<\/span><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #88846F\"># or no out-of-tree GPU module will load<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Distro configs set CONFIG_WERROR=y, which is reasonable for the exact kernel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and exact compiler that distro tests -- and wrong for every other pairing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># This script deliberately feeds a distro config into a DIFFERENT kernel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># version, and often with a different compiler; the new warnings that follow<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># are normal, and with WERROR they are all fatal, hours into the build.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">WERROR<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># The AMD display DML files (display_mode_vba_31 \/ _314 and friends) build ~2.4K<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># frames doing floating-point mode validation, so a distro config&#39;s 2048 warns on<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># every single build.  Raised here so the setting survives -- .config is copied<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># fresh from \/boot\/config-$(uname -r) on every run, which silently reverts a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># hand-edit.  Note what this does NOT do: -Wframe-larger-than is a diagnostic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># threshold, not an allocation.  No function gets a byte more room, vmlinux is<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># unchanged, and the real bound is THREAD_SIZE (16K on x86_64, set by<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># THREAD_SIZE_ORDER in arch\/x86\/include\/asm\/page_64_types.h).  It is consumed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># once, globally, at scripts\/Makefile.warn:25.  FRAME_WARN=3072 keeps the check<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># useful while still covering the DML files; FRAME_WARN=0 turns it off entirely.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--set-val<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">FRAME_WARN<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$FRAME_WARN<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KEEP_DEBUG_INFO<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">!=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># Full DWARF makes the build far slower and modules roughly 10x bigger. Set<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># KEEP_DEBUG_INFO=1 if you need BTF, bpftrace, or kernel debugging.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_BTF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_BTF_MODULES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># The DWARF-version choice has to be cleared BEFORE selecting NONE, and the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># order is not cosmetic.  scripts\/config edits in place, so enabling<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># DEBUG_INFO_NONE only rewrites the &#39;# CONFIG_DEBUG_INFO_NONE is not set&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># line where it already sits -- which in a distro config is the line ABOVE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y.  Kconfig resolves a choice by<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># &quot;the last one read wins&quot; (confdata.c), so the DWARF entry won, selected<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># DEBUG_INFO, and full debug info stayed on for every module -- silently,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># because nothing below checked for it.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_DWARF4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_DWARF5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--enable<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_NONE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--set-str<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">LOCALVERSION<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$LOCALVERSION<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">cfg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">--disable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">LOCALVERSION_AUTO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">olddefconfig<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># --------------------------------------------------------------------- verify<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Verifying the configuration&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">fail<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    got<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-E<\/span><span style=\"color: #E6DB74\"> &quot;^(# )?CONFIG_<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&#91; =&#93;&quot; .config <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">head<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-1<\/span><span style=\"color: #E6DB74\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$got<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;CONFIG_<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">=<\/span><span style=\"color: #FD971F; font-style: italic\">$2<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  ok   CONFIG_%-24s = %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$2<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  FAIL CONFIG_%-24s want %s, got: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$2<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">got<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">&lt;<\/span><span style=\"color: #F8F8F2\">absent<\/span><span style=\"color: #E6DB74\">&gt;}&quot;<\/span><span style=\"color: #F8F8F2\">; fail<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">note<\/span><span style=\"color: #F8F8F2\">() {  <\/span><span style=\"color: #88846F\"># informational: hardware- or arch-gated, absence is not an error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    got<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-E<\/span><span style=\"color: #E6DB74\"> &quot;^(# )?CONFIG_<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&#91; =&#93;&quot; .config <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">head<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-1<\/span><span style=\"color: #E6DB74\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  --   CONFIG_%-24s %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #FD971F; font-style: italic\">$1<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">got<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #E6DB74\">&lt;<\/span><span style=\"color: #F8F8F2\">absent<\/span><span style=\"color: #E6DB74\">&gt;}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEVICE_PRIVATE<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">PCI_P2PDMA<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_SIMPLEDRM<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">m<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_VIRTIO_GPU<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">m<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Verified, not assumed: this one failed silently for a long time, and the only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># symptom was a build that took far longer and modules ten times the size.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KEEP_DEBUG_INFO<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DEBUG_INFO_NONE<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_AMD<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">m<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_AMD_DC<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_AMDGPU_USERPTR<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">HSA_AMD<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><span style=\"color: #F8F8F2\">;    <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">HSA_AMD_SVM<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">HSA_AMD_P2P<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">note<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_ACCEL_AMDXDNA<\/span><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\"># x86_64 + AMD_IOMMU only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_NV<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;    &amp;&amp; <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_NOUVEAU<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">m<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_INTEL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">check<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">DRM_I915<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">m<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">note<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_XE<\/span><span style=\"color: #F8F8F2\">                     <\/span><span style=\"color: #88846F\"># newer trees only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">note<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #E6DB74\">DRM_ACCEL_IVPU<\/span><span style=\"color: #F8F8F2\">             <\/span><span style=\"color: #88846F\"># x86_64 only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fail<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-eq<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">die<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;the config did not come out as intended -- do NOT install this kernel.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       Each FAIL is a dependency that is off, not a typo. Run &#39;make menuconfig&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       and search (\/) for the symbol to see what it needs.&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">KREL<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-s<\/span><span style=\"color: #E6DB74\"> kernelrelease)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  kernel release: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">release<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">modules<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/lib\/modules\/<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ------------------------------------------------------------------------ build<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Building -- this takes a while. Use tmux\/screen over ssh.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_STAGE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">building<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># The previous log is kept as .prev rather than appended to, so the file cannot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># grow without bound across runs.  pipefail (set at the top) is what makes the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># tee honest: without it the pipeline would report tee&#39;s exit status and a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># failed build would look like a successful one.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">mv<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">.prev&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> { <\/span><span style=\"color: #66D9EF\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; } <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #F8F8F2\">\/dev\/null; <\/span><span style=\"color: #F92672\">then<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\"># braces: else the error escapes fd2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  logging to: %s\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;&amp;1<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">tee<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;cannot write <\/span><span style=\"color: #F8F8F2\">$BUILD_LOG<\/span><span style=\"color: #E6DB74\"> -- building without a log.  Set BUILD_LOG=&lt;path&gt;.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">built<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">finished<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-Is<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$INSTALL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Built, not installed.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  Re-run with INSTALL=1, or install by hand:\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;      sudo make %s modules_install\\n      sudo make %s install\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;*&#93;}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;*&#93;}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">exit<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># ---------------------------------------------------------------------- install<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">dkms<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> &amp;&amp; <\/span><span style=\"color: #A6E22E\">dkms<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;^amdgpu&#39;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;amdgpu-dkms is installed. It exists to backport amdgpu to OLD enterprise<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">         kernels; the in-tree driver you just built is newer. It will try, and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">         fail, to build against <\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">. To stop it without breaking your distro<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">         kernel, cap it:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">             sudo sh -c &#39;echo BUILD_EXCLUSIVE_KERNEL_MAX=<\/span><span style=\"color: #AE81FF\">\\&quot;<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">uname<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-r<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">cut<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-d-<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-f1<\/span><span style=\"color: #E6DB74\">)<\/span><span style=\"color: #AE81FF\">\\&quot;<\/span><span style=\"color: #E6DB74\"> &gt;&gt; \/usr\/src\/amdgpu-*\/dkms.conf&#39;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">dkms<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> &amp;&amp; <\/span><span style=\"color: #A6E22E\">dkms<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;^nvidia&#39;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  note: nvidia-dkms will rebuild for %s automatically once\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;        modules_install creates \/lib\/modules\/%s\/build.\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;        Remember to blacklist nouveau if you use the proprietary driver.\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Installing modules and kernel (sudo)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">STATE_STAGE<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">installing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">modules_install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">MAKE_ARGS<\/span><span style=\"color: #E6DB74\">&#91;@&#93;}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">status<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">installed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">state_set<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">finished<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;$(<\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-Is<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">date<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Post-install checks&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">img<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> i <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/boot\/initramfs-<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">.img&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/boot\/initrd.img-<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-f<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$i<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; img<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$i<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">done<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$img<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    lsi<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">lsinitrd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> &amp;&amp; lsi<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">lsinitrd<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &#91; <\/span><span style=\"color: #F92672\">-z<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$lsi<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">command<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-v<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">lsinitramfs<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> &amp;&amp; lsi<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">lsinitramfs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #F92672\">-n<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$lsi<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> &#93;; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> fw <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> amdgpu nvidia i915 xe; <\/span><span style=\"color: #F92672\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> amdgpu &#93; &amp;&amp; &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_AMD<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F92672\">!=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #F92672\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> nvidia &#93; &amp;&amp; &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_NV<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">!=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #F92672\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            { &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> i915 &#93; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> xe &#93;; } &amp;&amp; &#91; <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$W_INTEL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">!=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #F92672\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            n<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">$(<\/span><span style=\"color: #A6E22E\">sudo<\/span><span style=\"color: #E6DB74\"> &quot;<\/span><span style=\"color: #F8F8F2\">$lsi<\/span><span style=\"color: #E6DB74\">&quot; &quot;<\/span><span style=\"color: #F8F8F2\">$img<\/span><span style=\"color: #E6DB74\">&quot; <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #AE81FF\">-c<\/span><span style=\"color: #E6DB74\"> &quot;firmware\/<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot; <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #66D9EF\">true<\/span><span style=\"color: #E6DB74\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &#91; <\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">n<\/span><span style=\"color: #F92672\">:-<\/span><span style=\"color: #F8F8F2\">0<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">-gt<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\"> &#93; &amp;&amp; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  ok   %s %s firmware files in the initramfs\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$n<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                                <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;no <\/span><span style=\"color: #F8F8F2\">$fw<\/span><span style=\"color: #E6DB74\"> firmware in <\/span><span style=\"color: #F8F8F2\">$img<\/span><span style=\"color: #E6DB74\"> -- install linux-firmware and<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">         regenerate the initramfs BEFORE rebooting, or that GPU will not come up.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">done<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91; <\/span><span style=\"color: #F92672\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/lib\/modules\/<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">\/build&quot;<\/span><span style=\"color: #F8F8F2\"> &#93; \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    &amp;&amp; <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  ok   \/lib\/modules\/%s\/build present -- DKMS and out-of-tree modules can build\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">\\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/lib\/modules\/<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">\/build is missing; DKMS modules cannot build against this kernel&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Driver presence check.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># NOTE ON SPELLING: these are FILE names, and kernel module files keep their<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># hyphens -- virtio-gpu.ko, snd-hda-intel.ko, xen-blkfront.ko.  Nearly 40% of<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># the modules in a typical kernel have a hyphen.  It is the module&#39;s internal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># NAME that uses underscores, which is what lsmod, modinfo -F name, \/proc\/modules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># and \/sys\/module\/ all display.  Since this searches with find -name, the hyphen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># is correct; &quot;fixing&quot; virtio-gpu to virtio_gpu here finds nothing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># A driver absent from \/lib\/modules is not necessarily a failure -- it may be<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># built in (=y), which is a perfectly good outcome and produces no .ko at all.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># The old version of this loop printed nothing in that case, so a driver that<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># genuinely failed to build looked identical to one that succeeded as built-in.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88846F\"># Consult .config to tell those two apart.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> entry <\/span><span style=\"color: #F92672\">in<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;amdgpu:DRM_AMDGPU&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;nouveau:DRM_NOUVEAU&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;i915:DRM_I915&quot;<\/span><span style=\"color: #F8F8F2\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">             <\/span><span style=\"color: #A6E22E\">&quot;xe:DRM_XE&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;simpledrm:DRM_SIMPLEDRM&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;virtio-gpu:DRM_VIRTIO_GPU&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">do<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    m<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">entry<\/span><span style=\"color: #F92672\">%%:*<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><span style=\"color: #F8F8F2\">; sym<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;${<\/span><span style=\"color: #F8F8F2\">entry<\/span><span style=\"color: #F92672\">#*:<\/span><span style=\"color: #E6DB74\">}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">find<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;\/lib\/modules\/<\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-name<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">.ko*&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">head<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-1<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  ok   %-12s installed as a module (%s.ko)\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;^CONFIG_<\/span><span style=\"color: #F8F8F2\">$sym<\/span><span style=\"color: #E6DB74\">=y&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  ok   %-12s built into the kernel image (CONFIG_%s=y)\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$sym<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">-q<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;^CONFIG_<\/span><span style=\"color: #F8F8F2\">$sym<\/span><span style=\"color: #E6DB74\">=m&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">.config<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">2&gt;<\/span><span style=\"color: #E6DB74\">\/dev\/null<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #F92672\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">warn<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">: CONFIG_<\/span><span style=\"color: #F8F8F2\">$sym<\/span><span style=\"color: #E6DB74\">=m was requested but no <\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">.ko was installed.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E6DB74\">       That is a real failure -- check the modules_install step.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF\">printf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;  --   %-12s not enabled in this config\\n&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;<\/span><span style=\"color: #F8F8F2\">$m<\/span><span style=\"color: #E6DB74\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">fi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">done<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">say<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Done. Keep your current kernel in the boot menu until <\/span><span style=\"color: #F8F8F2\">$KREL<\/span><span style=\"color: #E6DB74\"> is proven.&quot;<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>This script works on enterprise linux, and it&#8217;s supposed to work on debian\/ubuntu too. It grabs the latest kernel available, you just have to run it twice to install the kernel; First here&#8217;s the instructions: If you happen to have an AMD Graphics Card, it will build AMDGPU for you as well! Here&#8217;s the download button: Here is the complete build script for you to look at but I wouldn&#8217;t copy and paste it, just use the &#8220;Download&#8221; button and extract it. If you copy and paste it, some of the characters will not be copied and it might not work. You can compare the number of lines and file size of both though, if your worried about viruses!<\/p>\n","protected":false},"author":1,"featured_media":6,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,39,38,35,36,37],"tags":[44,41,42,43,45],"class_list":["post-260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-building-the-linux-kernel","category-kernel","category-linux","category-linux-kernel","category-linux-kernel-7","category-linux-kernel-7-2","tag-building-the-linux-kernel","tag-linux","tag-linux-kernel","tag-linux-kernel-7-2","tag-linux-kernel-build-script"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Universal Linux Kernel Build Script &#187; The Satellite Corporation<\/title>\n<meta name=\"description\" content=\"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/satellite.foundation\/?p=260\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Universal Linux Kernel Build Script &#187; The Satellite Corporation\" \/>\n<meta property=\"og:description\" content=\"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/satellite.foundation\/?p=260\" \/>\n<meta property=\"og:site_name\" content=\"The Satellite Corporation\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-08T23:00:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-08T23:00:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#\\\/schema\\\/person\\\/bc720ad560e4878b6baad4ff52cba4a2\"},\"headline\":\"Universal Linux Kernel Build Script\",\"datePublished\":\"2026-09-08T23:00:20+00:00\",\"dateModified\":\"2026-09-08T23:00:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260\"},\"wordCount\":135,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"keywords\":[\"Building The Linux Kernel\",\"Linux\",\"Linux Kernel\",\"Linux Kernel 7.2\",\"Linux Kernel Build Script\"],\"articleSection\":[\"Building The Linux Kernel\",\"Kernel\",\"Linux\",\"Linux Kernel\",\"Linux Kernel 7\",\"Linux Kernel 7.2\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/satellite.foundation\\\/?p=260#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260\",\"url\":\"https:\\\/\\\/satellite.foundation\\\/?p=260\",\"name\":\"Universal Linux Kernel Build Script &#187; The Satellite Corporation\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"datePublished\":\"2026-09-08T23:00:20+00:00\",\"dateModified\":\"2026-09-08T23:00:25+00:00\",\"description\":\"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/satellite.foundation\\\/?p=260\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#primaryimage\",\"url\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"contentUrl\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"width\":1024,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/?p=260#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/satellite.foundation\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Universal Linux Kernel Build Script\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#website\",\"url\":\"https:\\\/\\\/satellite.foundation\\\/\",\"name\":\"The Satellite Corporation\",\"description\":\"Broadcasting Another World!\",\"publisher\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#organization\"},\"alternateName\":\"TheSatellite.org\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/satellite.foundation\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#organization\",\"name\":\"The Satellite Corporation\",\"alternateName\":\"TheSatellite.org\",\"url\":\"https:\\\/\\\/satellite.foundation\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"contentUrl\":\"https:\\\/\\\/satellite.foundation\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg\",\"width\":1024,\"height\":1024,\"caption\":\"The Satellite Corporation\"},\"image\":{\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/satellite.foundation\\\/#\\\/schema\\\/person\\\/bc720ad560e4878b6baad4ff52cba4a2\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x\",\"caption\":\"admin\"},\"sameAs\":[\"https:\\\/\\\/satellite.foundation\"],\"url\":\"https:\\\/\\\/satellite.foundation\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Universal Linux Kernel Build Script &#187; The Satellite Corporation","description":"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/satellite.foundation\/?p=260","og_locale":"en_US","og_type":"article","og_title":"Universal Linux Kernel Build Script &#187; The Satellite Corporation","og_description":"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;","og_url":"https:\/\/satellite.foundation\/?p=260","og_site_name":"The Satellite Corporation","article_published_time":"2026-09-08T23:00:20+00:00","article_modified_time":"2026-09-08T23:00:25+00:00","og_image":[{"width":1024,"height":1024,"url":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/satellite.foundation\/?p=260#article","isPartOf":{"@id":"https:\/\/satellite.foundation\/?p=260"},"author":{"name":"admin","@id":"https:\/\/satellite.foundation\/#\/schema\/person\/bc720ad560e4878b6baad4ff52cba4a2"},"headline":"Universal Linux Kernel Build Script","datePublished":"2026-09-08T23:00:20+00:00","dateModified":"2026-09-08T23:00:25+00:00","mainEntityOfPage":{"@id":"https:\/\/satellite.foundation\/?p=260"},"wordCount":135,"commentCount":0,"publisher":{"@id":"https:\/\/satellite.foundation\/#organization"},"image":{"@id":"https:\/\/satellite.foundation\/?p=260#primaryimage"},"thumbnailUrl":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","keywords":["Building The Linux Kernel","Linux","Linux Kernel","Linux Kernel 7.2","Linux Kernel Build Script"],"articleSection":["Building The Linux Kernel","Kernel","Linux","Linux Kernel","Linux Kernel 7","Linux Kernel 7.2"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/satellite.foundation\/?p=260#respond"]}]},{"@type":"WebPage","@id":"https:\/\/satellite.foundation\/?p=260","url":"https:\/\/satellite.foundation\/?p=260","name":"Universal Linux Kernel Build Script &#187; The Satellite Corporation","isPartOf":{"@id":"https:\/\/satellite.foundation\/#website"},"primaryImageOfPage":{"@id":"https:\/\/satellite.foundation\/?p=260#primaryimage"},"image":{"@id":"https:\/\/satellite.foundation\/?p=260#primaryimage"},"thumbnailUrl":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","datePublished":"2026-09-08T23:00:20+00:00","dateModified":"2026-09-08T23:00:25+00:00","description":"Universal Linux Kernel Build Script &#187; The Satellite Corporation &#187; Linux Kernel &#187;","breadcrumb":{"@id":"https:\/\/satellite.foundation\/?p=260#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/satellite.foundation\/?p=260"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/satellite.foundation\/?p=260#primaryimage","url":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","contentUrl":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","width":1024,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/satellite.foundation\/?p=260#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/satellite.foundation\/"},{"@type":"ListItem","position":2,"name":"Universal Linux Kernel Build Script"}]},{"@type":"WebSite","@id":"https:\/\/satellite.foundation\/#website","url":"https:\/\/satellite.foundation\/","name":"The Satellite Corporation","description":"Broadcasting Another World!","publisher":{"@id":"https:\/\/satellite.foundation\/#organization"},"alternateName":"TheSatellite.org","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/satellite.foundation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/satellite.foundation\/#organization","name":"The Satellite Corporation","alternateName":"TheSatellite.org","url":"https:\/\/satellite.foundation\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/satellite.foundation\/#\/schema\/logo\/image\/","url":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","contentUrl":"https:\/\/satellite.foundation\/wp-content\/uploads\/2026\/08\/overwatch_elite_soldier_half_life_2_by_pino44io_d5lw0u3-fullview.jpg","width":1024,"height":1024,"caption":"The Satellite Corporation"},"image":{"@id":"https:\/\/satellite.foundation\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/satellite.foundation\/#\/schema\/person\/bc720ad560e4878b6baad4ff52cba4a2","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x","url":"https:\/\/secure.gravatar.com\/avatar\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/82bdfd1e639500423635206856d7ac70ed6efb910d91334e9100ddccba2d744a?s=96&d=mm&r=x","caption":"admin"},"sameAs":["https:\/\/satellite.foundation"],"url":"https:\/\/satellite.foundation\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/posts\/260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/satellite.foundation\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260"}],"version-history":[{"count":1,"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions"}],"predecessor-version":[{"id":262,"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions\/262"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/satellite.foundation\/index.php?rest_route=\/wp\/v2\/media\/6"}],"wp:attachment":[{"href":"https:\/\/satellite.foundation\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satellite.foundation\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satellite.foundation\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}