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 || true) ;; 45 arm*) 46 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;; 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 -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -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. 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# Generate a simple changelog template 221cat <<EOF > debian/changelog 222linux-upstream ($packageversion) unstable; urgency=low 223 224 * Custom built Linux kernel. 225 226 -- $maintainer $(date -R) 227EOF 228 229# Generate copyright file 230cat <<EOF > debian/copyright 231This is a packacked upstream version of the Linux kernel. 232 233The sources may be found at most Linux ftp sites, including: 234ftp://ftp.kernel.org/pub/linux/kernel 235 236Copyright: 1991 - 2009 Linus Torvalds and others. 237 238The git repository for mainline kernel development is at: 239git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 240 241 This program is free software; you can redistribute it and/or modify 242 it under the terms of the GNU General Public License as published by 243 the Free Software Foundation; version 2 dated June, 1991. 244 245On Debian GNU/Linux systems, the complete text of the GNU General Public 246License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 247EOF 248 249# Generate a control file 250cat <<EOF > debian/control 251Source: linux-upstream 252Section: kernel 253Priority: optional 254Maintainer: $maintainer 255Standards-Version: 3.8.4 256Homepage: http://www.kernel.org/ 257EOF 258 259if [ "$ARCH" = "um" ]; then 260 cat <<EOF >> debian/control 261 262Package: $packagename 263Provides: linux-image, linux-image-2.6, linux-modules-$version 264Architecture: any 265Description: User Mode Linux kernel, version $version 266 User-mode Linux is a port of the Linux kernel to its own system call 267 interface. It provides a kind of virtual machine, which runs Linux 268 as a user process under another Linux kernel. This is useful for 269 kernel development, sandboxes, jails, experimentation, and 270 many other things. 271 . 272 This package contains the Linux kernel, modules and corresponding other 273 files, version: $version. 274EOF 275 276else 277 cat <<EOF >> debian/control 278 279Package: $packagename 280Provides: linux-image, linux-image-2.6, linux-modules-$version 281Suggests: $fwpackagename 282Architecture: any 283Description: Linux kernel, version $version 284 This package contains the Linux kernel, modules and corresponding other 285 files, version: $version. 286EOF 287 288fi 289 290# Build header package 291(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles") 292(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles") 293(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles") 294destdir=$kernel_headers_dir/usr/src/linux-headers-$version 295mkdir -p "$destdir" 296(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) 297(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) 298(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 299ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 300rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 301 302cat <<EOF >> debian/control 303 304Package: $kernel_headers_packagename 305Provides: linux-headers, linux-headers-2.6 306Architecture: any 307Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 308 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 309 . 310 This is useful for people who need to build external modules 311EOF 312 313# Do we have firmware? Move it out of the way and build it into a package. 314if [ -e "$tmpdir/lib/firmware" ]; then 315 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" 316 rmdir "$tmpdir/lib/firmware" 317 318 cat <<EOF >> debian/control 319 320Package: $fwpackagename 321Architecture: all 322Description: Linux kernel firmware, version $version 323 This package contains firmware from the Linux kernel, version $version. 324EOF 325 326 create_package "$fwpackagename" "$fwdir" 327fi 328 329cat <<EOF >> debian/control 330 331Package: $libc_headers_packagename 332Section: devel 333Provides: linux-kernel-headers 334Architecture: any 335Description: Linux support headers for userspace development 336 This package provides userspaces headers from the Linux kernel. These headers 337 are used by the installed headers for GNU glibc and other system libraries. 338EOF 339 340if [ "$ARCH" != "um" ]; then 341 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 342 create_package "$libc_headers_packagename" "$libc_headers_dir" 343fi 344 345create_package "$packagename" "$tmpdir" 346 347if [ -n "$BUILD_DEBUG" ] ; then 348 # Build debug package 349 # Different tools want the image in different locations 350 # perf 351 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 352 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 353 # systemtap 354 mkdir -p $dbg_dir/usr/lib/debug/boot/ 355 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 356 # kdump-tools 357 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 358 359 cat <<EOF >> debian/control 360 361Package: $dbg_packagename 362Section: debug 363Provides: linux-debug, linux-debug-$version 364Architecture: any 365Description: Linux kernel debugging symbols for $version 366 This package will come in handy if you need to debug the kernel. It provides 367 all the necessary debug symbols for the kernel and its modules. 368EOF 369 370 create_package "$dbg_packagename" "$dbg_dir" 371fi 372 373exit 0 374