180016Sobrien#!/bin/sh 280016Sobrien# 380016Sobrien# builddeb 1.3 480016Sobrien# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 580016Sobrien# 680016Sobrien# Simple script to generate a deb package for a Linux kernel. All the 7218822Sdim# complexity of what to do with a kernel after it is installed or removed 8218822Sdim# is left to other scripts and packages: they can install scripts in the 9218822Sdim# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 10218822Sdim# specified in KDEB_HOOKDIR) that will be called on package install and 11218822Sdim# removal. 12218822Sdim 1380016Sobrienset -e 1480016Sobrien 1580016Sobrienis_enabled() { 16130561Sobrien grep -q "^$1=y" include/config/auto.conf 1780016Sobrien} 1880016Sobrien 1980016Sobrienif_enabled_echo() { 2080016Sobrien if is_enabled "$1"; then 2180016Sobrien echo -n "$2" 2280016Sobrien elif [ $# -ge 3 ]; then 2380016Sobrien echo -n "$3" 2480016Sobrien fi 2580016Sobrien} 2680016Sobrien 2780016Sobrieninstall_linux_image () { 28218822Sdim pname=$1 2989857Sobrien pdir=debian/$1 3080016Sobrien 3180016Sobrien # Only some architectures with OF support have this target 3280016Sobrien if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then 33130561Sobrien ${MAKE} -f ${srctree}/Makefile INSTALL_DTBS_PATH="${pdir}/usr/lib/linux-image-${KERNELRELEASE}" dtbs_install 34130561Sobrien fi 3589857Sobrien 3689857Sobrien ${MAKE} -f ${srctree}/Makefile INSTALL_MOD_PATH="${pdir}" INSTALL_MOD_STRIP=1 modules_install 3789857Sobrien rm -f "${pdir}/lib/modules/${KERNELRELEASE}/build" 3880016Sobrien 39218822Sdim # Install the kernel 40218822Sdim if [ "${ARCH}" = um ] ; then 4180016Sobrien mkdir -p "${pdir}/usr/lib/uml/modules" 42218822Sdim mv "${pdir}/lib/modules/${KERNELRELEASE}" "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}" 43218822Sdim mkdir -p "${pdir}/usr/bin" "${pdir}/usr/share/doc/${pname}" 4480016Sobrien cp System.map "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}/System.map" 45218822Sdim cp ${KCONFIG_CONFIG} "${pdir}/usr/share/doc/${pname}/config" 4680016Sobrien gzip "${pdir}/usr/share/doc/${pname}/config" 4780016Sobrien else 4880016Sobrien mkdir -p "${pdir}/boot" 4980016Sobrien cp System.map "${pdir}/boot/System.map-${KERNELRELEASE}" 50218822Sdim cp ${KCONFIG_CONFIG} "${pdir}/boot/config-${KERNELRELEASE}" 5180016Sobrien fi 5280016Sobrien 5380016Sobrien # Not all arches have the same installed path in debian 54218822Sdim # XXX: have each arch Makefile export a variable of the canonical image install 55218822Sdim # path instead 56218822Sdim case "${SRCARCH}" in 57218822Sdim um) 58218822Sdim installed_image_path="usr/bin/linux-${KERNELRELEASE}";; 5980016Sobrien parisc|mips|powerpc) 60218822Sdim installed_image_path="boot/vmlinux-${KERNELRELEASE}";; 61218822Sdim *) 6280016Sobrien installed_image_path="boot/vmlinuz-${KERNELRELEASE}";; 6380016Sobrien esac 6480016Sobrien cp "$(${MAKE} -s -f ${srctree}/Makefile image_name)" "${pdir}/${installed_image_path}" 6580016Sobrien 6689857Sobrien # Install the maintainer scripts 6780016Sobrien # Note: hook scripts under /etc/kernel are also executed by official Debian 6880016Sobrien # kernel packages, as well as kernel packages built using make-kpkg. 6980016Sobrien # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 7080016Sobrien # so do we; recent versions of dracut and initramfs-tools will obey this. 7180016Sobrien debhookdir=${KDEB_HOOKDIR:-/etc/kernel} 7280016Sobrien for script in postinst postrm preinst prerm; do 7389857Sobrien mkdir -p "${pdir}${debhookdir}/${script}.d" 7489857Sobrien 7589857Sobrien mkdir -p "${pdir}/DEBIAN" 7689857Sobrien cat <<-EOF > "${pdir}/DEBIAN/${script}" 7780016Sobrien 7880016Sobrien #!/bin/sh 7980016Sobrien 8080016Sobrien set -e 81218822Sdim 8280016Sobrien # Pass maintainer script parameters to hook scripts 8380016Sobrien export DEB_MAINT_PARAMS="\$*" 8480016Sobrien 8580016Sobrien # Tell initramfs builder whether it's wanted 8680016Sobrien export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) 8780016Sobrien 8880016Sobrien test -d ${debhookdir}/${script}.d && run-parts --arg="${KERNELRELEASE}" --arg="/${installed_image_path}" ${debhookdir}/${script}.d 8980016Sobrien exit 0 9080016Sobrien EOF 9180016Sobrien chmod 755 "${pdir}/DEBIAN/${script}" 9280016Sobrien done 9380016Sobrien} 9480016Sobrien 9580016Sobrieninstall_linux_image_dbg () { 9680016Sobrien pdir=debian/$1 9780016Sobrien 9880016Sobrien # Parse modules.order directly because 'make modules_install' may sign, 9980016Sobrien # compress modules, and then run unneeded depmod. 10080016Sobrien while read -r mod; do 101218822Sdim mod="${mod%.o}.ko" 102218822Sdim dbg="${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/kernel/${mod}" 103218822Sdim buildid=$("${READELF}" -n "${mod}" | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p') 104218822Sdim link="${pdir}/usr/lib/debug/.build-id/${buildid}.debug" 10580016Sobrien 106218822Sdim mkdir -p "${dbg%/*}" "${link%/*}" 107218822Sdim "${OBJCOPY}" --only-keep-debug "${mod}" "${dbg}" 108218822Sdim ln -sf --relative "${dbg}" "${link}" 109218822Sdim done < modules.order 110218822Sdim 111218822Sdim # Build debug package 112218822Sdim # Different tools want the image in different locations 11380016Sobrien # perf 11480016Sobrien mkdir -p ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/ 11580016Sobrien cp vmlinux ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/ 11680016Sobrien # systemtap 11780016Sobrien mkdir -p ${pdir}/usr/lib/debug/boot/ 11880016Sobrien ln -s ../lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/boot/vmlinux-${KERNELRELEASE} 11980016Sobrien # kdump-tools 12080016Sobrien ln -s lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/vmlinux-${KERNELRELEASE} 12180016Sobrien} 12280016Sobrien 123install_kernel_headers () { 124 pdir=debian/$1 125 version=${1#linux-headers-} 126 127 "${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}" 128 129 mkdir -p $pdir/lib/modules/$version/ 130 ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build 131} 132 133install_libc_headers () { 134 pdir=debian/$1 135 136 $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr 137 138 # move asm headers to /usr/include/<libc-machine>/asm to match the structure 139 # used by Debian-based distros (to support multi-arch) 140 mkdir "$pdir/usr/include/${DEB_HOST_MULTIARCH}" 141 mv "$pdir/usr/include/asm" "$pdir/usr/include/${DEB_HOST_MULTIARCH}" 142} 143 144package=$1 145 146case "${package}" in 147*-dbg) 148 install_linux_image_dbg "${package}";; 149linux-image-*|user-mode-linux-*) 150 install_linux_image "${package}";; 151linux-libc-dev) 152 install_libc_headers "${package}";; 153linux-headers-*) 154 install_kernel_headers "${package}";; 155esac 156