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