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# 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 kernel 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 $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" 294(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" 295(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" 296destdir=$kernel_headers_dir/usr/src/linux-headers-$version 297mkdir -p "$destdir" 298(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) 299(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) 300(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 301ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 302rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 303 304cat <<EOF >> debian/control 305 306Package: $kernel_headers_packagename 307Provides: linux-headers, linux-headers-2.6 308Architecture: any 309Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 310 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 311 . 312 This is useful for people who need to build external modules 313EOF 314 315# Do we have firmware? Move it out of the way and build it into a package. 316if [ -e "$tmpdir/lib/firmware" ]; then 317 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" 318 rmdir "$tmpdir/lib/firmware" 319 320 cat <<EOF >> debian/control 321 322Package: $fwpackagename 323Architecture: all 324Description: Linux kernel firmware, version $version 325 This package contains firmware from the Linux kernel, version $version. 326EOF 327 328 create_package "$fwpackagename" "$fwdir" 329fi 330 331cat <<EOF >> debian/control 332 333Package: $libc_headers_packagename 334Section: devel 335Provides: linux-kernel-headers 336Architecture: any 337Description: Linux support headers for userspace development 338 This package provides userspaces headers from the Linux kernel. These headers 339 are used by the installed headers for GNU glibc and other system libraries. 340EOF 341 342if [ "$ARCH" != "um" ]; then 343 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 344 create_package "$libc_headers_packagename" "$libc_headers_dir" 345fi 346 347create_package "$packagename" "$tmpdir" 348 349if [ -n "$BUILD_DEBUG" ] ; then 350 # Build debug package 351 # Different tools want the image in different locations 352 # perf 353 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 354 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 355 # systemtap 356 mkdir -p $dbg_dir/usr/lib/debug/boot/ 357 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 358 # kdump-tools 359 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 360 361 cat <<EOF >> debian/control 362 363Package: $dbg_packagename 364Section: debug 365Provides: linux-debug, linux-debug-$version 366Architecture: any 367Description: Linux kernel debugging symbols for $version 368 This package will come in handy if you need to debug the kernel. It provides 369 all the necessary debug symbols for the kernel and its modules. 370EOF 371 372 create_package "$dbg_packagename" "$dbg_dir" 373fi 374 375exit 0 376