18c2ecf20Sopenharmony_ci#!/bin/sh 28c2ecf20Sopenharmony_ci# 38c2ecf20Sopenharmony_ci# builddeb 1.3 48c2ecf20Sopenharmony_ci# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 58c2ecf20Sopenharmony_ci# 68c2ecf20Sopenharmony_ci# Simple script to generate a deb package for a Linux kernel. All the 78c2ecf20Sopenharmony_ci# complexity of what to do with a kernel after it is installed or removed 88c2ecf20Sopenharmony_ci# is left to other scripts and packages: they can install scripts in the 98c2ecf20Sopenharmony_ci# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 108c2ecf20Sopenharmony_ci# specified in KDEB_HOOKDIR) that will be called on package install and 118c2ecf20Sopenharmony_ci# removal. 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciset -e 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciis_enabled() { 168c2ecf20Sopenharmony_ci grep -q "^$1=y" include/config/auto.conf 178c2ecf20Sopenharmony_ci} 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciif_enabled_echo() { 208c2ecf20Sopenharmony_ci if is_enabled "$1"; then 218c2ecf20Sopenharmony_ci echo -n "$2" 228c2ecf20Sopenharmony_ci elif [ $# -ge 3 ]; then 238c2ecf20Sopenharmony_ci echo -n "$3" 248c2ecf20Sopenharmony_ci fi 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cicreate_package() { 288c2ecf20Sopenharmony_ci local pname="$1" pdir="$2" 298c2ecf20Sopenharmony_ci local dpkg_deb_opts 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci mkdir -m 755 -p "$pdir/DEBIAN" 328c2ecf20Sopenharmony_ci mkdir -p "$pdir/usr/share/doc/$pname" 338c2ecf20Sopenharmony_ci cp debian/copyright "$pdir/usr/share/doc/$pname/" 348c2ecf20Sopenharmony_ci cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 358c2ecf20Sopenharmony_ci gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 368c2ecf20Sopenharmony_ci sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 378c2ecf20Sopenharmony_ci | xargs -r0 md5sum > DEBIAN/md5sums" 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci # Fix ownership and permissions 408c2ecf20Sopenharmony_ci if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then 418c2ecf20Sopenharmony_ci dpkg_deb_opts="--root-owner-group" 428c2ecf20Sopenharmony_ci else 438c2ecf20Sopenharmony_ci chown -R root:root "$pdir" 448c2ecf20Sopenharmony_ci fi 458c2ecf20Sopenharmony_ci chmod -R go-w "$pdir" 468c2ecf20Sopenharmony_ci # in case we are in a restrictive umask environment like 0077 478c2ecf20Sopenharmony_ci chmod -R a+rX "$pdir" 488c2ecf20Sopenharmony_ci # in case we build in a setuid/setgid directory 498c2ecf20Sopenharmony_ci chmod -R ug-s "$pdir" 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci # Create the package 528c2ecf20Sopenharmony_ci dpkg-gencontrol -p$pname -P"$pdir" 538c2ecf20Sopenharmony_ci dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cideploy_kernel_headers () { 578c2ecf20Sopenharmony_ci pdir=$1 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci rm -rf $pdir 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci ( 628c2ecf20Sopenharmony_ci cd $srctree 638c2ecf20Sopenharmony_ci find . arch/$SRCARCH -maxdepth 1 -name Makefile\* 648c2ecf20Sopenharmony_ci find include scripts -type f -o -type l 658c2ecf20Sopenharmony_ci find arch/$SRCARCH -name Kbuild.platforms -o -name Platform 668c2ecf20Sopenharmony_ci find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f 678c2ecf20Sopenharmony_ci ) > debian/hdrsrcfiles 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci { 708c2ecf20Sopenharmony_ci if is_enabled CONFIG_STACK_VALIDATION; then 718c2ecf20Sopenharmony_ci echo tools/objtool/objtool 728c2ecf20Sopenharmony_ci fi 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci find arch/$SRCARCH/include Module.symvers include scripts -type f 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci if is_enabled CONFIG_GCC_PLUGINS; then 778c2ecf20Sopenharmony_ci find scripts/gcc-plugins -name \*.so 788c2ecf20Sopenharmony_ci fi 798c2ecf20Sopenharmony_ci } > debian/hdrobjfiles 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci destdir=$pdir/usr/src/linux-headers-$version 828c2ecf20Sopenharmony_ci mkdir -p $destdir 838c2ecf20Sopenharmony_ci tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir 848c2ecf20Sopenharmony_ci tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir 858c2ecf20Sopenharmony_ci rm -f debian/hdrsrcfiles debian/hdrobjfiles 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci # copy .config manually to be where it's expected to be 888c2ecf20Sopenharmony_ci cp $KCONFIG_CONFIG $destdir/.config 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci mkdir -p $pdir/lib/modules/$version/ 918c2ecf20Sopenharmony_ci ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build 928c2ecf20Sopenharmony_ci} 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cideploy_libc_headers () { 958c2ecf20Sopenharmony_ci pdir=$1 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci rm -rf $pdir 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci $MAKE -f $srctree/Makefile headers 1008c2ecf20Sopenharmony_ci $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci # move asm headers to /usr/include/<libc-machine>/asm to match the structure 1038c2ecf20Sopenharmony_ci # used by Debian-based distros (to support multi-arch) 1048c2ecf20Sopenharmony_ci host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) 1058c2ecf20Sopenharmony_ci mkdir $pdir/usr/include/$host_arch 1068c2ecf20Sopenharmony_ci mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_civersion=$KERNELRELEASE 1108c2ecf20Sopenharmony_citmpdir=debian/linux-image 1118c2ecf20Sopenharmony_cidbg_dir=debian/linux-image-dbg 1128c2ecf20Sopenharmony_cipackagename=linux-image-$version 1138c2ecf20Sopenharmony_cidbg_packagename=$packagename-dbg 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ciif [ "$ARCH" = "um" ] ; then 1168c2ecf20Sopenharmony_ci packagename=user-mode-linux-$version 1178c2ecf20Sopenharmony_cifi 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci# Not all arches have the same installed path in debian 1208c2ecf20Sopenharmony_ci# XXX: have each arch Makefile export a variable of the canonical image install 1218c2ecf20Sopenharmony_ci# path instead 1228c2ecf20Sopenharmony_cicase $ARCH in 1238c2ecf20Sopenharmony_cium) 1248c2ecf20Sopenharmony_ci installed_image_path="usr/bin/linux-$version" 1258c2ecf20Sopenharmony_ci ;; 1268c2ecf20Sopenharmony_ciparisc|mips|powerpc) 1278c2ecf20Sopenharmony_ci installed_image_path="boot/vmlinux-$version" 1288c2ecf20Sopenharmony_ci ;; 1298c2ecf20Sopenharmony_ci*) 1308c2ecf20Sopenharmony_ci installed_image_path="boot/vmlinuz-$version" 1318c2ecf20Sopenharmony_ciesac 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ciBUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci# Setup the directory structure 1368c2ecf20Sopenharmony_cirm -rf "$tmpdir" "$dbg_dir" debian/files 1378c2ecf20Sopenharmony_cimkdir -m 755 -p "$tmpdir/DEBIAN" 1388c2ecf20Sopenharmony_cimkdir -p "$tmpdir/lib" "$tmpdir/boot" 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci# Install the kernel 1418c2ecf20Sopenharmony_ciif [ "$ARCH" = "um" ] ; then 1428c2ecf20Sopenharmony_ci mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" 1438c2ecf20Sopenharmony_ci cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" 1448c2ecf20Sopenharmony_ci cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" 1458c2ecf20Sopenharmony_ci gzip "$tmpdir/usr/share/doc/$packagename/config" 1468c2ecf20Sopenharmony_cielse 1478c2ecf20Sopenharmony_ci cp System.map "$tmpdir/boot/System.map-$version" 1488c2ecf20Sopenharmony_ci cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" 1498c2ecf20Sopenharmony_cifi 1508c2ecf20Sopenharmony_cicp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ciif is_enabled CONFIG_OF_EARLY_FLATTREE; then 1538c2ecf20Sopenharmony_ci # Only some architectures with OF support have this target 1548c2ecf20Sopenharmony_ci if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then 1558c2ecf20Sopenharmony_ci $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install 1568c2ecf20Sopenharmony_ci fi 1578c2ecf20Sopenharmony_cifi 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ciif is_enabled CONFIG_MODULES; then 1608c2ecf20Sopenharmony_ci INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install 1618c2ecf20Sopenharmony_ci rm -f "$tmpdir/lib/modules/$version/build" 1628c2ecf20Sopenharmony_ci rm -f "$tmpdir/lib/modules/$version/source" 1638c2ecf20Sopenharmony_ci if [ "$ARCH" = "um" ] ; then 1648c2ecf20Sopenharmony_ci mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 1658c2ecf20Sopenharmony_ci rmdir "$tmpdir/lib/modules/$version" 1668c2ecf20Sopenharmony_ci fi 1678c2ecf20Sopenharmony_ci if [ -n "$BUILD_DEBUG" ] ; then 1688c2ecf20Sopenharmony_ci for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do 1698c2ecf20Sopenharmony_ci module=lib/modules/$module 1708c2ecf20Sopenharmony_ci mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) 1718c2ecf20Sopenharmony_ci # only keep debug symbols in the debug file 1728c2ecf20Sopenharmony_ci $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module 1738c2ecf20Sopenharmony_ci # strip original module from debug symbols 1748c2ecf20Sopenharmony_ci $OBJCOPY --strip-debug $tmpdir/$module 1758c2ecf20Sopenharmony_ci # then add a link to those 1768c2ecf20Sopenharmony_ci $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module 1778c2ecf20Sopenharmony_ci done 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci # resign stripped modules 1808c2ecf20Sopenharmony_ci if is_enabled CONFIG_MODULE_SIG_ALL; then 1818c2ecf20Sopenharmony_ci INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign 1828c2ecf20Sopenharmony_ci fi 1838c2ecf20Sopenharmony_ci fi 1848c2ecf20Sopenharmony_cifi 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci# Install the maintainer scripts 1878c2ecf20Sopenharmony_ci# Note: hook scripts under /etc/kernel are also executed by official Debian 1888c2ecf20Sopenharmony_ci# kernel packages, as well as kernel packages built using make-kpkg. 1898c2ecf20Sopenharmony_ci# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 1908c2ecf20Sopenharmony_ci# so do we; recent versions of dracut and initramfs-tools will obey this. 1918c2ecf20Sopenharmony_cidebhookdir=${KDEB_HOOKDIR:-/etc/kernel} 1928c2ecf20Sopenharmony_cifor script in postinst postrm preinst prerm ; do 1938c2ecf20Sopenharmony_ci mkdir -p "$tmpdir$debhookdir/$script.d" 1948c2ecf20Sopenharmony_ci cat <<EOF > "$tmpdir/DEBIAN/$script" 1958c2ecf20Sopenharmony_ci#!/bin/sh 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ciset -e 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci# Pass maintainer script parameters to hook scripts 2008c2ecf20Sopenharmony_ciexport DEB_MAINT_PARAMS="\$*" 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci# Tell initramfs builder whether it's wanted 2038c2ecf20Sopenharmony_ciexport INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_citest -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d 2068c2ecf20Sopenharmony_ciexit 0 2078c2ecf20Sopenharmony_ciEOF 2088c2ecf20Sopenharmony_ci chmod 755 "$tmpdir/DEBIAN/$script" 2098c2ecf20Sopenharmony_cidone 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ciif [ "$ARCH" != "um" ]; then 2128c2ecf20Sopenharmony_ci if is_enabled CONFIG_MODULES; then 2138c2ecf20Sopenharmony_ci deploy_kernel_headers debian/linux-headers 2148c2ecf20Sopenharmony_ci create_package linux-headers-$version debian/linux-headers 2158c2ecf20Sopenharmony_ci fi 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci deploy_libc_headers debian/linux-libc-dev 2188c2ecf20Sopenharmony_ci create_package linux-libc-dev debian/linux-libc-dev 2198c2ecf20Sopenharmony_cifi 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cicreate_package "$packagename" "$tmpdir" 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ciif [ -n "$BUILD_DEBUG" ] ; then 2248c2ecf20Sopenharmony_ci # Build debug package 2258c2ecf20Sopenharmony_ci # Different tools want the image in different locations 2268c2ecf20Sopenharmony_ci # perf 2278c2ecf20Sopenharmony_ci mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 2288c2ecf20Sopenharmony_ci cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 2298c2ecf20Sopenharmony_ci # systemtap 2308c2ecf20Sopenharmony_ci mkdir -p $dbg_dir/usr/lib/debug/boot/ 2318c2ecf20Sopenharmony_ci ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 2328c2ecf20Sopenharmony_ci # kdump-tools 2338c2ecf20Sopenharmony_ci ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 2348c2ecf20Sopenharmony_ci create_package "$dbg_packagename" "$dbg_dir" 2358c2ecf20Sopenharmony_cifi 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ciexit 0 238