linux-yocto/scripts/package/PKGBUILD
Thomas Weißschuh c8578539de 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 <linux@weissschuh.net>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2024-07-22 01:24:22 +09:00

2.8 KiB

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