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$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
  39        ppc*)
  40                debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
  41        parisc*)
  42                debarch=hppa ;;
  43        mips*)
  44                debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
  45        arm64)
  46                debarch=arm64 ;;
  47        arm*)
  48                debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
  49        *)
  50                echo "" >&2
  51                echo "** ** **  WARNING  ** ** **" >&2
  52                echo "" >&2
  53                echo "Your architecture doesn't have it's equivalent" >&2
  54                echo "Debian userspace architecture defined!" >&2
  55                echo "Falling back to using your current userspace instead!" >&2
  56                echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
  57                echo "" >&2
  58        esac
  59        if [ -n "$KBUILD_DEBARCH" ] ; then
  60                debarch="$KBUILD_DEBARCH"
  61        fi
  62        if [ -n "$debarch" ] ; then
  63                forcearch="-DArchitecture=$debarch"
  64        fi
  65
  66        # Create the package
  67        dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir"
  68        dpkg --build "$pdir" ..
  69}
  70
  71# Some variables and settings used throughout the script
  72version=$KERNELRELEASE
  73revision=$(cat .version)
  74if [ -n "$KDEB_PKGVERSION" ]; then
  75        packageversion=$KDEB_PKGVERSION
  76else
  77        packageversion=$version-$revision
  78fi
  79tmpdir="$objtree/debian/tmp"
  80fwdir="$objtree/debian/fwtmp"
  81kernel_headers_dir="$objtree/debian/hdrtmp"
  82libc_headers_dir="$objtree/debian/headertmp"
  83dbg_dir="$objtree/debian/dbgtmp"
  84packagename=linux-image-$version
  85fwpackagename=linux-firmware-image-$version
  86kernel_headers_packagename=linux-headers-$version
  87libc_headers_packagename=linux-libc-dev
  88dbg_packagename=$packagename-dbg
  89
  90if [ "$ARCH" = "um" ] ; then
  91        packagename=user-mode-linux-$version
  92fi
  93
  94# Not all arches have the same installed path in debian
  95# XXX: have each arch Makefile export a variable of the canonical image install
  96# path instead
  97case $ARCH in
  98um)
  99        installed_image_path="usr/bin/linux-$version"
 100        ;;
 101parisc|mips|powerpc)
 102        installed_image_path="boot/vmlinux-$version"
 103        ;;
 104*)
 105        installed_image_path="boot/vmlinuz-$version"
 106esac
 107
 108BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
 109
 110# Setup the directory structure
 111rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
 112mkdir -m 755 -p "$tmpdir/DEBIAN"
 113mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
 114mkdir -m 755 -p "$fwdir/DEBIAN"
 115mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
 116mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
 117mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
 118mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
 119mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
 120mkdir -p "$kernel_headers_dir/lib/modules/$version/"
 121if [ "$ARCH" = "um" ] ; then
 122        mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
 123fi
 124if [ -n "$BUILD_DEBUG" ] ; then
 125        mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
 126        mkdir -m 755 -p "$dbg_dir/DEBIAN"
 127fi
 128
 129# Build and install the kernel
 130if [ "$ARCH" = "um" ] ; then
 131        $MAKE linux
 132        cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
 133        cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
 134        gzip "$tmpdir/usr/share/doc/$packagename/config"
 135else
 136        cp System.map "$tmpdir/boot/System.map-$version"
 137        cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
 138fi
 139# Not all arches include the boot path in KBUILD_IMAGE
 140if [ -e $KBUILD_IMAGE ]; then
 141        cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
 142else
 143        cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
 144fi
 145
 146if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
 147        INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
 148        rm -f "$tmpdir/lib/modules/$version/build"
 149        rm -f "$tmpdir/lib/modules/$version/source"
 150        if [ "$ARCH" = "um" ] ; then
 151                mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
 152                rmdir "$tmpdir/lib/modules/$version"
 153        fi
 154        if [ -n "$BUILD_DEBUG" ] ; then
 155                for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
 156                        module=lib/modules/$module
 157                        mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
 158                        # only keep debug symbols in the debug file
 159                        $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
 160                        # strip original module from debug symbols
 161                        $OBJCOPY --strip-debug $tmpdir/$module
 162                        # then add a link to those
 163                        $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
 164                done
 165        fi
 166fi
 167
 168if [ "$ARCH" != "um" ]; then
 169        $MAKE headers_check KBUILD_SRC=
 170        $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
 171fi
 172
 173# Install the maintainer scripts
 174# Note: hook scripts under /etc/kernel are also executed by official Debian
 175# kernel packages, as well as kernel packages built using make-kpkg.
 176# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
 177# so do we; recent versions of dracut and initramfs-tools will obey this.
 178debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
 179if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
 180        want_initrd=Yes
 181else
 182        want_initrd=No
 183fi
 184for script in postinst postrm preinst prerm ; do
 185        mkdir -p "$tmpdir$debhookdir/$script.d"
 186        cat <<EOF > "$tmpdir/DEBIAN/$script"
 187#!/bin/sh
 188
 189set -e
 190
 191# Pass maintainer script parameters to hook scripts
 192export DEB_MAINT_PARAMS="\$*"
 193
 194# Tell initramfs builder whether it's wanted
 195export INITRD=$want_initrd
 196
 197test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
 198exit 0
 199EOF
 200        chmod 755 "$tmpdir/DEBIAN/$script"
 201done
 202
 203# Try to determine maintainer and email values
 204if [ -n "$DEBEMAIL" ]; then
 205       email=$DEBEMAIL
 206elif [ -n "$EMAIL" ]; then
 207       email=$EMAIL
 208else
 209       email=$(id -nu)@$(hostname -f)
 210fi
 211if [ -n "$DEBFULLNAME" ]; then
 212       name=$DEBFULLNAME
 213elif [ -n "$NAME" ]; then
 214       name=$NAME
 215else
 216       name="Anonymous"
 217fi
 218maintainer="$name <$email>"
 219
 220# Try to determine distribution
 221if [ -n "$KDEB_CHANGELOG_DIST" ]; then
 222        distribution=$KDEB_CHANGELOG_DIST
 223elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
 224        : # nothing to do in this case
 225else
 226        distribution="unstable"
 227        echo >&2 "Using default distribution of 'unstable' in the changelog"
 228        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
 229fi
 230
 231# Generate a simple changelog template
 232cat <<EOF > debian/changelog
 233linux-upstream ($packageversion) $distribution; urgency=low
 234
 235  * Custom built Linux kernel.
 236
 237 -- $maintainer  $(date -R)
 238EOF
 239
 240# Generate copyright file
 241cat <<EOF > debian/copyright
 242This is a packacked upstream version of the Linux kernel.
 243
 244The sources may be found at most Linux ftp sites, including:
 245ftp://ftp.kernel.org/pub/linux/kernel
 246
 247Copyright: 1991 - 2015 Linus Torvalds and others.
 248
 249The git repository for mainline kernel development is at:
 250git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
 251
 252    This program is free software; you can redistribute it and/or modify
 253    it under the terms of the GNU General Public License as published by
 254    the Free Software Foundation; version 2 dated June, 1991.
 255
 256On Debian GNU/Linux systems, the complete text of the GNU General Public
 257License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
 258EOF
 259
 260# Generate a control file
 261cat <<EOF > debian/control
 262Source: linux-upstream
 263Section: kernel
 264Priority: optional
 265Maintainer: $maintainer
 266Standards-Version: 3.8.4
 267Homepage: http://www.kernel.org/
 268EOF
 269
 270if [ "$ARCH" = "um" ]; then
 271        cat <<EOF >> debian/control
 272
 273Package: $packagename
 274Provides: linux-image, linux-image-2.6, linux-modules-$version
 275Architecture: any
 276Description: User Mode Linux kernel, version $version
 277 User-mode Linux is a port of the Linux kernel to its own system call
 278 interface.  It provides a kind of virtual machine, which runs Linux
 279 as a user process under another Linux kernel.  This is useful for
 280 kernel development, sandboxes, jails, experimentation, and
 281 many other things.
 282 .
 283 This package contains the Linux kernel, modules and corresponding other
 284 files, version: $version.
 285EOF
 286
 287else
 288        cat <<EOF >> debian/control
 289
 290Package: $packagename
 291Provides: linux-image, linux-image-2.6, linux-modules-$version
 292Suggests: $fwpackagename
 293Architecture: any
 294Description: Linux kernel, version $version
 295 This package contains the Linux kernel, modules and corresponding other
 296 files, version: $version.
 297EOF
 298
 299fi
 300
 301# Build kernel header package
 302(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
 303(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
 304(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
 305(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
 306(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
 307destdir=$kernel_headers_dir/usr/src/linux-headers-$version
 308mkdir -p "$destdir"
 309(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
 310(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
 311(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
 312ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
 313rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
 314
 315cat <<EOF >> debian/control
 316
 317Package: $kernel_headers_packagename
 318Provides: linux-headers, linux-headers-2.6
 319Architecture: any
 320Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
 321 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
 322 .
 323 This is useful for people who need to build external modules
 324EOF
 325
 326# Do we have firmware? Move it out of the way and build it into a package.
 327if [ -e "$tmpdir/lib/firmware" ]; then
 328        mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
 329        rmdir "$tmpdir/lib/firmware"
 330
 331        cat <<EOF >> debian/control
 332
 333Package: $fwpackagename
 334Architecture: all
 335Description: Linux kernel firmware, version $version
 336 This package contains firmware from the Linux kernel, version $version.
 337EOF
 338
 339        create_package "$fwpackagename" "$fwdir"
 340fi
 341
 342cat <<EOF >> debian/control
 343
 344Package: $libc_headers_packagename
 345Section: devel
 346Provides: linux-kernel-headers
 347Architecture: any
 348Description: Linux support headers for userspace development
 349 This package provides userspaces headers from the Linux kernel.  These headers
 350 are used by the installed headers for GNU glibc and other system libraries.
 351EOF
 352
 353if [ "$ARCH" != "um" ]; then
 354        create_package "$kernel_headers_packagename" "$kernel_headers_dir"
 355        create_package "$libc_headers_packagename" "$libc_headers_dir"
 356fi
 357
 358create_package "$packagename" "$tmpdir"
 359
 360if [ -n "$BUILD_DEBUG" ] ; then
 361        # Build debug package
 362        # Different tools want the image in different locations
 363        # perf
 364        mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
 365        cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
 366        # systemtap
 367        mkdir -p $dbg_dir/usr/lib/debug/boot/
 368        ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
 369        # kdump-tools
 370        ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
 371
 372        cat <<EOF >> debian/control
 373
 374Package: $dbg_packagename
 375Section: debug
 376Provides: linux-debug, linux-debug-$version
 377Architecture: any
 378Description: Linux kernel debugging symbols for $version
 379 This package will come in handy if you need to debug the kernel. It provides
 380 all the necessary debug symbols for the kernel and its modules.
 381EOF
 382
 383        create_package "$dbg_packagename" "$dbg_dir"
 384fi
 385
 386exit 0
 387