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