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 its 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 146cp "$($MAKE -s image_name)" "$tmpdir/$installed_image_path" 147 148if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then 149 # Only some architectures with OF support have this target 150 if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then 151 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install 152 fi 153fi 154 155if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then 156 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install 157 rm -f "$tmpdir/lib/modules/$version/build" 158 rm -f "$tmpdir/lib/modules/$version/source" 159 if [ "$ARCH" = "um" ] ; then 160 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 161 rmdir "$tmpdir/lib/modules/$version" 162 fi 163 if [ -n "$BUILD_DEBUG" ] ; then 164 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do 165 module=lib/modules/$module 166 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) 167 # only keep debug symbols in the debug file 168 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module 169 # strip original module from debug symbols 170 $OBJCOPY --strip-debug $tmpdir/$module 171 # then add a link to those 172 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module 173 done 174 175 # resign stripped modules 176 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)" 177 if [ -n "$MODULE_SIG_ALL" ]; then 178 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign 179 fi 180 fi 181fi 182 183if [ "$ARCH" != "um" ]; then 184 $MAKE headers_check KBUILD_SRC= 185 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" 186fi 187 188# Install the maintainer scripts 189# Note: hook scripts under /etc/kernel are also executed by official Debian 190# kernel packages, as well as kernel packages built using make-kpkg. 191# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and 192# so do we; recent versions of dracut and initramfs-tools will obey this. 193debhookdir=${KDEB_HOOKDIR:-/etc/kernel} 194if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then 195 want_initrd=Yes 196else 197 want_initrd=No 198fi 199for script in postinst postrm preinst prerm ; do 200 mkdir -p "$tmpdir$debhookdir/$script.d" 201 cat <<EOF > "$tmpdir/DEBIAN/$script" 202#!/bin/sh 203 204set -e 205 206# Pass maintainer script parameters to hook scripts 207export DEB_MAINT_PARAMS="\$*" 208 209# Tell initramfs builder whether it's wanted 210export INITRD=$want_initrd 211 212test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d 213exit 0 214EOF 215 chmod 755 "$tmpdir/DEBIAN/$script" 216done 217 218# Try to determine maintainer and email values 219if [ -n "$DEBEMAIL" ]; then 220 email=$DEBEMAIL 221elif [ -n "$EMAIL" ]; then 222 email=$EMAIL 223else 224 email=$(id -nu)@$(hostname -f 2>/dev/null || hostname) 225fi 226if [ -n "$DEBFULLNAME" ]; then 227 name=$DEBFULLNAME 228elif [ -n "$NAME" ]; then 229 name=$NAME 230else 231 name="Anonymous" 232fi 233maintainer="$name <$email>" 234 235# Try to determine distribution 236if [ -n "$KDEB_CHANGELOG_DIST" ]; then 237 distribution=$KDEB_CHANGELOG_DIST 238# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog 239elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then 240 : # nothing to do in this case 241else 242 distribution="unstable" 243 echo >&2 "Using default distribution of 'unstable' in the changelog" 244 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" 245fi 246 247# Generate a simple changelog template 248cat <<EOF > debian/changelog 249$sourcename ($packageversion) $distribution; urgency=low 250 251 * Custom built Linux kernel. 252 253 -- $maintainer $(date -R) 254EOF 255 256# Generate copyright file 257cat <<EOF > debian/copyright 258This is a packacked upstream version of the Linux kernel. 259 260The sources may be found at most Linux archive sites, including: 261https://www.kernel.org/pub/linux/kernel 262 263Copyright: 1991 - 2017 Linus Torvalds and others. 264 265The git repository for mainline kernel development is at: 266git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 267 268 This program is free software; you can redistribute it and/or modify 269 it under the terms of the GNU General Public License as published by 270 the Free Software Foundation; version 2 dated June, 1991. 271 272On Debian GNU/Linux systems, the complete text of the GNU General Public 273License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 274EOF 275 276 277build_depends="bc, kmod, cpio " 278 279# Generate a control file 280cat <<EOF > debian/control 281Source: $sourcename 282Section: kernel 283Priority: optional 284Maintainer: $maintainer 285Build-Depends: $build_depends 286Homepage: http://www.kernel.org/ 287EOF 288 289if [ "$ARCH" = "um" ]; then 290 cat <<EOF >> debian/control 291 292Package: $packagename 293Architecture: any 294Description: User Mode Linux kernel, version $version 295 User-mode Linux is a port of the Linux kernel to its own system call 296 interface. It provides a kind of virtual machine, which runs Linux 297 as a user process under another Linux kernel. This is useful for 298 kernel development, sandboxes, jails, experimentation, and 299 many other things. 300 . 301 This package contains the Linux kernel, modules and corresponding other 302 files, version: $version. 303EOF 304 305else 306 cat <<EOF >> debian/control 307 308Package: $packagename 309Suggests: $fwpackagename 310Architecture: any 311Description: Linux kernel, version $version 312 This package contains the Linux kernel, modules and corresponding other 313 files, version: $version. 314EOF 315 316fi 317 318# Build kernel header package 319(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" 320(cd $srctree; find arch/*/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" 321(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" 322(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" 323if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then 324 (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" 325fi 326(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" 327if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then 328 (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" 329fi 330destdir=$kernel_headers_dir/usr/src/linux-headers-$version 331mkdir -p "$destdir" 332(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) 333(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) 334(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be 335ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 336rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 337 338cat <<EOF >> debian/control 339 340Package: $kernel_headers_packagename 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 398Architecture: any 399Description: Linux kernel debugging symbols for $version 400 This package will come in handy if you need to debug the kernel. It provides 401 all the necessary debug symbols for the kernel and its modules. 402EOF 403 404 create_package "$dbg_packagename" "$dbg_dir" 405fi 406 407if [ "x$1" = "xdeb-pkg" ] 408then 409 cat <<EOF > debian/rules 410#!/usr/bin/make -f 411 412build: 413 \$(MAKE) 414 415binary-arch: 416 \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg 417 418clean: 419 rm -rf debian/*tmp debian/files 420 mv debian/ debian.backup # debian/ might be cleaned away 421 \$(MAKE) clean 422 mv debian.backup debian 423 424binary: binary-arch 425EOF 426 mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz 427 tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control} 428 dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \ 429 -b / ../${sourcename}_${version}.orig.tar.gz ../${sourcename}_${packageversion}.debian.tar.gz 430 mv ${sourcename}_${packageversion}*dsc .. 431 dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes 432else 433 dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes 434fi 435 436exit 0 437