pacman is the package manager used by Arch Linux and its derivates. Creating native packages from the kernel tree has multiple advantages: * The package triggers the correct hooks for initramfs generation and bootloader configuration * Uninstallation is complete and also invokes the relevant hooks * New UAPI headers can be installed without any manual bookkeeping The PKGBUILD file is a modified version of the one used for the downstream Arch Linux "linux" package. Extra steps that should not be necessary for a development kernel have been removed and an UAPI header package has been added.
Unified · Split
| @@ -92,6 +92,12 @@ modules.order · 91 unmodified lines | ||
| 92 | 92 | # |
| 93 | 93 | /tar-install/ |
| 94 | 94 | |
| 95 | +# | |
| 96 | +# pacman files (make pacman-pkg) | |
| 97 | +# | |
| 98 | +/PKGBUILD | |
| 99 | +/pacman/ | |
| 100 | + | |
| 95 | 101 | # |
| 96 | 102 | # We don't want to ignore the following even if they are dot-files |
| 97 | 103 | # |
| @@ -11998,6 +11998,13 @@ F: include/uapi/linux/nfsd/ · 11997 unmodified lines | ||
| 11998 | 11998 | F: include/uapi/linux/sunrpc/ |
| 11999 | 11999 | F: net/sunrpc/ |
| 12000 | 12000 | |
| 12001 | +KERNEL PACMAN PACKAGING (in addition to generic KERNEL BUILD) | |
| 12002 | +M: Thomas Weißschuh <linux@weissschuh.net> | |
| 12003 | +R: Christian Heusel <christian@heusel.eu> | |
| 12004 | +R: Nathan Chancellor <nathan@kernel.org> | |
| 12005 | +S: Maintained | |
| 12006 | +F: scripts/package/PKGBUILD | |
| 12007 | + | |
| 12001 | 12008 | KERNEL REGRESSIONS |
| 12002 | 12009 | M: Thorsten Leemhuis <linux@leemhuis.info> |
| 12003 | 12010 | L: regressions@lists.linux.dev |
| @@ -1489,7 +1489,7 @@ CLEAN_FILES += vmlinux.symvers modules-only.symvers \ · 1488 unmodified lines | ||
| 1489 | 1489 | # Directories & files removed with 'make mrproper' |
| 1490 | 1490 | MRPROPER_FILES += include/config include/generated \ |
| 1491 | 1491 | arch/$(SRCARCH)/include/generated .objdiff \ |
| 1492 | − debian snap tar-install \ | |
| 1492 | + debian snap tar-install PKGBUILD pacman \ | |
| 1493 | 1493 | .config .config.old .version \ |
| 1494 | 1494 | Module.symvers \ |
| 1495 | 1495 | certs/signing_key.pem \ |
| @@ -141,6 +141,19 @@ snap-pkg: · 140 unmodified lines | ||
| 141 | 141 | cd $(objtree)/snap && \ |
| 142 | 142 | snapcraft --target-arch=$(UTS_MACHINE) |
| 143 | 143 | |
| 144 | +# pacman-pkg | |
| 145 | +# --------------------------------------------------------------------------- | |
| 146 | + | |
| 147 | +PHONY += pacman-pkg | |
| 148 | +pacman-pkg: | |
| 149 | + @ln -srf $(srctree)/scripts/package/PKGBUILD $(objtree)/PKGBUILD | |
| 150 | + +objtree="$(realpath $(objtree))" \ | |
| 151 | + BUILDDIR="$(realpath $(objtree))/pacman" \ | |
| 152 | + CARCH="$(UTS_MACHINE)" \ | |
| 153 | + KBUILD_MAKEFLAGS="$(MAKEFLAGS)" \ | |
| 154 | + KBUILD_REVISION="$(shell $(srctree)/scripts/build-version)" \ | |
| 155 | + makepkg $(MAKEPKGOPTS) | |
| 156 | + | |
| 144 | 157 | # dir-pkg tar*-pkg - tarball targets |
| 145 | 158 | # --------------------------------------------------------------------------- |
| 146 | 159 | |
| @@ -221,6 +234,7 @@ help: · 74 unmodified lines | ||
| 221 | 234 | @echo ' bindeb-pkg - Build only the binary kernel deb package' |
| 222 | 235 | @echo ' snap-pkg - Build only the binary kernel snap package' |
| 223 | 236 | @echo ' (will connect to external hosts)' |
| 237 | + @echo ' pacman-pkg - Build only the binary kernel pacman package' | |
| 224 | 238 | @echo ' dir-pkg - Build the kernel as a plain directory structure' |
| 225 | 239 | @echo ' tar-pkg - Build the kernel as an uncompressed tarball' |
| 226 | 240 | @echo ' targz-pkg - Build the kernel as a gzip compressed tarball' |
| @@ -0,0 +1,108 @@ | ||
| 1 | +# SPDX-License-Identifier: GPL-2.0-only | |
| 2 | +# Maintainer: Thomas Weißschuh <linux@weissschuh.net> | |
| 3 | +# Contributor: Jan Alexander Steffens (heftig) <heftig@archlinux.org> | |
| 4 | + | |
| 5 | +pkgbase=${PACMAN_PKGBASE:-linux-upstream} | |
| 6 | +pkgname=("${pkgbase}" "${pkgbase}-api-headers") | |
| 7 | +if grep -q CONFIG_MODULES=y include/config/auto.conf; then | |
| 8 | + pkgname+=("${pkgbase}-headers") | |
| 9 | +fi | |
| 10 | +pkgver="${KERNELRELEASE//-/_}" | |
| 11 | +# The PKGBUILD is evaluated multiple times. | |
| 12 | +# Running scripts/build-version from here would introduce inconsistencies. | |
| 13 | +pkgrel="${KBUILD_REVISION}" | |
| 14 | +pkgdesc='Upstream Linux' | |
| 15 | +url='https://www.kernel.org/' | |
| 16 | +# Enable flexible cross-compilation | |
| 17 | +arch=(${CARCH}) | |
| 18 | +license=(GPL-2.0-only) | |
| 19 | +makedepends=( | |
| 20 | + bc | |
| 21 | + bison | |
| 22 | + cpio | |
| 23 | + flex | |
| 24 | + gettext | |
| 25 | + kmod | |
| 26 | + libelf | |
| 27 | + openssl | |
| 28 | + pahole | |
| 29 | + perl | |
| 30 | + python | |
| 31 | + rsync | |
| 32 | + tar | |
| 33 | +) | |
| 34 | +options=(!debug !strip !buildflags !makeflags) | |
| 35 | + | |
| 36 | +build() { | |
| 37 | + # MAKEFLAGS from makepkg.conf override the ones inherited from kbuild. | |
| 38 | + # Bypass this override with a custom variable. | |
| 39 | + export MAKEFLAGS="${KBUILD_MAKEFLAGS}" | |
| 40 | + cd "${objtree}" | |
| 41 | + | |
| 42 | + ${MAKE} KERNELRELEASE="${KERNELRELEASE}" KBUILD_BUILD_VERSION="${pkgrel}" | |
| 43 | +} | |
| 44 | + | |
| 45 | +_package() { | |
| 46 | + pkgdesc="The ${pkgdesc} kernel and modules" | |
| 47 | + | |
| 48 | + export MAKEFLAGS="${KBUILD_MAKEFLAGS}" | |
| 49 | + cd "${objtree}" | |
| 50 | + local modulesdir="${pkgdir}/usr/${MODLIB}" | |
| 51 | + | |
| 52 | + echo "Installing boot image..." | |
| 53 | + # systemd expects to find the kernel here to allow hibernation | |
| 54 | + # https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344 | |
| 55 | + install -Dm644 "$(${MAKE} -s image_name)" "${modulesdir}/vmlinuz" | |
| 56 | + | |
| 57 | + # Used by mkinitcpio to name the kernel | |
| 58 | + echo "${pkgbase}" > "${modulesdir}/pkgbase" | |
| 59 | + | |
| 60 | + echo "Installing modules..." | |
| 61 | + ${MAKE} INSTALL_MOD_PATH="${pkgdir}/usr" INSTALL_MOD_STRIP=1 \ | |
| 62 | + DEPMOD=true modules_install | |
| 63 | + | |
| 64 | + if [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then | |
| 65 | + echo "Installing dtbs..." | |
| 66 | + ${MAKE} INSTALL_DTBS_PATH="${modulesdir}/dtb" dtbs_install | |
| 67 | + fi | |
| 68 | + | |
| 69 | + # remove build link, will be part of -headers package | |
| 70 | + rm -f "${modulesdir}/build" | |
| 71 | +} | |
| 72 | + | |
| 73 | +_package-headers() { | |
| 74 | + pkgdesc="Headers and scripts for building modules for the ${pkgdesc} kernel" | |
| 75 | + | |
| 76 | + export MAKEFLAGS="${KBUILD_MAKEFLAGS}" | |
| 77 | + cd "${objtree}" | |
| 78 | + local builddir="${pkgdir}/usr/${MODLIB}/build" | |
| 79 | + | |
| 80 | + echo "Installing build files..." | |
| 81 | + "${srctree}/scripts/package/install-extmod-build" "${builddir}" | |
| 82 | + | |
| 83 | + echo "Installing System.map and config..." | |
| 84 | + cp System.map "${builddir}/System.map" | |
| 85 | + cp .config "${builddir}/.config" | |
| 86 | + | |
| 87 | + echo "Adding symlink..." | |
| 88 | + mkdir -p "${pkgdir}/usr/src" | |
| 89 | + ln -sr "${builddir}" "${pkgdir}/usr/src/${pkgbase}" | |
| 90 | +} | |
| 91 | + | |
| 92 | +_package-api-headers() { | |
| 93 | + pkgdesc="Kernel headers sanitized for use in userspace" | |
| 94 | + provides=(linux-api-headers) | |
| 95 | + conflicts=(linux-api-headers) | |
| 96 | + | |
| 97 | + export MAKEFLAGS="${KBUILD_MAKEFLAGS}" | |
| 98 | + cd "${objtree}" | |
| 99 | + | |
| 100 | + ${MAKE} headers_install INSTALL_HDR_PATH="${pkgdir}/usr" | |
| 101 | +} | |
| 102 | + | |
| 103 | +for _p in "${pkgname[@]}"; do | |
| 104 | + eval "package_$_p() { | |
| 105 | + $(declare -f "_package${_p#$pkgbase}") | |
| 106 | + _package${_p#$pkgbase} | |
| 107 | + }" | |
| 108 | +done | |