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