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/firmware/$version/" "$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"
 100mkdir -p "$kernel_headers_dir/lib/modules/$version/"
 101if [ "$ARCH" = "um" ] ; then
 102        mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
 103fi
 104
 105# Build and install the kernel
 106if [ "$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"
 112else 
 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"
 118        else
 119                cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
 120        fi
 121fi
 122
 123if grep -q '^CONFIG_MODULES=y' .config ; then
 124        INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
 125        rm -f "$tmpdir/lib/modules/$version/build"
 126        rm -f "$tmpdir/lib/modules/$version/source"
 127        if [ "$ARCH" = "um" ] ; then
 128                mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
 129                rmdir "$tmpdir/lib/modules/$version"
 130        fi
 131fi
 132
 133if [ "$ARCH" != "um" ]; then
 134        $MAKE headers_check KBUILD_SRC=
 135        $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
 136fi
 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
 141debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
 142for script in postinst postrm preinst prerm ; do
 143        mkdir -p "$tmpdir$debhookdir/$script.d"
 144        cat <<EOF > "$tmpdir/DEBIAN/$script"
 145#!/bin/sh
 146
 147set -e
 148
 149# Pass maintainer script parameters to hook scripts
 150export DEB_MAINT_PARAMS="\$*"
 151
 152test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
 153exit 0
 154EOF
 155        chmod 755 "$tmpdir/DEBIAN/$script"
 156done
 157
 158# Try to determine maintainer and email values
 159if [ -n "$DEBEMAIL" ]; then
 160       email=$DEBEMAIL
 161elif [ -n "$EMAIL" ]; then
 162       email=$EMAIL
 163else
 164       email=$(id -nu)@$(hostname -f)
 165fi
 166if [ -n "$DEBFULLNAME" ]; then
 167       name=$DEBFULLNAME
 168elif [ -n "$NAME" ]; then
 169       name=$NAME
 170else
 171       name="Anonymous"
 172fi
 173maintainer="$name <$email>"
 174
 175# Generate a simple changelog template
 176cat <<EOF > debian/changelog
 177linux-upstream ($packageversion) unstable; urgency=low
 178
 179  * Custom built Linux kernel.
 180
 181 -- $maintainer  $(date -R)
 182EOF
 183
 184# Generate copyright file
 185cat <<EOF > debian/copyright
 186This is a packacked upstream version of the Linux kernel.
 187
 188The sources may be found at most Linux ftp sites, including:
 189ftp://ftp.kernel.org/pub/linux/kernel
 190
 191Copyright: 1991 - 2009 Linus Torvalds and others.
 192
 193The git repository for mainline kernel development is at:
 194git://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
 200On Debian GNU/Linux systems, the complete text of the GNU General Public
 201License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
 202EOF
 203
 204# Generate a control file
 205cat <<EOF > debian/control
 206Source: linux-upstream
 207Section: kernel
 208Priority: optional
 209Maintainer: $maintainer
 210Standards-Version: 3.8.4
 211Homepage: http://www.kernel.org/
 212EOF
 213
 214if [ "$ARCH" = "um" ]; then
 215        cat <<EOF >> debian/control
 216
 217Package: $packagename
 218Provides: linux-image, linux-image-2.6, linux-modules-$version
 219Architecture: any
 220Description: 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.
 229EOF
 230
 231else
 232        cat <<EOF >> debian/control
 233
 234Package: $packagename
 235Provides: linux-image, linux-image-2.6, linux-modules-$version
 236Suggests: $fwpackagename
 237Architecture: any
 238Description: Linux kernel, version $version
 239 This package contains the Linux kernel, modules and corresponding other
 240 files, version: $version.
 241EOF
 242
 243fi
 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")
 249destdir=$kernel_headers_dir/usr/src/linux-headers-$version
 250mkdir -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 -)
 253ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
 254rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
 255arch=$(dpkg --print-architecture)
 256
 257cat <<EOF >> debian/control
 258
 259Package: $kernel_headers_packagename
 260Provides: linux-headers, linux-headers-2.6
 261Architecture: $arch
 262Description: Linux kernel headers for $KERNELRELEASE on $arch
 263 This package provides kernel header files for $KERNELRELEASE on $arch
 264 .
 265 This is useful for people who need to build external modules
 266EOF
 267
 268# Do we have firmware? Move it out of the way and build it into a package.
 269if [ -e "$tmpdir/lib/firmware" ]; then
 270        mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
 271        rmdir "$tmpdir/lib/firmware"
 272
 273        cat <<EOF >> debian/control
 274
 275Package: $fwpackagename
 276Architecture: all
 277Description: Linux kernel firmware, version $version
 278 This package contains firmware from the Linux kernel, version $version.
 279EOF
 280
 281        create_package "$fwpackagename" "$fwdir"
 282fi
 283
 284cat <<EOF >> debian/control
 285
 286Package: $libc_headers_packagename
 287Section: devel
 288Provides: linux-kernel-headers
 289Architecture: any
 290Description: Linux support headers for userspace development
 291 This package provides userspaces headers from the Linux kernel.  These headers
 292 are used by the installed headers for GNU glibc and other system libraries.
 293EOF
 294
 295if [ "$ARCH" != "um" ]; then
 296        create_package "$kernel_headers_packagename" "$kernel_headers_dir"
 297        create_package "$libc_headers_packagename" "$libc_headers_dir"
 298fi
 299
 300create_package "$packagename" "$tmpdir"
 301
 302exit 0
 303
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.