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