1 #!/bin/sh 1 #!/bin/sh 2 # 2 # 3 # builddeb 1.3 3 # builddeb 1.3 4 # Copyright 2003 Wichert Akkerman <wichert@wigg 4 # Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 5 # 5 # 6 # Simple script to generate a deb package for 6 # Simple script to generate a deb package for a Linux kernel. All the 7 # complexity of what to do with a kernel after 7 # complexity of what to do with a kernel after it is installed or removed 8 # is left to other scripts and packages: they 8 # is left to other scripts and packages: they can install scripts in the 9 # /etc/kernel/{pre,post}{inst,rm}.d/ directori 9 # /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 10 # specified in KDEB_HOOKDIR) that will be call 10 # specified in KDEB_HOOKDIR) that will be called on package install and 11 # removal. 11 # removal. 12 12 13 set -eu !! 13 set -e 14 14 15 is_enabled() { 15 is_enabled() { 16 grep -q "^$1=y" include/config/auto.co 16 grep -q "^$1=y" include/config/auto.conf 17 } 17 } 18 18 19 if_enabled_echo() { 19 if_enabled_echo() { 20 if is_enabled "$1"; then 20 if is_enabled "$1"; then 21 echo -n "$2" 21 echo -n "$2" 22 elif [ $# -ge 3 ]; then 22 elif [ $# -ge 3 ]; then 23 echo -n "$3" 23 echo -n "$3" 24 fi 24 fi 25 } 25 } 26 26 27 install_linux_image () { !! 27 create_package() { 28 pname=$1 !! 28 local pname="$1" pdir="$2" 29 pdir=debian/$1 << 30 29 31 # Only some architectures with OF supp !! 30 mkdir -m 755 -p "$pdir/DEBIAN" 32 if is_enabled CONFIG_OF_EARLY_FLATTREE !! 31 mkdir -p "$pdir/usr/share/doc/$pname" 33 ${MAKE} -f ${srctree}/Makefile !! 32 cp debian/copyright "$pdir/usr/share/doc/$pname/" 34 fi !! 33 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" >> 34 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" >> 35 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ >> 36 | xargs -r0 md5sum > DEBIAN/md5sums" >> 37 >> 38 # Fix ownership and permissions >> 39 chown -R root:root "$pdir" >> 40 chmod -R go-w "$pdir" >> 41 # in case we are in a restrictive umask environment like 0077 >> 42 chmod -R a+rX "$pdir" >> 43 >> 44 # Create the package >> 45 dpkg-gencontrol -p$pname -P"$pdir" >> 46 dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. >> 47 } >> 48 >> 49 deploy_kernel_headers () { >> 50 pdir=$1 >> 51 >> 52 rm -rf $pdir >> 53 >> 54 ( >> 55 cd $srctree >> 56 find . arch/$SRCARCH -maxdepth 1 -name Makefile\* >> 57 find include scripts -type f -o -type l >> 58 find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform >> 59 find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f >> 60 ) > debian/hdrsrcfiles >> 61 >> 62 { >> 63 if is_enabled CONFIG_STACK_VALIDATION; then >> 64 echo tools/objtool/objtool >> 65 fi >> 66 >> 67 find arch/$SRCARCH/include Module.symvers include scripts -type f >> 68 >> 69 if is_enabled CONFIG_GCC_PLUGINS; then >> 70 find scripts/gcc-plugins -name \*.so >> 71 fi >> 72 } > debian/hdrobjfiles >> 73 >> 74 destdir=$pdir/usr/src/linux-headers-$version >> 75 mkdir -p $destdir >> 76 tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir >> 77 tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir >> 78 rm -f debian/hdrsrcfiles debian/hdrobjfiles 35 79 36 ${MAKE} -f ${srctree}/Makefile INSTALL !! 80 # copy .config manually to be where it's expected to be 37 rm -f "${pdir}/lib/modules/${KERNELREL !! 81 cp $KCONFIG_CONFIG $destdir/.config 38 82 39 # Install the kernel !! 83 mkdir -p $pdir/lib/modules/$version/ 40 if [ "${ARCH}" = um ] ; then !! 84 ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build 41 mkdir -p "${pdir}/usr/lib/uml/ << 42 mv "${pdir}/lib/modules/${KERN << 43 mkdir -p "${pdir}/usr/bin" "${ << 44 cp System.map "${pdir}/usr/lib << 45 cp ${KCONFIG_CONFIG} "${pdir}/ << 46 gzip "${pdir}/usr/share/doc/${ << 47 else << 48 mkdir -p "${pdir}/boot" << 49 cp System.map "${pdir}/boot/Sy << 50 cp ${KCONFIG_CONFIG} "${pdir}/ << 51 fi << 52 << 53 # Not all arches have the same install << 54 # XXX: have each arch Makefile export << 55 # path instead << 56 case "${SRCARCH}" in << 57 um) << 58 installed_image_path="usr/bin/ << 59 parisc|mips|powerpc) << 60 installed_image_path="boot/vml << 61 *) << 62 installed_image_path="boot/vml << 63 esac << 64 cp "$(${MAKE} -s -f ${srctree}/Makefil << 65 << 66 # Install the maintainer scripts << 67 # Note: hook scripts under /etc/kernel << 68 # kernel packages, as well as kernel p << 69 # make-kpkg sets $INITRD to indicate w << 70 # so do we; recent versions of dracut << 71 debhookdir=${KDEB_HOOKDIR:-/etc/kernel << 72 for script in postinst postrm preinst << 73 mkdir -p "${pdir}${debhookdir} << 74 << 75 mkdir -p "${pdir}/DEBIAN" << 76 cat <<-EOF > "${pdir}/DEBIAN/$ << 77 #!/bin/sh << 78 << 79 set -e << 80 << 81 # Pass maintainer script param << 82 export DEB_MAINT_PARAMS="\$*" << 83 << 84 # Tell initramfs builder wheth << 85 export INITRD=$(if_enabled_ech << 86 << 87 test -d ${debhookdir}/${script << 88 exit 0 << 89 EOF << 90 chmod 755 "${pdir}/DEBIAN/${sc << 91 done << 92 } 85 } 93 86 94 install_linux_image_dbg () { !! 87 deploy_libc_headers () { 95 pdir=debian/$1 !! 88 pdir=$1 96 89 97 # Parse modules.order directly because !! 90 rm -rf $pdir 98 # compress modules, and then run unnee << 99 while read -r mod; do << 100 mod="${mod%.o}.ko" << 101 dbg="${pdir}/usr/lib/debug/lib << 102 buildid=$("${READELF}" -n "${m << 103 link="${pdir}/usr/lib/debug/.b << 104 << 105 mkdir -p "${dbg%/*}" "${link%/ << 106 "${OBJCOPY}" --only-keep-debug << 107 ln -sf --relative "${dbg}" "${ << 108 done < modules.order << 109 91 110 # Build debug package !! 92 $MAKE -f $srctree/Makefile headers 111 # Different tools want the image in di !! 93 $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr 112 # perf << 113 mkdir -p ${pdir}/usr/lib/debug/lib/mod << 114 cp vmlinux ${pdir}/usr/lib/debug/lib/m << 115 # systemtap << 116 mkdir -p ${pdir}/usr/lib/debug/boot/ << 117 ln -s ../lib/modules/${KERNELRELEASE}/ << 118 # kdump-tools << 119 ln -s lib/modules/${KERNELRELEASE}/vml << 120 } << 121 94 122 install_kernel_headers () { !! 95 # move asm headers to /usr/include/<libc-machine>/asm to match the structure 123 pdir=debian/$1 !! 96 # used by Debian-based distros (to support multi-arch) 124 version=${1#linux-headers-} !! 97 host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH) >> 98 mkdir $pdir/usr/include/$host_arch >> 99 mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/ >> 100 } >> 101 >> 102 version=$KERNELRELEASE >> 103 tmpdir=debian/linux-image >> 104 dbg_dir=debian/linux-image-dbg >> 105 packagename=linux-image-$version >> 106 dbg_packagename=$packagename-dbg >> 107 >> 108 if [ "$ARCH" = "um" ] ; then >> 109 packagename=user-mode-linux-$version >> 110 fi >> 111 >> 112 # Not all arches have the same installed path in debian >> 113 # XXX: have each arch Makefile export a variable of the canonical image install >> 114 # path instead >> 115 case $ARCH in >> 116 um) >> 117 installed_image_path="usr/bin/linux-$version" >> 118 ;; >> 119 parisc|mips|powerpc) >> 120 installed_image_path="boot/vmlinux-$version" >> 121 ;; >> 122 *) >> 123 installed_image_path="boot/vmlinuz-$version" >> 124 esac 125 125 126 CC="${DEB_HOST_GNU_TYPE}-gcc" "${srctr !! 126 BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) 127 127 128 mkdir -p $pdir/lib/modules/$version/ !! 128 # Setup the directory structure 129 ln -s /usr/src/linux-headers-$version !! 129 rm -rf "$tmpdir" "$dbg_dir" debian/files 130 } !! 130 mkdir -m 755 -p "$tmpdir/DEBIAN" >> 131 mkdir -p "$tmpdir/lib" "$tmpdir/boot" >> 132 >> 133 # Install the kernel >> 134 if [ "$ARCH" = "um" ] ; then >> 135 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" >> 136 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" >> 137 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" >> 138 gzip "$tmpdir/usr/share/doc/$packagename/config" >> 139 else >> 140 cp System.map "$tmpdir/boot/System.map-$version" >> 141 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" >> 142 fi >> 143 cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" 131 144 132 install_libc_headers () { !! 145 if is_enabled CONFIG_OF_EARLY_FLATTREE; then 133 pdir=debian/$1 !! 146 # Only some architectures with OF support have this target >> 147 if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then >> 148 $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install >> 149 fi >> 150 fi 134 151 135 $MAKE -f $srctree/Makefile headers_ins !! 152 if is_enabled CONFIG_MODULES; then >> 153 INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install >> 154 rm -f "$tmpdir/lib/modules/$version/build" >> 155 rm -f "$tmpdir/lib/modules/$version/source" >> 156 if [ "$ARCH" = "um" ] ; then >> 157 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" >> 158 rmdir "$tmpdir/lib/modules/$version" >> 159 fi >> 160 if [ -n "$BUILD_DEBUG" ] ; then >> 161 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do >> 162 module=lib/modules/$module >> 163 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) >> 164 # only keep debug symbols in the debug file >> 165 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module >> 166 # strip original module from debug symbols >> 167 $OBJCOPY --strip-debug $tmpdir/$module >> 168 # then add a link to those >> 169 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module >> 170 done >> 171 >> 172 # resign stripped modules >> 173 if is_enabled CONFIG_MODULE_SIG_ALL; then >> 174 INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign >> 175 fi >> 176 fi >> 177 fi 136 178 137 # move asm headers to /usr/include/<li !! 179 # Install the maintainer scripts 138 # used by Debian-based distros (to sup !! 180 # Note: hook scripts under /etc/kernel are also executed by official Debian 139 mkdir "$pdir/usr/include/${DEB_HOST_MU !! 181 # kernel packages, as well as kernel packages built using make-kpkg. 140 mv "$pdir/usr/include/asm" "$pdir/usr/ !! 182 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 141 } !! 183 # so do we; recent versions of dracut and initramfs-tools will obey this. >> 184 debhookdir=${KDEB_HOOKDIR:-/etc/kernel} >> 185 for script in postinst postrm preinst prerm ; do >> 186 mkdir -p "$tmpdir$debhookdir/$script.d" >> 187 cat <<EOF > "$tmpdir/DEBIAN/$script" >> 188 #!/bin/sh >> 189 >> 190 set -e >> 191 >> 192 # Pass maintainer script parameters to hook scripts >> 193 export DEB_MAINT_PARAMS="\$*" >> 194 >> 195 # Tell initramfs builder whether it's wanted >> 196 export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) >> 197 >> 198 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d >> 199 exit 0 >> 200 EOF >> 201 chmod 755 "$tmpdir/DEBIAN/$script" >> 202 done >> 203 >> 204 if [ "$ARCH" != "um" ]; then >> 205 if is_enabled CONFIG_MODULES; then >> 206 deploy_kernel_headers debian/linux-headers >> 207 create_package linux-headers-$version debian/linux-headers >> 208 fi 142 209 143 package=$1 !! 210 deploy_libc_headers debian/linux-libc-dev >> 211 create_package linux-libc-dev debian/linux-libc-dev >> 212 fi 144 213 145 case "${package}" in !! 214 create_package "$packagename" "$tmpdir" 146 *-dbg) !! 215 147 install_linux_image_dbg "${package}";; !! 216 if [ -n "$BUILD_DEBUG" ] ; then 148 linux-image-*|user-mode-linux-*) !! 217 # Build debug package 149 install_linux_image "${package}";; !! 218 # Different tools want the image in different locations 150 linux-libc-dev) !! 219 # perf 151 install_libc_headers "${package}";; !! 220 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 152 linux-headers-*) !! 221 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 153 install_kernel_headers "${package}";; !! 222 # systemtap 154 esac !! 223 mkdir -p $dbg_dir/usr/lib/debug/boot/ >> 224 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version >> 225 # kdump-tools >> 226 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version >> 227 create_package "$dbg_packagename" "$dbg_dir" >> 228 fi >> 229 >> 230 exit 0
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.