Commit c8578539 authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Masahiro Yamada
Browse files

kbuild: add script and target to generate pacman package



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.

Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
Reviewed-by: default avatarNathan Chancellor <nathan@kernel.org>
Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 3554a452
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -92,6 +92,12 @@ modules.order
#
/tar-install/

#
# pacman files (make pacman-pkg)
#
/PKGBUILD
/pacman/

#
# We don't want to ignore the following even if they are dot-files
#
+7 −0
Original line number Diff line number Diff line
@@ -11998,6 +11998,13 @@ F: include/uapi/linux/nfsd/
F:	include/uapi/linux/sunrpc/
F:	net/sunrpc/
KERNEL PACMAN PACKAGING (in addition to generic KERNEL BUILD)
M:	Thomas Weißschuh <linux@weissschuh.net>
R:	Christian Heusel <christian@heusel.eu>
R:	Nathan Chancellor <nathan@kernel.org>
S:	Maintained
F:	scripts/package/PKGBUILD
KERNEL REGRESSIONS
M:	Thorsten Leemhuis <linux@leemhuis.info>
L:	regressions@lists.linux.dev
+1 −1
Original line number Diff line number Diff line
@@ -1489,7 +1489,7 @@ CLEAN_FILES += vmlinux.symvers modules-only.symvers \
# Directories & files removed with 'make mrproper'
MRPROPER_FILES += include/config include/generated          \
		  arch/$(SRCARCH)/include/generated .objdiff \
		  debian snap tar-install \
		  debian snap tar-install PKGBUILD pacman \
		  .config .config.old .version \
		  Module.symvers \
		  certs/signing_key.pem \
+14 −0
Original line number Diff line number Diff line
@@ -141,6 +141,19 @@ snap-pkg:
	cd $(objtree)/snap && \
	snapcraft --target-arch=$(UTS_MACHINE)

# pacman-pkg
# ---------------------------------------------------------------------------

PHONY += pacman-pkg
pacman-pkg:
	@ln -srf $(srctree)/scripts/package/PKGBUILD $(objtree)/PKGBUILD
	+objtree="$(realpath $(objtree))" \
		BUILDDIR="$(realpath $(objtree))/pacman" \
		CARCH="$(UTS_MACHINE)" \
		KBUILD_MAKEFLAGS="$(MAKEFLAGS)" \
		KBUILD_REVISION="$(shell $(srctree)/scripts/build-version)" \
		makepkg $(MAKEPKGOPTS)

# dir-pkg tar*-pkg - tarball targets
# ---------------------------------------------------------------------------

@@ -221,6 +234,7 @@ help:
	@echo '  bindeb-pkg          - Build only the binary kernel deb package'
	@echo '  snap-pkg            - Build only the binary kernel snap package'
	@echo '                        (will connect to external hosts)'
	@echo '  pacman-pkg          - Build only the binary kernel pacman package'
	@echo '  dir-pkg             - Build the kernel as a plain directory structure'
	@echo '  tar-pkg             - Build the kernel as an uncompressed tarball'
	@echo '  targz-pkg           - Build the kernel as a gzip compressed tarball'
+108 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
# Maintainer: Thomas Weißschuh <linux@weissschuh.net>
# Contributor: Jan Alexander Steffens (heftig) <heftig@archlinux.org>

pkgbase=${PACMAN_PKGBASE:-linux-upstream}
pkgname=("${pkgbase}" "${pkgbase}-api-headers")
if grep -q CONFIG_MODULES=y include/config/auto.conf; then
	pkgname+=("${pkgbase}-headers")
fi
pkgver="${KERNELRELEASE//-/_}"
# The PKGBUILD is evaluated multiple times.
# Running scripts/build-version from here would introduce inconsistencies.
pkgrel="${KBUILD_REVISION}"
pkgdesc='Upstream Linux'
url='https://www.kernel.org/'
# Enable flexible cross-compilation
arch=(${CARCH})
license=(GPL-2.0-only)
makedepends=(
	bc
	bison
	cpio
	flex
	gettext
	kmod
	libelf
	openssl
	pahole
	perl
	python
	rsync
	tar
)
options=(!debug !strip !buildflags !makeflags)

build() {
	# MAKEFLAGS from makepkg.conf override the ones inherited from kbuild.
	# Bypass this override with a custom variable.
	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"
	cd "${objtree}"

	${MAKE} KERNELRELEASE="${KERNELRELEASE}" KBUILD_BUILD_VERSION="${pkgrel}"
}

_package() {
	pkgdesc="The ${pkgdesc} kernel and modules"

	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"
	cd "${objtree}"
	local modulesdir="${pkgdir}/usr/${MODLIB}"

	echo "Installing boot image..."
	# systemd expects to find the kernel here to allow hibernation
	# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
	install -Dm644 "$(${MAKE} -s image_name)" "${modulesdir}/vmlinuz"

	# Used by mkinitcpio to name the kernel
	echo "${pkgbase}" > "${modulesdir}/pkgbase"

	echo "Installing modules..."
	${MAKE} INSTALL_MOD_PATH="${pkgdir}/usr" INSTALL_MOD_STRIP=1 \
		DEPMOD=true modules_install

	if [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
		echo "Installing dtbs..."
		${MAKE} INSTALL_DTBS_PATH="${modulesdir}/dtb" dtbs_install
	fi

	# remove build link, will be part of -headers package
	rm -f "${modulesdir}/build"
}

_package-headers() {
	pkgdesc="Headers and scripts for building modules for the ${pkgdesc} kernel"

	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"
	cd "${objtree}"
	local builddir="${pkgdir}/usr/${MODLIB}/build"

	echo "Installing build files..."
	"${srctree}/scripts/package/install-extmod-build" "${builddir}"

	echo "Installing System.map and config..."
	cp System.map "${builddir}/System.map"
	cp .config "${builddir}/.config"

	echo "Adding symlink..."
	mkdir -p "${pkgdir}/usr/src"
	ln -sr "${builddir}" "${pkgdir}/usr/src/${pkgbase}"
}

_package-api-headers() {
	pkgdesc="Kernel headers sanitized for use in userspace"
	provides=(linux-api-headers)
	conflicts=(linux-api-headers)

	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"
	cd "${objtree}"

	${MAKE} headers_install INSTALL_HDR_PATH="${pkgdir}/usr"
}

for _p in "${pkgname[@]}"; do
	eval "package_$_p() {
		$(declare -f "_package${_p#$pkgbase}")
		_package${_p#$pkgbase}
	}"
done