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=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 -isp $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 ( 156 cd $tmpdir 157 for module in $(find lib/modules/ -name *.ko); do 158 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) 159 # only keep debug symbols in the debug file 160 $OBJCOPY --only-keep-debug $module $dbg_dir/usr/lib/debug/$module 161 # strip original module from debug symbols 162 $OBJCOPY --strip-debug $module 163 # then add a link to those 164 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $module 165 done 166 ) 167 fi 168fi 169 170if [ "$ARCH" != "um" ]; then 171 $MAKE headers_check KBUILD_SRC= 172 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" 173fi 174 175# Install the maintainer scripts 176# Note: hook scripts under /etc/kernel are also executed by official Debian 177# kernel packages, as well as kernel packages built using make-kpkg. 178# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 179# so do we; recent versions of dracut and initramfs-tools will obey this. 180debhookdir=${KDEB_HOOKDIR:-/etc/kernel} 181if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then 182 want_initrd=Yes 183else 184 want_initrd=No 185fi 186for script in postinst postrm preinst prerm ; do 187 mkdir -p "$tmpdir$debhookdir/$script.d" 188 cat <<EOF > "$tmpdir/DEBIAN/$script" 189#!/bin/sh 190 191set -e 192 193# Pass maintainer script parameters to hook scripts 194export DEB_MAINT_PARAMS="\$*" 195 196# Tell initramfs builder whether it's wanted 197export INITRD=$want_initrd 198 199test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d 200exit 0 201EOF 202 chmod 755 "$tmpdir/DEBIAN/$script" 203done 204 205# Try to determine maintainer and email values 206if [ -n "$DEBEMAIL" ]; then 207 email=$DEBEMAIL 208elif [ -n "$EMAIL" ]; then 209 email=$EMAIL 210else 211 email=$(id -nu)@$(hostname -f) 212fi 213if [ -n "$DEBFULLNAME" ]; then 214 name=$DEBFULLNAME 215elif [ -n "$NAME" ]; then 216 name=$NAME 217else 218 name="Anonymous" 219fi 220maintainer="$name <$email>" 221 222# Generate a simple changelog template 223cat <<EOF > debian/changelog 224linux-upstream ($packageversion) unstable; urgency=low 225 226 * Custom built Linux kernel. 227 228 -- $maintainer $(date -R) 229EOF 230 231# Generate copyright file 232cat <<EOF > debian/copyright 233This is a packacked upstream version of the Linux kernel. 234 235The sources may be found at most Linux ftp sites, including: 236ftp://ftp.kernel.org/pub/linux/kernel 237 238Copyright: 1991 - 2009 Linus Torvalds and others. 239 240The git repository for mainline kernel development is at: 241git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 242 243 This program is free software; you can redistribute it and/or modify 244 it under the terms of the GNU General Public License as published by 245 the Free Software Foundation; version 2 dated June, 1991. 246 247On Debian GNU/Linux systems, the complete text of the GNU General Public 248License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 249EOF 250 251# Generate a control file 252cat <<EOF > debian/control 253Source: linux-upstream 254Section: kernel 255Priority: optional 256Maintainer: $maintainer 257Standards-Version: 3.8.4 258Homepage: http://www.kernel.org/ 259EOF 260 261if [ "$ARCH" = "um" ]; then 262 cat <<EOF >> debian/control 263 264Package: $packagename 265Provides: linux-image, linux-image-2.6, linux-modules-$version 266Architecture: any 267Description: User Mode Linux kernel, version $version 268 User-mode Linux is a port of the Linux kernel to its own system call 269 interface. It provides a kind of virtual machine, which runs Linux 270 as a user process under another Linux kernel. This is useful for 271 kernel development, sandboxes, jails, experimentation, and 272 many other things. 273 . 274 This package contains the Linux kernel, modules and corresponding other 275 files, version: $version. 276EOF 277 278else 279 cat <<EOF >> debian/control 280 281Package: $packagename 282Provides: linux-image, linux-image-2.6, linux-modules-$version 283Suggests: $fwpackagename 284Architecture: any 285Description: Linux kernel, version $version 286 This package contains the Linux kernel, modules and corresponding other 287 files, version: $version. 288EOF 289 290fi 291 292# Build kernel header package 293(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" 294(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" 295(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" 296(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" 297(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" 298destdir=$kernel_headers_dir/usr/src/linux-headers-$version 299mkdir -p "$destdir" 300(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) 301(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) 302(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 303ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 304rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 305 306cat <<EOF >> debian/control 307 308Package: $kernel_headers_packagename 309Provides: linux-headers, linux-headers-2.6 310Architecture: any 311Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 312 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 313 . 314 This is useful for people who need to build external modules 315EOF 316 317# Do we have firmware? Move it out of the way and build it into a package. 318if [ -e "$tmpdir/lib/firmware" ]; then 319 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" 320 rmdir "$tmpdir/lib/firmware" 321 322 cat <<EOF >> debian/control 323 324Package: $fwpackagename 325Architecture: all 326Description: Linux kernel firmware, version $version 327 This package contains firmware from the Linux kernel, version $version. 328EOF 329 330 create_package "$fwpackagename" "$fwdir" 331fi 332 333cat <<EOF >> debian/control 334 335Package: $libc_headers_packagename 336Section: devel 337Provides: linux-kernel-headers 338Architecture: any 339Description: Linux support headers for userspace development 340 This package provides userspaces headers from the Linux kernel. These headers 341 are used by the installed headers for GNU glibc and other system libraries. 342EOF 343 344if [ "$ARCH" != "um" ]; then 345 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 346 create_package "$libc_headers_packagename" "$libc_headers_dir" 347fi 348 349create_package "$packagename" "$tmpdir" 350 351if [ -n "$BUILD_DEBUG" ] ; then 352 # Build debug package 353 # Different tools want the image in different locations 354 # perf 355 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 356 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 357 # systemtap 358 mkdir -p $dbg_dir/usr/lib/debug/boot/ 359 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 360 # kdump-tools 361 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 362 363 cat <<EOF >> debian/control 364 365Package: $dbg_packagename 366Section: debug 367Provides: linux-debug, linux-debug-$version 368Architecture: any 369Description: Linux kernel debugging symbols for $version 370 This package will come in handy if you need to debug the kernel. It provides 371 all the necessary debug symbols for the kernel and its modules. 372EOF 373 374 create_package "$dbg_packagename" "$dbg_dir" 375fi 376 377exit 0 378