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 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" 335(cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" 336destdir=$kernel_headers_dir/usr/src/linux-headers-$version 337mkdir -p "$destdir" 338(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) 339(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) 340(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 341ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 342rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 343 344cat <<EOF >> debian/control 345 346Package: $kernel_headers_packagename 347Provides: linux-headers, linux-headers-2.6 348Architecture: any 349Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 350 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 351 . 352 This is useful for people who need to build external modules 353EOF 354 355# Do we have firmware? Move it out of the way and build it into a package. 356if [ -e "$tmpdir/lib/firmware" ]; then 357 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" 358 rmdir "$tmpdir/lib/firmware" 359 360 cat <<EOF >> debian/control 361 362Package: $fwpackagename 363Architecture: all 364Description: Linux kernel firmware, version $version 365 This package contains firmware from the Linux kernel, version $version. 366EOF 367 368 create_package "$fwpackagename" "$fwdir" 369fi 370 371cat <<EOF >> debian/control 372 373Package: $libc_headers_packagename 374Section: devel 375Provides: linux-kernel-headers 376Architecture: any 377Description: Linux support headers for userspace development 378 This package provides userspaces headers from the Linux kernel. These headers 379 are used by the installed headers for GNU glibc and other system libraries. 380EOF 381 382if [ "$ARCH" != "um" ]; then 383 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 384 create_package "$libc_headers_packagename" "$libc_headers_dir" 385fi 386 387create_package "$packagename" "$tmpdir" 388 389if [ -n "$BUILD_DEBUG" ] ; then 390 # Build debug package 391 # Different tools want the image in different locations 392 # perf 393 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ 394 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ 395 # systemtap 396 mkdir -p $dbg_dir/usr/lib/debug/boot/ 397 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 398 # kdump-tools 399 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 400 401 cat <<EOF >> debian/control 402 403Package: $dbg_packagename 404Section: debug 405Provides: linux-debug, linux-debug-$version 406Architecture: any 407Description: Linux kernel debugging symbols for $version 408 This package will come in handy if you need to debug the kernel. It provides 409 all the necessary debug symbols for the kernel and its modules. 410EOF 411 412 create_package "$dbg_packagename" "$dbg_dir" 413fi 414 415if [ "x$1" = "xdeb-pkg" ] 416then 417 cat <<EOF > debian/rules 418#!/usr/bin/make -f 419 420build: 421 \$(MAKE) 422 423binary-arch: 424 \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg 425 426clean: 427 rm -rf debian/*tmp debian/files 428 mv debian/ debian.backup # debian/ might be cleaned away 429 \$(MAKE) clean 430 mv debian.backup debian 431 432binary: binary-arch 433EOF 434 mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz 435 tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control} 436 dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \ 437 -b / ../${sourcename}_${version}.orig.tar.gz ../${sourcename}_${packageversion}.debian.tar.gz 438 mv ${sourcename}_${packageversion}*dsc .. 439 dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes 440else 441 dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes 442fi 443 444exit 0 445