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
5pkgbase=${PACMAN_PKGBASE:-linux-upstream}
6pkgname=("${pkgbase}")
7
8_extrapackages=${PACMAN_EXTRAPACKAGES-headers api-headers debug}
9for pkg in $_extrapackages; do
10	pkgname+=("${pkgbase}-${pkg}")
11done
12
13pkgver="${KERNELRELEASE//-/_}"
14# The PKGBUILD is evaluated multiple times.
15# Running scripts/build-version from here would introduce inconsistencies.
16pkgrel="${KBUILD_REVISION}"
17pkgdesc='Upstream Linux'
18url='https://www.kernel.org/'
19# Enable flexible cross-compilation
20arch=(${CARCH})
21license=(GPL-2.0-only)
22makedepends=(
23	bc
24	bison
25	cpio
26	flex
27	gettext
28	kmod
29	libelf
30	openssl
31	pahole
32	perl
33	python
34	rsync
35	tar
36)
37options=(!debug !strip !buildflags !makeflags)
38
39_prologue() {
40	# MAKEFLAGS from makepkg.conf override the ones inherited from kbuild.
41	# Bypass this override with a custom variable.
42	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"
43
44	# Kbuild works in the output directory, where this PKGBUILD is located.
45	cd "$(dirname "${BASH_SOURCE[0]}")"
46}
47
48build() {
49	_prologue
50
51	${MAKE} KERNELRELEASE="${KERNELRELEASE}" KBUILD_BUILD_VERSION="${pkgrel}"
52}
53
54_package() {
55	pkgdesc="The ${pkgdesc} kernel and modules"
56
57	local modulesdir="${pkgdir}/usr/${MODLIB}"
58
59	_prologue
60
61	echo "Installing boot image..."
62	# systemd expects to find the kernel here to allow hibernation
63	# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
64	install -Dm644 "$(${MAKE} -s image_name)" "${modulesdir}/vmlinuz"
65
66	# Used by mkinitcpio to name the kernel
67	echo "${pkgbase}" > "${modulesdir}/pkgbase"
68
69	echo "Installing modules..."
70	${MAKE} INSTALL_MOD_PATH="${pkgdir}/usr" INSTALL_MOD_STRIP=1 \
71		DEPMOD=true modules_install
72
73	if [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
74		echo "Installing dtbs..."
75		${MAKE} INSTALL_DTBS_PATH="${modulesdir}/dtb" dtbs_install
76	fi
77
78	# remove build link, will be part of -headers package
79	rm -f "${modulesdir}/build"
80}
81
82_package-headers() {
83	pkgdesc="Headers and scripts for building modules for the ${pkgdesc} kernel"
84
85	local builddir="${pkgdir}/usr/${MODLIB}/build"
86
87	_prologue
88
89	if grep -q CONFIG_MODULES=y include/config/auto.conf; then
90		echo "Installing build files..."
91		"${srctree}/scripts/package/install-extmod-build" "${builddir}"
92	fi
93
94	echo "Installing System.map and config..."
95	mkdir -p "${builddir}"
96	cp System.map "${builddir}/System.map"
97	cp .config "${builddir}/.config"
98
99	echo "Adding symlink..."
100	mkdir -p "${pkgdir}/usr/src"
101	ln -sr "${builddir}" "${pkgdir}/usr/src/${pkgbase}"
102}
103
104_package-api-headers() {
105	pkgdesc="Kernel headers sanitized for use in userspace"
106	provides=(linux-api-headers)
107	conflicts=(linux-api-headers)
108
109	_prologue
110
111	${MAKE} headers_install INSTALL_HDR_PATH="${pkgdir}/usr"
112}
113
114_package-debug(){
115	pkgdesc="Non-stripped vmlinux file for the ${pkgdesc} kernel"
116
117	local debugdir="${pkgdir}/usr/src/debug/${pkgbase}"
118	local builddir="${pkgdir}/usr/${MODLIB}/build"
119
120	_prologue
121
122	install -Dt "${debugdir}" -m644 vmlinux
123	mkdir -p "${builddir}"
124	ln -sr "${debugdir}/vmlinux" "${builddir}/vmlinux"
125}
126
127for _p in "${pkgname[@]}"; do
128	eval "package_$_p() {
129		$(declare -f "_package${_p#$pkgbase}")
130		_package${_p#$pkgbase}
131	}"
132done
133