Skip to content

Commit c857853

Browse files
t-8chmasahir0y
authored andcommitted
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: Thomas Weißschuh <[email protected]> Reviewed-by: Nathan Chancellor <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
1 parent 3554a45 commit c857853

File tree

5 files changed

+136
-1
lines changed

5 files changed

+136
-1
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ modules.order
9292
#
9393
/tar-install/
9494

95+
#
96+
# pacman files (make pacman-pkg)
97+
#
98+
/PKGBUILD
99+
/pacman/
100+
95101
#
96102
# We don't want to ignore the following even if they are dot-files
97103
#

MAINTAINERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11998,6 +11998,13 @@ F: include/uapi/linux/nfsd/
1199811998
F: include/uapi/linux/sunrpc/
1199911999
F: net/sunrpc/
1200012000

12001+
KERNEL PACMAN PACKAGING (in addition to generic KERNEL BUILD)
12002+
M: Thomas Weißschuh <[email protected]>
12003+
R: Christian Heusel <[email protected]>
12004+
R: Nathan Chancellor <[email protected]>
12005+
S: Maintained
12006+
F: scripts/package/PKGBUILD
12007+
1200112008
KERNEL REGRESSIONS
1200212009
M: Thorsten Leemhuis <[email protected]>
1200312010

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ CLEAN_FILES += vmlinux.symvers modules-only.symvers \
14891489
# Directories & files removed with 'make mrproper'
14901490
MRPROPER_FILES += include/config include/generated \
14911491
arch/$(SRCARCH)/include/generated .objdiff \
1492-
debian snap tar-install \
1492+
debian snap tar-install PKGBUILD pacman \
14931493
.config .config.old .version \
14941494
Module.symvers \
14951495
certs/signing_key.pem \

scripts/Makefile.package

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,19 @@ snap-pkg:
141141
cd $(objtree)/snap && \
142142
snapcraft --target-arch=$(UTS_MACHINE)
143143

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+
144157
# dir-pkg tar*-pkg - tarball targets
145158
# ---------------------------------------------------------------------------
146159

@@ -221,6 +234,7 @@ help:
221234
@echo ' bindeb-pkg - Build only the binary kernel deb package'
222235
@echo ' snap-pkg - Build only the binary kernel snap package'
223236
@echo ' (will connect to external hosts)'
237+
@echo ' pacman-pkg - Build only the binary kernel pacman package'
224238
@echo ' dir-pkg - Build the kernel as a plain directory structure'
225239
@echo ' tar-pkg - Build the kernel as an uncompressed tarball'
226240
@echo ' targz-pkg - Build the kernel as a gzip compressed tarball'

scripts/package/PKGBUILD

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# SPDX-License-Identifier: GPL-2.0-only
2+
# Maintainer: Thomas Weißschuh <[email protected]>
3+
# Contributor: Jan Alexander Steffens (heftig) <[email protected]>
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

0 commit comments

Comments
 (0)