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