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