11da177e4SLinus Torvalds#!/bin/sh 21da177e4SLinus Torvalds# 34964451aSFrans Pop# builddeb 1.3 41da177e4SLinus Torvalds# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 51da177e4SLinus Torvalds# 61da177e4SLinus Torvalds# Simple script to generate a deb package for a Linux kernel. All the 74f66199bSFrans Pop# complexity of what to do with a kernel after it is installed or removed 81da177e4SLinus Torvalds# is left to other scripts and packages: they can install scripts in the 9fe233cb6SFrans Pop# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 10fe233cb6SFrans Pop# specified in KDEB_HOOKDIR) that will be called on package install and 11fe233cb6SFrans Pop# removal. 121da177e4SLinus Torvalds 131da177e4SLinus Torvaldsset -e 141da177e4SLinus Torvalds 153e2ab256SFrans Popcreate_package() { 163e2ab256SFrans Pop local pname="$1" pdir="$2" 173e2ab256SFrans Pop 189461f666SFrans Pop cp debian/copyright "$pdir/usr/share/doc/$pname/" 191ab18486Smaximilian attems cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 201ab18486Smaximilian attems gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 21b59a1225SFEJES Jozsef sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 22b59a1225SFEJES Jozsef | xargs -r0 md5sum > DEBIAN/md5sums" 239461f666SFrans Pop 243e2ab256SFrans Pop # Fix ownership and permissions 253e2ab256SFrans Pop chown -R root:root "$pdir" 263e2ab256SFrans Pop chmod -R go-w "$pdir" 273e2ab256SFrans Pop 2810f26fa6SAsbjoern Sloth Toennesen # Attempt to find the correct Debian architecture 2910f26fa6SAsbjoern Sloth Toennesen local forcearch="" debarch="" 3010f26fa6SAsbjoern Sloth Toennesen case "$UTS_MACHINE" in 3110f26fa6SAsbjoern Sloth Toennesen i386|ia64|alpha) 3210f26fa6SAsbjoern Sloth Toennesen debarch="$UTS_MACHINE" ;; 3310f26fa6SAsbjoern Sloth Toennesen x86_64) 3410f26fa6SAsbjoern Sloth Toennesen debarch=amd64 ;; 3510f26fa6SAsbjoern Sloth Toennesen sparc*) 3610f26fa6SAsbjoern Sloth Toennesen debarch=sparc ;; 3710f26fa6SAsbjoern Sloth Toennesen s390*) 3810f26fa6SAsbjoern Sloth Toennesen debarch=s390 ;; 3910f26fa6SAsbjoern Sloth Toennesen ppc*) 4010f26fa6SAsbjoern Sloth Toennesen debarch=powerpc ;; 4110f26fa6SAsbjoern Sloth Toennesen parisc*) 4210f26fa6SAsbjoern Sloth Toennesen debarch=hppa ;; 4310f26fa6SAsbjoern Sloth Toennesen mips*) 4410f26fa6SAsbjoern Sloth Toennesen debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;; 4510f26fa6SAsbjoern Sloth Toennesen arm*) 4610f26fa6SAsbjoern Sloth Toennesen debarch=arm$(grep -q CONFIG_AEABI=y .config && echo el) ;; 4710f26fa6SAsbjoern Sloth Toennesen *) 4810f26fa6SAsbjoern Sloth Toennesen echo "" >&2 4910f26fa6SAsbjoern Sloth Toennesen echo "** ** ** WARNING ** ** **" >&2 5010f26fa6SAsbjoern Sloth Toennesen echo "" >&2 5110f26fa6SAsbjoern Sloth Toennesen echo "Your architecture doesn't have it's equivalent" >&2 5210f26fa6SAsbjoern Sloth Toennesen echo "Debian userspace architecture defined!" >&2 5310f26fa6SAsbjoern Sloth Toennesen echo "Falling back to using your current userspace instead!" >&2 5410f26fa6SAsbjoern Sloth Toennesen echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 5510f26fa6SAsbjoern Sloth Toennesen echo "" >&2 5610f26fa6SAsbjoern Sloth Toennesen esac 5755f88eccSAsbjoern Sloth Toennesen if [ -n "$KBUILD_DEBARCH" ] ; then 5855f88eccSAsbjoern Sloth Toennesen debarch="$KBUILD_DEBARCH" 5955f88eccSAsbjoern Sloth Toennesen fi 6010f26fa6SAsbjoern Sloth Toennesen if [ -n "$debarch" ] ; then 6110f26fa6SAsbjoern Sloth Toennesen forcearch="-DArchitecture=$debarch" 6210f26fa6SAsbjoern Sloth Toennesen fi 6310f26fa6SAsbjoern Sloth Toennesen 643e2ab256SFrans Pop # Create the package 6510f26fa6SAsbjoern Sloth Toennesen dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" 663e2ab256SFrans Pop dpkg --build "$pdir" .. 673e2ab256SFrans Pop} 683e2ab256SFrans Pop 691da177e4SLinus Torvalds# Some variables and settings used throughout the script 701da177e4SLinus Torvaldsversion=$KERNELRELEASE 714f66199bSFrans Poprevision=$(cat .version) 72c72c75dbSFrans Popif [ -n "$KDEB_PKGVERSION" ]; then 73c72c75dbSFrans Pop packageversion=$KDEB_PKGVERSION 74c72c75dbSFrans Popelse 75c72c75dbSFrans Pop packageversion=$version-$revision 76c72c75dbSFrans Popfi 771da177e4SLinus Torvaldstmpdir="$objtree/debian/tmp" 78bf1b3644SJonathan McDowellfwdir="$objtree/debian/fwtmp" 79ee81b786Smaximilian attemskernel_headers_dir="$objtree/debian/hdrtmp" 80ee81b786Smaximilian attemslibc_headers_dir="$objtree/debian/headertmp" 81f7a2c31fSmaximilian attemspackagename=linux-image-$version 82bf1b3644SJonathan McDowellfwpackagename=linux-firmware-image 83ee81b786Smaximilian attemskernel_headers_packagename=linux-headers-$version 84ee81b786Smaximilian attemslibc_headers_packagename=linux-libc-dev 85687c3dacSSam Ravnborg 864f66199bSFrans Popif [ "$ARCH" = "um" ] ; then 87687c3dacSSam Ravnborg packagename=user-mode-linux-$version 88687c3dacSSam Ravnborgfi 891da177e4SLinus Torvalds 901da177e4SLinus Torvalds# Setup the directory structure 91ee81b786Smaximilian attemsrm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" 92e86c2412Smaximilian attemsmkdir -m 755 -p "$tmpdir/DEBIAN" 93e86c2412Smaximilian attemsmkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" 94e86c2412Smaximilian attemsmkdir -m 755 -p "$fwdir/DEBIAN" 95e86c2412Smaximilian attemsmkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename" 96ee81b786Smaximilian attemsmkdir -m 755 -p "$libc_headers_dir/DEBIAN" 97ee81b786Smaximilian attemsmkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" 98ee81b786Smaximilian attemsmkdir -m 755 -p "$kernel_headers_dir/DEBIAN" 99ee81b786Smaximilian attemsmkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" 100a47b6c61SJoerg Roedelmkdir -p "$kernel_headers_dir/lib/modules/$version/" 1014f66199bSFrans Popif [ "$ARCH" = "um" ] ; then 1029461f666SFrans Pop mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" 103687c3dacSSam Ravnborgfi 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds# Build and install the kernel 1064f66199bSFrans Popif [ "$ARCH" = "um" ] ; then 107687c3dacSSam Ravnborg $MAKE linux 108687c3dacSSam Ravnborg cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" 109687c3dacSSam Ravnborg cp .config "$tmpdir/usr/share/doc/$packagename/config" 110687c3dacSSam Ravnborg gzip "$tmpdir/usr/share/doc/$packagename/config" 111687c3dacSSam Ravnborg cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" 112687c3dacSSam Ravnborgelse 1131da177e4SLinus Torvalds cp System.map "$tmpdir/boot/System.map-$version" 1141da177e4SLinus Torvalds cp .config "$tmpdir/boot/config-$version" 115a89b433bSFrans Pop # Not all arches include the boot path in KBUILD_IMAGE 116242c5ab0SGuillem Jover if [ -e $KBUILD_IMAGE ]; then 117242c5ab0SGuillem Jover cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 118242c5ab0SGuillem Jover else 119a89b433bSFrans Pop cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 120a89b433bSFrans Pop fi 121687c3dacSSam Ravnborgfi 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvaldsif grep -q '^CONFIG_MODULES=y' .config ; then 124a91f98a2SSam Ravnborg INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install 125a47b6c61SJoerg Roedel rm -f "$tmpdir/lib/modules/$version/build" 126a47b6c61SJoerg Roedel rm -f "$tmpdir/lib/modules/$version/source" 1274f66199bSFrans Pop if [ "$ARCH" = "um" ] ; then 128687c3dacSSam Ravnborg mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 129687c3dacSSam Ravnborg rmdir "$tmpdir/lib/modules/$version" 130687c3dacSSam Ravnborg fi 1311da177e4SLinus Torvaldsfi 1321da177e4SLinus Torvalds 133e6807785Smaximilian attemsmake headers_check 134ee81b786Smaximilian attemsmake headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" 135e6807785Smaximilian attems 1361da177e4SLinus Torvalds# Install the maintainer scripts 137fe233cb6SFrans Pop# Note: hook scripts under /etc/kernel are also executed by official Debian 138fe233cb6SFrans Pop# kernel packages, as well as kernel packages built using make-kpkg 139fe233cb6SFrans Popdebhookdir=${KDEB_HOOKDIR:-/etc/kernel} 1401da177e4SLinus Torvaldsfor script in postinst postrm preinst prerm ; do 141fe233cb6SFrans Pop mkdir -p "$tmpdir$debhookdir/$script.d" 1421da177e4SLinus Torvalds cat <<EOF > "$tmpdir/DEBIAN/$script" 1431da177e4SLinus Torvalds#!/bin/sh 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvaldsset -e 1461da177e4SLinus Torvalds 1474964451aSFrans Pop# Pass maintainer script parameters to hook scripts 148241ad11fSmaximilian attemsexport DEB_MAINT_PARAMS="\$*" 1494964451aSFrans Pop 150fe233cb6SFrans Poptest -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d 1511da177e4SLinus Torvaldsexit 0 1521da177e4SLinus TorvaldsEOF 1531da177e4SLinus Torvalds chmod 755 "$tmpdir/DEBIAN/$script" 1541da177e4SLinus Torvaldsdone 1551da177e4SLinus Torvalds 156edec611dSmaximilian attems# Try to determine maintainer and email values 157edec611dSmaximilian attemsif [ -n "$DEBEMAIL" ]; then 158edec611dSmaximilian attems email=$DEBEMAIL 159edec611dSmaximilian attemselif [ -n "$EMAIL" ]; then 160edec611dSmaximilian attems email=$EMAIL 161edec611dSmaximilian attemselse 162edec611dSmaximilian attems email=$(id -nu)@$(hostname -f) 163edec611dSmaximilian attemsfi 164edec611dSmaximilian attemsif [ -n "$DEBFULLNAME" ]; then 165edec611dSmaximilian attems name=$DEBFULLNAME 166edec611dSmaximilian attemselif [ -n "$NAME" ]; then 167edec611dSmaximilian attems name=$NAME 168edec611dSmaximilian attemselse 169edec611dSmaximilian attems name="Anonymous" 170edec611dSmaximilian attemsfi 171edec611dSmaximilian attemsmaintainer="$name <$email>" 172edec611dSmaximilian attems 1731da177e4SLinus Torvalds# Generate a simple changelog template 1741da177e4SLinus Torvaldscat <<EOF > debian/changelog 1754bf4cd49SFrans Poplinux-upstream ($packageversion) unstable; urgency=low 1761da177e4SLinus Torvalds 177a83ca277SFrans Pop * Custom built Linux kernel. 1781da177e4SLinus Torvalds 179edec611dSmaximilian attems -- $maintainer $(date -R) 1801da177e4SLinus TorvaldsEOF 1811da177e4SLinus Torvalds 1829461f666SFrans Pop# Generate copyright file 1839461f666SFrans Popcat <<EOF > debian/copyright 1849461f666SFrans PopThis is a packacked upstream version of the Linux kernel. 1859461f666SFrans Pop 1869461f666SFrans PopThe sources may be found at most Linux ftp sites, including: 1879461f666SFrans Popftp://ftp.kernel.org/pub/linux/kernel 1889461f666SFrans Pop 1899461f666SFrans PopCopyright: 1991 - 2009 Linus Torvalds and others. 1909461f666SFrans Pop 1919461f666SFrans PopThe git repository for mainline kernel development is at: 1929461f666SFrans Popgit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 1939461f666SFrans Pop 1949461f666SFrans Pop This program is free software; you can redistribute it and/or modify 1959461f666SFrans Pop it under the terms of the GNU General Public License as published by 1969461f666SFrans Pop the Free Software Foundation; version 2 dated June, 1991. 1979461f666SFrans Pop 1989461f666SFrans PopOn Debian GNU/Linux systems, the complete text of the GNU General Public 1999461f666SFrans PopLicense version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 2009461f666SFrans PopEOF 2019461f666SFrans Pop 2021da177e4SLinus Torvalds# Generate a control file 2031da177e4SLinus Torvaldscat <<EOF > debian/control 2044bf4cd49SFrans PopSource: linux-upstream 205aa42abedSRogério BritoSection: kernel 2061da177e4SLinus TorvaldsPriority: optional 207edec611dSmaximilian attemsMaintainer: $maintainer 2082d7204acSRogério BritoStandards-Version: 3.8.4 209ee6eed80SRogério BritoHomepage: http://www.kernel.org/ 2103e2ab256SFrans PopEOF 2113e2ab256SFrans Pop 2123e2ab256SFrans Popif [ "$ARCH" = "um" ]; then 2133e2ab256SFrans Pop cat <<EOF >> debian/control 2141da177e4SLinus Torvalds 215687c3dacSSam RavnborgPackage: $packagename 2168ebc2fe9Smaximilian attemsProvides: linux-image, linux-image-2.6, linux-modules-$version 2171da177e4SLinus TorvaldsArchitecture: any 218dc5962fdSSam RavnborgDescription: User Mode Linux kernel, version $version 219dc5962fdSSam Ravnborg User-mode Linux is a port of the Linux kernel to its own system call 220dc5962fdSSam Ravnborg interface. It provides a kind of virtual machine, which runs Linux 221dc5962fdSSam Ravnborg as a user process under another Linux kernel. This is useful for 222dc5962fdSSam Ravnborg kernel development, sandboxes, jails, experimentation, and 223dc5962fdSSam Ravnborg many other things. 224dc5962fdSSam Ravnborg . 2251da177e4SLinus Torvalds This package contains the Linux kernel, modules and corresponding other 226a83ca277SFrans Pop files, version: $version. 2271da177e4SLinus TorvaldsEOF 2281da177e4SLinus Torvalds 229dc5962fdSSam Ravnborgelse 2303e2ab256SFrans Pop cat <<EOF >> debian/control 231dc5962fdSSam Ravnborg 232dc5962fdSSam RavnborgPackage: $packagename 2338ebc2fe9Smaximilian attemsProvides: linux-image, linux-image-2.6, linux-modules-$version 234bf1b3644SJonathan McDowellSuggests: $fwpackagename 235dc5962fdSSam RavnborgArchitecture: any 236dc5962fdSSam RavnborgDescription: Linux kernel, version $version 237dc5962fdSSam Ravnborg This package contains the Linux kernel, modules and corresponding other 238a83ca277SFrans Pop files, version: $version. 239dc5962fdSSam RavnborgEOF 2404f66199bSFrans Pop 241dc5962fdSSam Ravnborgfi 242dc5962fdSSam Ravnborg 243cd8d60a2STheodore Ts'o# Build header package 2446c635224SBen Hutchings(cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles") 2456c635224SBen Hutchings(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles") 2466c635224SBen Hutchings(cd $objtree; find .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles") 247ee81b786Smaximilian attemsdestdir=$kernel_headers_dir/usr/src/linux-headers-$version 248ee81b786Smaximilian attemsmkdir -p "$destdir" 2496c635224SBen Hutchings(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) 2506c635224SBen Hutchings(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) 251a47b6c61SJoerg Roedelln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 2526c635224SBen Hutchingsrm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 253cd8d60a2STheodore Ts'oarch=$(dpkg --print-architecture) 254cd8d60a2STheodore Ts'o 255cd8d60a2STheodore Ts'ocat <<EOF >> debian/control 256cd8d60a2STheodore Ts'o 257ee81b786Smaximilian attemsPackage: $kernel_headers_packagename 258cd8d60a2STheodore Ts'oProvides: linux-headers, linux-headers-2.6 259cd8d60a2STheodore Ts'oArchitecture: $arch 260cd8d60a2STheodore Ts'oDescription: Linux kernel headers for $KERNELRELEASE on $arch 261cd8d60a2STheodore Ts'o This package provides kernel header files for $KERNELRELEASE on $arch 262cd8d60a2STheodore Ts'o . 263cd8d60a2STheodore Ts'o This is useful for people who need to build external modules 264cd8d60a2STheodore Ts'oEOF 265cd8d60a2STheodore Ts'o 266ee81b786Smaximilian attemscreate_package "$kernel_headers_packagename" "$kernel_headers_dir" 267cd8d60a2STheodore Ts'o 268bf1b3644SJonathan McDowell# Do we have firmware? Move it out of the way and build it into a package. 269bf1b3644SJonathan McDowellif [ -e "$tmpdir/lib/firmware" ]; then 270bf1b3644SJonathan McDowell mv "$tmpdir/lib/firmware" "$fwdir/lib/" 271bf1b3644SJonathan McDowell 272bf1b3644SJonathan McDowell cat <<EOF >> debian/control 273bf1b3644SJonathan McDowell 274bf1b3644SJonathan McDowellPackage: $fwpackagename 275bf1b3644SJonathan McDowellArchitecture: all 276bf1b3644SJonathan McDowellDescription: Linux kernel firmware, version $version 277a83ca277SFrans Pop This package contains firmware from the Linux kernel, version $version. 278bf1b3644SJonathan McDowellEOF 279bf1b3644SJonathan McDowell 2803e2ab256SFrans Pop create_package "$fwpackagename" "$fwdir" 281bf1b3644SJonathan McDowellfi 282bf1b3644SJonathan McDowell 283e6807785Smaximilian attemscat <<EOF >> debian/control 284e6807785Smaximilian attems 285ee81b786Smaximilian attemsPackage: $libc_headers_packagename 286e6807785Smaximilian attemsSection: devel 287e6807785Smaximilian attemsProvides: linux-kernel-headers 288e6807785Smaximilian attemsArchitecture: any 289e6807785Smaximilian attemsDescription: Linux support headers for userspace development 290e6807785Smaximilian attems This package provides userspaces headers from the Linux kernel. These headers 291e6807785Smaximilian attems are used by the installed headers for GNU glibc and other system libraries. 292e6807785Smaximilian attemsEOF 293e6807785Smaximilian attems 294ee81b786Smaximilian attemscreate_package "$libc_headers_packagename" "$libc_headers_dir" 2953e2ab256SFrans Popcreate_package "$packagename" "$tmpdir" 2961da177e4SLinus Torvalds 2971da177e4SLinus Torvaldsexit 0 298