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 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 $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