1#!/bin/sh 2# 3# builddeb 1.3 4# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 5# 6# Simple script to generate a deb package for a Linux kernel. All the 7# complexity of what to do with a kernel after it is installed or removed 8# is left to other scripts and packages: they can install scripts in the 9# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 10# specified in KDEB_HOOKDIR) that will be called on package install and 11# removal. 12 13set -e 14 15create_package() { 16 local pname="$1" pdir="$2" 17 18 cp debian/copyright "$pdir/usr/share/doc/$pname/" 19 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 20 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 21 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 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" 59 fi 60 if [ -n "$debarch" ] ; then 61 forcearch="-DArchitecture=$debarch" 62 fi 63 64 # Create the package 65 dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" 66 dpkg --build "$pdir" .. 67} 68 69# Some variables and settings used throughout the script 70version=$KERNELRELEASE 71revision=$(cat .version) 72if [ -n "$KDEB_PKGVERSION" ]; then 73 packageversion=$KDEB_PKGVERSION 74else 75 packageversion=$version-$revision 76fi 77tmpdir="$objtree/debian/tmp" 78fwdir="$objtree/debian/fwtmp" 79kernel_headers_dir="$objtree/debian/hdrtmp" 80libc_headers_dir="$objtree/debian/headertmp" 81packagename=linux-image-$version 82fwpackagename=linux-firmware-image 83kernel_headers_packagename=linux-headers-$version 84libc_headers_packagename=linux-libc-dev 85 86if [ "$ARCH" = "um" ] ; then 87 packagename=user-mode-linux-$version 88fi 89 90# Setup the directory structure 91rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" 92mkdir -m 755 -p "$tmpdir/DEBIAN" 93mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" 94mkdir -m 755 -p "$fwdir/DEBIAN" 95mkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename" 96mkdir -m 755 -p "$libc_headers_dir/DEBIAN" 97mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" 98mkdir -m 755 -p "$kernel_headers_dir/DEBIAN" 99mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" 100if [ "$ARCH" = "um" ] ; then 101 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" 102fi 103 104# Build and install the kernel 105if [ "$ARCH" = "um" ] ; then 106 $MAKE linux 107 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" 108 cp .config "$tmpdir/usr/share/doc/$packagename/config" 109 gzip "$tmpdir/usr/share/doc/$packagename/config" 110 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" 111else 112 cp System.map "$tmpdir/boot/System.map-$version" 113 cp .config "$tmpdir/boot/config-$version" 114 # Not all arches include the boot path in KBUILD_IMAGE 115 if [ -e $KBUILD_IMAGE ]; then 116 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 117 else 118 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 119 fi 120fi 121 122if grep -q '^CONFIG_MODULES=y' .config ; then 123 INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install 124 if [ "$ARCH" = "um" ] ; then 125 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 126 rmdir "$tmpdir/lib/modules/$version" 127 fi 128fi 129 130make headers_check 131make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" 132 133# Install the maintainer scripts 134# Note: hook scripts under /etc/kernel are also executed by official Debian 135# kernel packages, as well as kernel packages built using make-kpkg 136debhookdir=${KDEB_HOOKDIR:-/etc/kernel} 137for script in postinst postrm preinst prerm ; do 138 mkdir -p "$tmpdir$debhookdir/$script.d" 139 cat <<EOF > "$tmpdir/DEBIAN/$script" 140#!/bin/sh 141 142set -e 143 144# Pass maintainer script parameters to hook scripts 145export DEB_MAINT_PARAMS="\$*" 146 147test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d 148exit 0 149EOF 150 chmod 755 "$tmpdir/DEBIAN/$script" 151done 152 153# Try to determine maintainer and email values 154if [ -n "$DEBEMAIL" ]; then 155 email=$DEBEMAIL 156elif [ -n "$EMAIL" ]; then 157 email=$EMAIL 158else 159 email=$(id -nu)@$(hostname -f) 160fi 161if [ -n "$DEBFULLNAME" ]; then 162 name=$DEBFULLNAME 163elif [ -n "$NAME" ]; then 164 name=$NAME 165else 166 name="Anonymous" 167fi 168maintainer="$name <$email>" 169 170# Generate a simple changelog template 171cat <<EOF > debian/changelog 172linux-upstream ($packageversion) unstable; urgency=low 173 174 * Custom built Linux kernel. 175 176 -- $maintainer $(date -R) 177EOF 178 179# Generate copyright file 180cat <<EOF > debian/copyright 181This is a packacked upstream version of the Linux kernel. 182 183The sources may be found at most Linux ftp sites, including: 184ftp://ftp.kernel.org/pub/linux/kernel 185 186Copyright: 1991 - 2009 Linus Torvalds and others. 187 188The git repository for mainline kernel development is at: 189git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 190 191 This program is free software; you can redistribute it and/or modify 192 it under the terms of the GNU General Public License as published by 193 the Free Software Foundation; version 2 dated June, 1991. 194 195On Debian GNU/Linux systems, the complete text of the GNU General Public 196License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 197EOF 198 199# Generate a control file 200cat <<EOF > debian/control 201Source: linux-upstream 202Section: kernel 203Priority: optional 204Maintainer: $maintainer 205Standards-Version: 3.8.4 206Homepage: http://www.kernel.org/ 207EOF 208 209if [ "$ARCH" = "um" ]; then 210 cat <<EOF >> debian/control 211 212Package: $packagename 213Provides: linux-image, linux-image-2.6, linux-modules-$version 214Architecture: any 215Description: User Mode Linux kernel, version $version 216 User-mode Linux is a port of the Linux kernel to its own system call 217 interface. It provides a kind of virtual machine, which runs Linux 218 as a user process under another Linux kernel. This is useful for 219 kernel development, sandboxes, jails, experimentation, and 220 many other things. 221 . 222 This package contains the Linux kernel, modules and corresponding other 223 files, version: $version. 224EOF 225 226else 227 cat <<EOF >> debian/control 228 229Package: $packagename 230Provides: linux-image, linux-image-2.6, linux-modules-$version 231Suggests: $fwpackagename 232Architecture: any 233Description: Linux kernel, version $version 234 This package contains the Linux kernel, modules and corresponding other 235 files, version: $version. 236EOF 237 238fi 239 240# Build header package 241(cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > /tmp/files$$) 242(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> /tmp/files$$) 243(cd $objtree; find .config Module.symvers include scripts -type f >> /tmp/objfiles$$) 244destdir=$kernel_headers_dir/usr/src/linux-headers-$version 245mkdir -p "$destdir" 246(cd $srctree; tar -c -f - -T /tmp/files$$) | (cd $destdir; tar -xf -) 247(cd $objtree; tar -c -f - -T /tmp/objfiles$$) | (cd $destdir; tar -xf -) 248rm -f /tmp/files$$ /tmp/objfiles$$ 249arch=$(dpkg --print-architecture) 250 251cat <<EOF >> debian/control 252 253Package: $kernel_headers_packagename 254Provides: linux-headers, linux-headers-2.6 255Architecture: $arch 256Description: Linux kernel headers for $KERNELRELEASE on $arch 257 This package provides kernel header files for $KERNELRELEASE on $arch 258 . 259 This is useful for people who need to build external modules 260EOF 261 262create_package "$kernel_headers_packagename" "$kernel_headers_dir" 263 264# Do we have firmware? Move it out of the way and build it into a package. 265if [ -e "$tmpdir/lib/firmware" ]; then 266 mv "$tmpdir/lib/firmware" "$fwdir/lib/" 267 268 cat <<EOF >> debian/control 269 270Package: $fwpackagename 271Architecture: all 272Description: Linux kernel firmware, version $version 273 This package contains firmware from the Linux kernel, version $version. 274EOF 275 276 create_package "$fwpackagename" "$fwdir" 277fi 278 279cat <<EOF >> debian/control 280 281Package: $libc_headers_packagename 282Section: devel 283Provides: linux-kernel-headers 284Architecture: any 285Description: Linux support headers for userspace development 286 This package provides userspaces headers from the Linux kernel. These headers 287 are used by the installed headers for GNU glibc and other system libraries. 288EOF 289 290create_package "$libc_headers_packagename" "$libc_headers_dir" 291create_package "$packagename" "$tmpdir" 292 293exit 0 294