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