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