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