mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 05:45:20 +00:00
81a83f7539
By passing an additional directory to run-parts, allow Debian and its derivatives to ship maintainer scripts in /usr while at the same time allowing the local admin to override or disable them by placing hooks of the same name in /etc. This adds support for the mechanism described in the UAPI Configuration Files Specification for kernel hooks. The same idea is also used by udev, systemd or modprobe for their config files. https://uapi-group.org/specifications/specs/configuration_files_specification/ This functionality relies on run-parts 5.21 or later. It is the responsibility of packages installing hooks into /usr/share/kernel to also declare a Depends: debianutils (>= 5.21). KDEB_HOOKDIR can be used to change the list of directories that is searched. By default, /etc/kernel and /usr/share/kernel are hook directories. Since the list of directories in KDEB_HOOKDIR is separated by spaces, the paths must not contain the space character themselves. Signed-off-by: Johannes Schauer Marin Rodrigues <josch@mister-muffin.de> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
165 lines
5.5 KiB
Bash
Executable File
165 lines
5.5 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# builddeb 1.3
|
|
# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
|
|
#
|
|
# Simple script to generate a deb package for a Linux kernel. All the
|
|
# complexity of what to do with a kernel after it is installed or removed
|
|
# is left to other scripts and packages. Scripts can be placed into the
|
|
# preinst, postinst, prerm and postrm directories in /etc/kernel or
|
|
# /usr/share/kernel. A different list of search directories can be given
|
|
# via KDEB_HOOKDIR. Scripts in directories earlier in the list will
|
|
# override scripts of the same name in later directories. The script will
|
|
# be called on package installation and removal.
|
|
|
|
set -eu
|
|
|
|
is_enabled() {
|
|
grep -q "^$1=y" include/config/auto.conf
|
|
}
|
|
|
|
if_enabled_echo() {
|
|
if is_enabled "$1"; then
|
|
echo -n "$2"
|
|
elif [ $# -ge 3 ]; then
|
|
echo -n "$3"
|
|
fi
|
|
}
|
|
|
|
install_linux_image () {
|
|
pname=$1
|
|
pdir=debian/$1
|
|
|
|
# Only some architectures with OF support have this target
|
|
if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
|
|
${MAKE} -f ${srctree}/Makefile INSTALL_DTBS_PATH="${pdir}/usr/lib/linux-image-${KERNELRELEASE}" dtbs_install
|
|
fi
|
|
|
|
${MAKE} -f ${srctree}/Makefile INSTALL_MOD_PATH="${pdir}" INSTALL_MOD_STRIP=1 modules_install
|
|
rm -f "${pdir}/lib/modules/${KERNELRELEASE}/build"
|
|
|
|
# Install the kernel
|
|
if [ "${ARCH}" = um ] ; then
|
|
mkdir -p "${pdir}/usr/lib/uml/modules"
|
|
mv "${pdir}/lib/modules/${KERNELRELEASE}" "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}"
|
|
mkdir -p "${pdir}/usr/bin" "${pdir}/usr/share/doc/${pname}"
|
|
cp System.map "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}/System.map"
|
|
cp ${KCONFIG_CONFIG} "${pdir}/usr/share/doc/${pname}/config"
|
|
gzip "${pdir}/usr/share/doc/${pname}/config"
|
|
else
|
|
mkdir -p "${pdir}/boot"
|
|
cp System.map "${pdir}/boot/System.map-${KERNELRELEASE}"
|
|
cp ${KCONFIG_CONFIG} "${pdir}/boot/config-${KERNELRELEASE}"
|
|
fi
|
|
|
|
# Not all arches have the same installed path in debian
|
|
# XXX: have each arch Makefile export a variable of the canonical image install
|
|
# path instead
|
|
case "${SRCARCH}" in
|
|
um)
|
|
installed_image_path="usr/bin/linux-${KERNELRELEASE}";;
|
|
parisc|mips|powerpc)
|
|
installed_image_path="boot/vmlinux-${KERNELRELEASE}";;
|
|
*)
|
|
installed_image_path="boot/vmlinuz-${KERNELRELEASE}";;
|
|
esac
|
|
cp "$(${MAKE} -s -f ${srctree}/Makefile image_name)" "${pdir}/${installed_image_path}"
|
|
|
|
# Install the maintainer scripts
|
|
# Note: hook scripts under /etc/kernel are also executed by official Debian
|
|
# kernel packages, as well as kernel packages built using make-kpkg.
|
|
# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
|
|
# so do we; recent versions of dracut and initramfs-tools will obey this.
|
|
debhookdir=${KDEB_HOOKDIR:-/etc/kernel /usr/share/kernel}
|
|
for script in postinst postrm preinst prerm; do
|
|
mkdir -p "${pdir}/DEBIAN"
|
|
cat <<-EOF > "${pdir}/DEBIAN/${script}"
|
|
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
# Pass maintainer script parameters to hook scripts
|
|
export DEB_MAINT_PARAMS="\$*"
|
|
|
|
# Tell initramfs builder whether it's wanted
|
|
export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
|
|
|
|
# run-parts will error out if one of its directory arguments does not
|
|
# exist, so filter the list of hook directories accordingly.
|
|
hookdirs=
|
|
for dir in ${debhookdir}; do
|
|
test -d "\$dir/${script}.d" || continue
|
|
hookdirs="\$hookdirs \$dir/${script}.d"
|
|
done
|
|
hookdirs="\${hookdirs# }"
|
|
test -n "\$hookdirs" && run-parts --arg="${KERNELRELEASE}" --arg="/${installed_image_path}" \$hookdirs
|
|
exit 0
|
|
EOF
|
|
chmod 755 "${pdir}/DEBIAN/${script}"
|
|
done
|
|
}
|
|
|
|
install_linux_image_dbg () {
|
|
pdir=debian/$1
|
|
|
|
# Parse modules.order directly because 'make modules_install' may sign,
|
|
# compress modules, and then run unneeded depmod.
|
|
if is_enabled CONFIG_MODULES; then
|
|
while read -r mod; do
|
|
mod="${mod%.o}.ko"
|
|
dbg="${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/kernel/${mod}"
|
|
buildid=$("${READELF}" -n "${mod}" | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p')
|
|
link="${pdir}/usr/lib/debug/.build-id/${buildid}.debug"
|
|
|
|
mkdir -p "${dbg%/*}" "${link%/*}"
|
|
"${OBJCOPY}" --only-keep-debug "${mod}" "${dbg}"
|
|
ln -sf --relative "${dbg}" "${link}"
|
|
done < modules.order
|
|
fi
|
|
|
|
# Build debug package
|
|
# Different tools want the image in different locations
|
|
# perf
|
|
mkdir -p ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
|
|
cp vmlinux ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
|
|
# systemtap
|
|
mkdir -p ${pdir}/usr/lib/debug/boot/
|
|
ln -s ../lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/boot/vmlinux-${KERNELRELEASE}
|
|
# kdump-tools
|
|
ln -s lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/vmlinux-${KERNELRELEASE}
|
|
}
|
|
|
|
install_kernel_headers () {
|
|
pdir=debian/$1
|
|
version=${1#linux-headers-}
|
|
|
|
CC="${DEB_HOST_GNU_TYPE}-gcc" "${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}"
|
|
|
|
mkdir -p $pdir/lib/modules/$version/
|
|
ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
|
|
}
|
|
|
|
install_libc_headers () {
|
|
pdir=debian/$1
|
|
|
|
$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
|
|
|
|
# move asm headers to /usr/include/<libc-machine>/asm to match the structure
|
|
# used by Debian-based distros (to support multi-arch)
|
|
mkdir "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
|
|
mv "$pdir/usr/include/asm" "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
|
|
}
|
|
|
|
package=$1
|
|
|
|
case "${package}" in
|
|
*-dbg)
|
|
install_linux_image_dbg "${package}";;
|
|
linux-image-*|user-mode-linux-*)
|
|
install_linux_image "${package}";;
|
|
linux-libc-dev)
|
|
install_libc_headers "${package}";;
|
|
linux-headers-*)
|
|
install_kernel_headers "${package}";;
|
|
esac
|