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 create_package() { 16 grep -q "^$1=y" include/config/auto.co !! 16 local pname="$1" pdir="$2" 17 } << 18 17 19 if_enabled_echo() { !! 18 cp debian/copyright "$pdir/usr/share/doc/$pname/" 20 if is_enabled "$1"; then !! 19 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 21 echo -n "$2" !! 20 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 22 elif [ $# -ge 3 ]; then !! 21 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 23 echo -n "$3" !! 22 | xargs -r0 md5sum > DEBIAN/md5sums" >> 23 >> 24 # Fix ownership and permissions >> 25 chown -R root:root "$pdir" >> 26 chmod -R go-w "$pdir" >> 27 >> 28 # Attempt to find the correct Debian architecture >> 29 local forcearch="" debarch="" >> 30 case "$UTS_MACHINE" in >> 31 i386|ia64|alpha) >> 32 debarch="$UTS_MACHINE" ;; >> 33 x86_64) >> 34 debarch=amd64 ;; >> 35 sparc*) >> 36 debarch=sparc ;; >> 37 s390*) >> 38 debarch=s390 ;; >> 39 ppc*) >> 40 debarch=powerpc ;; >> 41 parisc*) >> 42 debarch=hppa ;; >> 43 mips*) >> 44 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;; >> 45 arm*) >> 46 debarch=arm$(grep -q CONFIG_AEABI=y .config && echo el) ;; >> 47 *) >> 48 echo "" >&2 >> 49 echo "** ** ** WARNING ** ** **" >&2 >> 50 echo "" >&2 >> 51 echo "Your architecture doesn't have it's equivalent" >&2 >> 52 echo "Debian userspace architecture defined!" >&2 >> 53 echo "Falling back to using your current userspace instead!" >&2 >> 54 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 >> 55 echo "" >&2 >> 56 esac >> 57 if [ -n "$KBUILD_DEBARCH" ] ; then >> 58 debarch="$KBUILD_DEBARCH" 24 fi 59 fi 25 } !! 60 if [ -n "$debarch" ] ; then 26 !! 61 forcearch="-DArchitecture=$debarch" 27 install_linux_image () { << 28 pname=$1 << 29 pdir=debian/$1 << 30 << 31 # Only some architectures with OF supp << 32 if is_enabled CONFIG_OF_EARLY_FLATTREE << 33 ${MAKE} -f ${srctree}/Makefile << 34 fi 62 fi 35 63 36 ${MAKE} -f ${srctree}/Makefile INSTALL !! 64 # Create the package 37 rm -f "${pdir}/lib/modules/${KERNELREL !! 65 dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" >> 66 dpkg --build "$pdir" .. >> 67 } 38 68 39 # Install the kernel !! 69 # Some variables and settings used throughout the script 40 if [ "${ARCH}" = um ] ; then !! 70 version=$KERNELRELEASE 41 mkdir -p "${pdir}/usr/lib/uml/ !! 71 revision=$(cat .version) 42 mv "${pdir}/lib/modules/${KERN !! 72 if [ -n "$KDEB_PKGVERSION" ]; then 43 mkdir -p "${pdir}/usr/bin" "${ !! 73 packageversion=$KDEB_PKGVERSION 44 cp System.map "${pdir}/usr/lib !! 74 else 45 cp ${KCONFIG_CONFIG} "${pdir}/ !! 75 packageversion=$version-$revision 46 gzip "${pdir}/usr/share/doc/${ !! 76 fi >> 77 tmpdir="$objtree/debian/tmp" >> 78 fwdir="$objtree/debian/fwtmp" >> 79 kernel_headers_dir="$objtree/debian/hdrtmp" >> 80 libc_headers_dir="$objtree/debian/headertmp" >> 81 packagename=linux-image-$version >> 82 fwpackagename=linux-firmware-image >> 83 kernel_headers_packagename=linux-headers-$version >> 84 libc_headers_packagename=linux-libc-dev >> 85 >> 86 if [ "$ARCH" = "um" ] ; then >> 87 packagename=user-mode-linux-$version >> 88 fi >> 89 >> 90 # Setup the directory structure >> 91 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" >> 92 mkdir -m 755 -p "$tmpdir/DEBIAN" >> 93 mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" >> 94 mkdir -m 755 -p "$fwdir/DEBIAN" >> 95 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename" >> 96 mkdir -m 755 -p "$libc_headers_dir/DEBIAN" >> 97 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" >> 98 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN" >> 99 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" >> 100 mkdir -p "$kernel_headers_dir/lib/modules/$version/" >> 101 if [ "$ARCH" = "um" ] ; then >> 102 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" >> 103 fi >> 104 >> 105 # Build and install the kernel >> 106 if [ "$ARCH" = "um" ] ; then >> 107 $MAKE linux >> 108 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" >> 109 cp .config "$tmpdir/usr/share/doc/$packagename/config" >> 110 gzip "$tmpdir/usr/share/doc/$packagename/config" >> 111 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" >> 112 else >> 113 cp System.map "$tmpdir/boot/System.map-$version" >> 114 cp .config "$tmpdir/boot/config-$version" >> 115 # Not all arches include the boot path in KBUILD_IMAGE >> 116 if [ -e $KBUILD_IMAGE ]; then >> 117 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 47 else 118 else 48 mkdir -p "${pdir}/boot" !! 119 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 49 cp System.map "${pdir}/boot/Sy << 50 cp ${KCONFIG_CONFIG} "${pdir}/ << 51 fi 120 fi >> 121 fi 52 122 53 # Not all arches have the same install !! 123 if grep -q '^CONFIG_MODULES=y' .config ; then 54 # XXX: have each arch Makefile export !! 124 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install 55 # path instead !! 125 rm -f "$tmpdir/lib/modules/$version/build" 56 case "${SRCARCH}" in !! 126 rm -f "$tmpdir/lib/modules/$version/source" 57 um) !! 127 if [ "$ARCH" = "um" ] ; then 58 installed_image_path="usr/bin/ !! 128 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 59 parisc|mips|powerpc) !! 129 rmdir "$tmpdir/lib/modules/$version" 60 installed_image_path="boot/vml !! 130 fi 61 *) !! 131 fi 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 } << 93 << 94 install_linux_image_dbg () { << 95 pdir=debian/$1 << 96 << 97 # Parse modules.order directly because << 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 << 110 # Build debug package << 111 # Different tools want the image in di << 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 << 122 install_kernel_headers () { << 123 pdir=debian/$1 << 124 version=${1#linux-headers-} << 125 << 126 CC="${DEB_HOST_GNU_TYPE}-gcc" "${srctr << 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 132 137 # move asm headers to /usr/include/<li !! 133 if [ "$ARCH" != "um" ]; then 138 # used by Debian-based distros (to sup !! 134 $MAKE headers_check KBUILD_SRC= 139 mkdir "$pdir/usr/include/${DEB_HOST_MU !! 135 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" 140 mv "$pdir/usr/include/asm" "$pdir/usr/ !! 136 fi 141 } !! 137 >> 138 # Install the maintainer scripts >> 139 # Note: hook scripts under /etc/kernel are also executed by official Debian >> 140 # kernel packages, as well as kernel packages built using make-kpkg >> 141 debhookdir=${KDEB_HOOKDIR:-/etc/kernel} >> 142 for script in postinst postrm preinst prerm ; do >> 143 mkdir -p "$tmpdir$debhookdir/$script.d" >> 144 cat <<EOF > "$tmpdir/DEBIAN/$script" >> 145 #!/bin/sh >> 146 >> 147 set -e >> 148 >> 149 # Pass maintainer script parameters to hook scripts >> 150 export DEB_MAINT_PARAMS="\$*" >> 151 >> 152 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d >> 153 exit 0 >> 154 EOF >> 155 chmod 755 "$tmpdir/DEBIAN/$script" >> 156 done >> 157 >> 158 # Try to determine maintainer and email values >> 159 if [ -n "$DEBEMAIL" ]; then >> 160 email=$DEBEMAIL >> 161 elif [ -n "$EMAIL" ]; then >> 162 email=$EMAIL >> 163 else >> 164 email=$(id -nu)@$(hostname -f) >> 165 fi >> 166 if [ -n "$DEBFULLNAME" ]; then >> 167 name=$DEBFULLNAME >> 168 elif [ -n "$NAME" ]; then >> 169 name=$NAME >> 170 else >> 171 name="Anonymous" >> 172 fi >> 173 maintainer="$name <$email>" >> 174 >> 175 # Generate a simple changelog template >> 176 cat <<EOF > debian/changelog >> 177 linux-upstream ($packageversion) unstable; urgency=low >> 178 >> 179 * Custom built Linux kernel. >> 180 >> 181 -- $maintainer $(date -R) >> 182 EOF >> 183 >> 184 # Generate copyright file >> 185 cat <<EOF > debian/copyright >> 186 This is a packacked upstream version of the Linux kernel. >> 187 >> 188 The sources may be found at most Linux ftp sites, including: >> 189 ftp://ftp.kernel.org/pub/linux/kernel >> 190 >> 191 Copyright: 1991 - 2009 Linus Torvalds and others. >> 192 >> 193 The git repository for mainline kernel development is at: >> 194 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git >> 195 >> 196 This program is free software; you can redistribute it and/or modify >> 197 it under the terms of the GNU General Public License as published by >> 198 the Free Software Foundation; version 2 dated June, 1991. >> 199 >> 200 On Debian GNU/Linux systems, the complete text of the GNU General Public >> 201 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. >> 202 EOF >> 203 >> 204 # Generate a control file >> 205 cat <<EOF > debian/control >> 206 Source: linux-upstream >> 207 Section: kernel >> 208 Priority: optional >> 209 Maintainer: $maintainer >> 210 Standards-Version: 3.8.4 >> 211 Homepage: http://www.kernel.org/ >> 212 EOF >> 213 >> 214 if [ "$ARCH" = "um" ]; then >> 215 cat <<EOF >> debian/control >> 216 >> 217 Package: $packagename >> 218 Provides: linux-image, linux-image-2.6, linux-modules-$version >> 219 Architecture: any >> 220 Description: User Mode Linux kernel, version $version >> 221 User-mode Linux is a port of the Linux kernel to its own system call >> 222 interface. It provides a kind of virtual machine, which runs Linux >> 223 as a user process under another Linux kernel. This is useful for >> 224 kernel development, sandboxes, jails, experimentation, and >> 225 many other things. >> 226 . >> 227 This package contains the Linux kernel, modules and corresponding other >> 228 files, version: $version. >> 229 EOF >> 230 >> 231 else >> 232 cat <<EOF >> debian/control >> 233 >> 234 Package: $packagename >> 235 Provides: linux-image, linux-image-2.6, linux-modules-$version >> 236 Suggests: $fwpackagename >> 237 Architecture: any >> 238 Description: Linux kernel, version $version >> 239 This package contains the Linux kernel, modules and corresponding other >> 240 files, version: $version. >> 241 EOF >> 242 >> 243 fi >> 244 >> 245 # Build header package >> 246 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles") >> 247 (cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles") >> 248 (cd $objtree; find arch/$SRCARCH/include .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles") >> 249 destdir=$kernel_headers_dir/usr/src/linux-headers-$version >> 250 mkdir -p "$destdir" >> 251 (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) >> 252 (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) >> 253 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" >> 254 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" >> 255 >> 256 cat <<EOF >> debian/control >> 257 >> 258 Package: $kernel_headers_packagename >> 259 Provides: linux-headers, linux-headers-2.6 >> 260 Architecture: any >> 261 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} >> 262 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} >> 263 . >> 264 This is useful for people who need to build external modules >> 265 EOF >> 266 >> 267 # Do we have firmware? Move it out of the way and build it into a package. >> 268 if [ -e "$tmpdir/lib/firmware" ]; then >> 269 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" >> 270 rmdir "$tmpdir/lib/firmware" >> 271 >> 272 cat <<EOF >> debian/control >> 273 >> 274 Package: $fwpackagename >> 275 Architecture: all >> 276 Description: Linux kernel firmware, version $version >> 277 This package contains firmware from the Linux kernel, version $version. >> 278 EOF >> 279 >> 280 create_package "$fwpackagename" "$fwdir" >> 281 fi >> 282 >> 283 cat <<EOF >> debian/control >> 284 >> 285 Package: $libc_headers_packagename >> 286 Section: devel >> 287 Provides: linux-kernel-headers >> 288 Architecture: any >> 289 Description: Linux support headers for userspace development >> 290 This package provides userspaces headers from the Linux kernel. These headers >> 291 are used by the installed headers for GNU glibc and other system libraries. >> 292 EOF >> 293 >> 294 if [ "$ARCH" != "um" ]; then >> 295 create_package "$kernel_headers_packagename" "$kernel_headers_dir" >> 296 create_package "$libc_headers_packagename" "$libc_headers_dir" >> 297 fi 142 298 143 package=$1 !! 299 create_package "$packagename" "$tmpdir" 144 300 145 case "${package}" in !! 301 exit 0 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.