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