linux/scripts/package/builddeb
<<
>>
Prefs
   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