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 mkdir -m 755 -p "$pdir/DEBIAN" 19 mkdir -p "$pdir/usr/share/doc/$pname" 20 cp debian/copyright "$pdir/usr/share/doc/$pname/" 21 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 22 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 23 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 24 | xargs -r0 md5sum > DEBIAN/md5sums" 25 26 # Fix ownership and permissions 27 chown -R root:root "$pdir" 28 chmod -R go-w "$pdir" 29 30 # Create the package 31 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" 32 dpkg --build "$pdir" .. 33} 34 35set_debarch() { 36 # Attempt to find the correct Debian architecture 37 case "$UTS_MACHINE" in 38 i386|ia64|alpha) 39 debarch="$UTS_MACHINE" ;; 40 x86_64) 41 debarch=amd64 ;; 42 sparc*) 43 debarch=sparc ;; 44 s390*) 45 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;; 46 ppc*) 47 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;; 48 parisc*) 49 debarch=hppa ;; 50 mips*) 51 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; 52 arm64) 53 debarch=arm64 ;; 54 arm*) 55 if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then 56 if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then 57 debarch=armhf 58 else 59 debarch=armel 60 fi 61 else 62 debarch=arm 63 fi 64 ;; 65 *) 66 debarch=$(dpkg --print-architecture) 67 echo "" >&2 68 echo "** ** ** WARNING ** ** **" >&2 69 echo "" >&2 70 echo "Your architecture doesn't have it's equivalent" >&2 71 echo "Debian userspace architecture defined!" >&2 72 echo "Falling back to using your current userspace instead!" >&2 73 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 74 echo "" >&2 75 esac 76 if [ -n "$KBUILD_DEBARCH" ] ; then 77 debarch="$KBUILD_DEBARCH" 78 fi 79 forcearch="-DArchitecture=$debarch" 80 81} 82 83# Some variables and settings used throughout the script 84version=$KERNELRELEASE 85revision=$(cat .version) 86if [ -n "$KDEB_PKGVERSION" ]; then 87 packageversion=$KDEB_PKGVERSION 88else 89 packageversion=$version-$revision 90fi 91sourcename=$KDEB_SOURCENAME 92tmpdir="$objtree/debian/tmp" 93fwdir="$objtree/debian/fwtmp" 94kernel_headers_dir="$objtree/debian/hdrtmp" 95libc_headers_dir="$objtree/debian/headertmp" 96dbg_dir="$objtree/debian/dbgtmp" 97packagename=linux-image-$version 98fwpackagename=linux-firmware-image-$version 99kernel_headers_packagename=linux-headers-$version 100libc_headers_packagename=linux-libc-dev 101dbg_packagename=$packagename-dbg 102debarch= 103forcearch= 104set_debarch 105 106if [ "$ARCH" = "um" ] ; then 107 packagename=user-mode-linux-$version 108fi 109 110# Not all arches have the same installed path in debian 111# XXX: have each arch Makefile export a variable of the canonical image install 112# path instead 113case $ARCH in 114um) 115 installed_image_path="usr/bin/linux-$version" 116 ;; 117parisc|mips|powerpc) 118 installed_image_path="boot/vmlinux-$version" 119 ;; 120*) 121 installed_image_path="boot/vmlinuz-$version" 122esac 123 124BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" 125 126# Setup the directory structure 127rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files 128mkdir -m 755 -p "$tmpdir/DEBIAN" 129mkdir -p "$tmpdir/lib" "$tmpdir/boot" 130mkdir -p "$fwdir/lib/firmware/$version/" 131mkdir -p "$kernel_headers_dir/lib/modules/$version/" 132 133# Build and install the kernel 134if [ "$ARCH" = "um" ] ; then 135 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" 136 $MAKE linux 137 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" 138 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" 139 gzip "$tmpdir/usr/share/doc/$packagename/config" 140else 141 cp System.map "$tmpdir/boot/System.map-$version" 142 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" 143fi 144# Not all arches include the boot path in KBUILD_IMAGE 145if [ -e $KBUILD_IMAGE ]; then 146 cp $KBUILD_IMAGE "$tmpdir/$installed_image_path" 147else 148 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path" 149fi 150 151if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then 152 # Only some architectures with OF support have this target 153 if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then 154 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install 155 fi 156fi 157 158if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then 159 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install 160 rm -f "$tmpdir/lib/modules/$version/build" 161 rm -f "$tmpdir/lib/modules/$version/source" 162 if [ "$ARCH" = "um" ] ; then 163 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 164 rmdir "$tmpdir/lib/modules/$version" 165 fi 166 if [ -n "$BUILD_DEBUG" ] ; then 167 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do 168 module=lib/modules/$module 169 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) 170 # only keep debug symbols in the debug file 171 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module 172 # strip original module from debug symbols 173 $OBJCOPY --strip-debug $tmpdir/$module 174 # then add a link to those 175 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module 176 done 177 178 # resign stripped modules 179 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)" 180 if [ -n "$MODULE_SIG_ALL" ]; then 181 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign 182 fi 183 fi 184fi 185 186if [ "$ARCH" != "um" ]; then 187 $MAKE headers_check KBUILD_SRC= 188 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" 189fi 190 191# Install the maintainer scripts 192# Note: hook scripts under /etc/kernel are also executed by official Debian 193# kernel packages, as well as kernel packages built using make-kpkg. 194# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 195# so do we; recent versions of dracut and initramfs-tools will obey this. 196debhookdir=${KDEB_HOOKDIR:-/etc/kernel} 197if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then 198 want_initrd=Yes 199else 200 want_initrd=No 201fi 202for script in postinst postrm preinst prerm ; do 203 mkdir -p "$tmpdir$debhookdir/$script.d" 204 cat <<EOF > "$tmpdir/DEBIAN/$script" 205#!/bin/sh 206 207set -e 208 209# Pass maintainer script parameters to hook scripts 210export DEB_MAINT_PARAMS="\$*" 211 212# Tell initramfs builder whether it's wanted 213export INITRD=$want_initrd 214 215test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d 216exit 0 217EOF 218 chmod 755 "$tmpdir/DEBIAN/$script" 219done 220 221# Try to determine maintainer and email values 222if [ -n "$DEBEMAIL" ]; then 223 email=$DEBEMAIL 224elif [ -n "$EMAIL" ]; then 225 email=$EMAIL 226else 227 email=$(id -nu)@$(hostname -f 2>/dev/null || hostname) 228fi 229if [ -n "$DEBFULLNAME" ]; then 230 name=$DEBFULLNAME 231elif [ -n "$NAME" ]; then 232 name=$NAME 233else 234 name="Anonymous" 235fi 236maintainer="$name <$email>" 237 238# Try to determine distribution 239if [ -n "$KDEB_CHANGELOG_DIST" ]; then 240 distribution=$KDEB_CHANGELOG_DIST 241elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then 242 : # nothing to do in this case 243else 244 distribution="unstable" 245 echo >&2 "Using default distribution of 'unstable' in the changelog" 246 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" 247fi 248 249# Generate a simple changelog template 250cat <<EOF > debian/changelog 251$sourcename ($packageversion) $distribution; urgency=low 252 253 * Custom built Linux kernel. 254 255 -- $maintainer $(date -R) 256EOF 257 258# Generate copyright file 259cat <<EOF > debian/copyright 260This is a packacked upstream version of the Linux kernel. 261 262The sources may be found at most Linux ftp sites, including: 263ftp://ftp.kernel.org/pub/linux/kernel 264 265Copyright: 1991 - 2015 Linus Torvalds and others. 266 267The git repository for mainline kernel development is at: 268git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 269 270 This program is free software; you can redistribute it and/or modify 271 it under the terms of the GNU General Public License as published by 272 the Free Software Foundation; version 2 dated June, 1991. 273 274On Debian GNU/Linux systems, the complete text of the GNU General Public 275License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 276EOF 277 278 279build_depends="bc, kmod, cpio " 280 281# Generate a control file 282cat <<EOF > debian/control 283Source: $sourcename 284Section: kernel 285Priority: optional 286Maintainer: $maintainer 287Build-Depends: $build_depends 288Standards-Version: 3.8.4 289Homepage: http://www.kernel.org/ 290EOF 291 292if [ "$ARCH" = "um" ]; then 293 cat <<EOF >> debian/control 294 295Package: $packagename 296Provides: linux-image, linux-image-2.6, linux-modules-$version 297Architecture: any 298Description: User Mode Linux kernel, version $version 299 User-mode Linux is a port of the Linux kernel to its own system call 300 interface. It provides a kind of virtual machine, which runs Linux 301 as a user process under another Linux kernel. This is useful for 302 kernel development, sandboxes, jails, experimentation, and 303 many other things. 304 . 305 This package contains the Linux kernel, modules and corresponding other 306 files, version: $version. 307EOF 308 309else 310 cat <<EOF >> debian/control 311 312Package: $packagename 313Provides: linux-image, linux-image-2.6, linux-modules-$version 314Suggests: $fwpackagename 315Architecture: any 316Description: Linux kernel, version $version 317 This package contains the Linux kernel, modules and corresponding other 318 files, version: $version. 319EOF 320 321fi 322 323# Build kernel header package 324(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" 325(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" 326(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" 327(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" 328(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" 329destdir=$kernel_headers_dir/usr/src/linux-headers-$version 330mkdir -p "$destdir" 331(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) 332(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) 333(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 334ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 335rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 336 337cat <<EOF >> debian/control 338 339Package: $kernel_headers_packagename 340Provides: linux-headers, linux-headers-2.6 341Architecture: any 342Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 343 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 344 . 345 This is useful for people who need to build external modules 346EOF 347 348# Do we have firmware? Move it out of the way and build it into a package. 349if [ -e "$tmpdir/lib/firmware" ]; then 350 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" 351 rmdir "$tmpdir/lib/firmware" 352 353 cat <<EOF >> debian/control 354 355Package: $fwpackagename 356Architecture: all 357Description: Linux kernel firmware, version $version 358 This package contains firmware from the Linux kernel, version $version. 359EOF 360 361 create_package "$fwpackagename" "$fwdir" 362fi 363 364cat <<EOF >> debian/control 365 366Package: $libc_headers_packagename 367Section: devel 368Provides: linux-kernel-headers 369Architecture: any 370Description: Linux support headers for userspace development 371 This package provides userspaces headers from the Linux kernel. These headers 372 are used by the installed headers for GNU glibc and other system libraries. 373EOF 374 375if [ "$ARCH" != "um" ]; then 376 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 377 create_package "$libc_headers_packagename" "$libc_headers_dir" 378fi 379 380create_package "$packagename" "$tmpdir" 381 382if [ -n "$BUILD_DEBUG" ] ; then 383 # Build debug package 384 # Different tools want the image in different locations 385 # perf 386 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 387 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 388 # systemtap 389 mkdir -p $dbg_dir/usr/lib/debug/boot/ 390 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 391 # kdump-tools 392 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 393 394 cat <<EOF >> debian/control 395 396Package: $dbg_packagename 397Section: debug 398Provides: linux-debug, linux-debug-$version 399Architecture: any 400Description: Linux kernel debugging symbols for $version 401 This package will come in handy if you need to debug the kernel. It provides 402 all the necessary debug symbols for the kernel and its modules. 403EOF 404 405 create_package "$dbg_packagename" "$dbg_dir" 406fi 407 408if [ "x$1" = "xdeb-pkg" ] 409then 410 cat <<EOF > debian/rules 411#!/usr/bin/make -f 412 413build: 414 \$(MAKE) 415 416binary-arch: 417 \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg 418 419clean: 420 rm -rf debian/*tmp debian/files 421 mv debian/ debian.backup # debian/ might be cleaned away 422 \$(MAKE) clean 423 mv debian.backup debian 424 425binary: binary-arch 426EOF 427 mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz 428 tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control} 429 dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \ 430 -b / ../${sourcename}_${version}.orig.tar.gz ../${sourcename}_${packageversion}.debian.tar.gz 431 mv ${sourcename}_${packageversion}*dsc .. 432 dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes 433else 434 dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes 435fi 436 437exit 0 438