1*53ee8cc1Swenshuai.xi#!/bin/sh 2*53ee8cc1Swenshuai.xi# 3*53ee8cc1Swenshuai.xi# builddeb 1.3 4*53ee8cc1Swenshuai.xi# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 5*53ee8cc1Swenshuai.xi# 6*53ee8cc1Swenshuai.xi# Simple script to generate a deb package for a Linux kernel. All the 7*53ee8cc1Swenshuai.xi# complexity of what to do with a kernel after it is installed or removed 8*53ee8cc1Swenshuai.xi# is left to other scripts and packages: they can install scripts in the 9*53ee8cc1Swenshuai.xi# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location 10*53ee8cc1Swenshuai.xi# specified in KDEB_HOOKDIR) that will be called on package install and 11*53ee8cc1Swenshuai.xi# removal. 12*53ee8cc1Swenshuai.xi 13*53ee8cc1Swenshuai.xiset -e 14*53ee8cc1Swenshuai.xi 15*53ee8cc1Swenshuai.xicreate_package() { 16*53ee8cc1Swenshuai.xi local pname="$1" pdir="$2" 17*53ee8cc1Swenshuai.xi 18*53ee8cc1Swenshuai.xi cp debian/copyright "$pdir/usr/share/doc/$pname/" 19*53ee8cc1Swenshuai.xi cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 20*53ee8cc1Swenshuai.xi gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 21*53ee8cc1Swenshuai.xi sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 22*53ee8cc1Swenshuai.xi | xargs -r0 md5sum > DEBIAN/md5sums" 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi # Fix ownership and permissions 25*53ee8cc1Swenshuai.xi chown -R root:root "$pdir" 26*53ee8cc1Swenshuai.xi chmod -R go-w "$pdir" 27*53ee8cc1Swenshuai.xi 28*53ee8cc1Swenshuai.xi # Attempt to find the correct Debian architecture 29*53ee8cc1Swenshuai.xi local forcearch="" debarch="" 30*53ee8cc1Swenshuai.xi case "$UTS_MACHINE" in 31*53ee8cc1Swenshuai.xi i386|ia64|alpha) 32*53ee8cc1Swenshuai.xi debarch="$UTS_MACHINE" ;; 33*53ee8cc1Swenshuai.xi x86_64) 34*53ee8cc1Swenshuai.xi debarch=amd64 ;; 35*53ee8cc1Swenshuai.xi sparc*) 36*53ee8cc1Swenshuai.xi debarch=sparc ;; 37*53ee8cc1Swenshuai.xi s390*) 38*53ee8cc1Swenshuai.xi debarch=s390 ;; 39*53ee8cc1Swenshuai.xi ppc*) 40*53ee8cc1Swenshuai.xi debarch=powerpc ;; 41*53ee8cc1Swenshuai.xi parisc*) 42*53ee8cc1Swenshuai.xi debarch=hppa ;; 43*53ee8cc1Swenshuai.xi mips*) 44*53ee8cc1Swenshuai.xi debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;; 45*53ee8cc1Swenshuai.xi arm*) 46*53ee8cc1Swenshuai.xi debarch=arm$(grep -q CONFIG_AEABI=y .config && echo el) ;; 47*53ee8cc1Swenshuai.xi *) 48*53ee8cc1Swenshuai.xi echo "" >&2 49*53ee8cc1Swenshuai.xi echo "** ** ** WARNING ** ** **" >&2 50*53ee8cc1Swenshuai.xi echo "" >&2 51*53ee8cc1Swenshuai.xi echo "Your architecture doesn't have it's equivalent" >&2 52*53ee8cc1Swenshuai.xi echo "Debian userspace architecture defined!" >&2 53*53ee8cc1Swenshuai.xi echo "Falling back to using your current userspace instead!" >&2 54*53ee8cc1Swenshuai.xi echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 55*53ee8cc1Swenshuai.xi echo "" >&2 56*53ee8cc1Swenshuai.xi esac 57*53ee8cc1Swenshuai.xi if [ -n "$KBUILD_DEBARCH" ] ; then 58*53ee8cc1Swenshuai.xi debarch="$KBUILD_DEBARCH" 59*53ee8cc1Swenshuai.xi fi 60*53ee8cc1Swenshuai.xi if [ -n "$debarch" ] ; then 61*53ee8cc1Swenshuai.xi forcearch="-DArchitecture=$debarch" 62*53ee8cc1Swenshuai.xi fi 63*53ee8cc1Swenshuai.xi 64*53ee8cc1Swenshuai.xi # Create the package 65*53ee8cc1Swenshuai.xi dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" 66*53ee8cc1Swenshuai.xi dpkg --build "$pdir" .. 67*53ee8cc1Swenshuai.xi} 68*53ee8cc1Swenshuai.xi 69*53ee8cc1Swenshuai.xi# Some variables and settings used throughout the script 70*53ee8cc1Swenshuai.xiversion=$KERNELRELEASE 71*53ee8cc1Swenshuai.xirevision=$(cat .version) 72*53ee8cc1Swenshuai.xiif [ -n "$KDEB_PKGVERSION" ]; then 73*53ee8cc1Swenshuai.xi packageversion=$KDEB_PKGVERSION 74*53ee8cc1Swenshuai.xielse 75*53ee8cc1Swenshuai.xi packageversion=$version-$revision 76*53ee8cc1Swenshuai.xifi 77*53ee8cc1Swenshuai.xitmpdir="$objtree/debian/tmp" 78*53ee8cc1Swenshuai.xifwdir="$objtree/debian/fwtmp" 79*53ee8cc1Swenshuai.xikernel_headers_dir="$objtree/debian/hdrtmp" 80*53ee8cc1Swenshuai.xilibc_headers_dir="$objtree/debian/headertmp" 81*53ee8cc1Swenshuai.xipackagename=linux-image-$version 82*53ee8cc1Swenshuai.xifwpackagename=linux-firmware-image 83*53ee8cc1Swenshuai.xikernel_headers_packagename=linux-headers-$version 84*53ee8cc1Swenshuai.xilibc_headers_packagename=linux-libc-dev 85*53ee8cc1Swenshuai.xi 86*53ee8cc1Swenshuai.xiif [ "$ARCH" = "um" ] ; then 87*53ee8cc1Swenshuai.xi packagename=user-mode-linux-$version 88*53ee8cc1Swenshuai.xifi 89*53ee8cc1Swenshuai.xi 90*53ee8cc1Swenshuai.xi# Setup the directory structure 91*53ee8cc1Swenshuai.xirm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" 92*53ee8cc1Swenshuai.ximkdir -m 755 -p "$tmpdir/DEBIAN" 93*53ee8cc1Swenshuai.ximkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" 94*53ee8cc1Swenshuai.ximkdir -m 755 -p "$fwdir/DEBIAN" 95*53ee8cc1Swenshuai.ximkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename" 96*53ee8cc1Swenshuai.ximkdir -m 755 -p "$libc_headers_dir/DEBIAN" 97*53ee8cc1Swenshuai.ximkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" 98*53ee8cc1Swenshuai.ximkdir -m 755 -p "$kernel_headers_dir/DEBIAN" 99*53ee8cc1Swenshuai.ximkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" 100*53ee8cc1Swenshuai.xiif [ "$ARCH" = "um" ] ; then 101*53ee8cc1Swenshuai.xi mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" 102*53ee8cc1Swenshuai.xifi 103*53ee8cc1Swenshuai.xi 104*53ee8cc1Swenshuai.xi# Build and install the kernel 105*53ee8cc1Swenshuai.xiif [ "$ARCH" = "um" ] ; then 106*53ee8cc1Swenshuai.xi $MAKE linux 107*53ee8cc1Swenshuai.xi cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" 108*53ee8cc1Swenshuai.xi cp .config "$tmpdir/usr/share/doc/$packagename/config" 109*53ee8cc1Swenshuai.xi gzip "$tmpdir/usr/share/doc/$packagename/config" 110*53ee8cc1Swenshuai.xi cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" 111*53ee8cc1Swenshuai.xielse 112*53ee8cc1Swenshuai.xi cp System.map "$tmpdir/boot/System.map-$version" 113*53ee8cc1Swenshuai.xi cp .config "$tmpdir/boot/config-$version" 114*53ee8cc1Swenshuai.xi # Not all arches include the boot path in KBUILD_IMAGE 115*53ee8cc1Swenshuai.xi if [ -e $KBUILD_IMAGE ]; then 116*53ee8cc1Swenshuai.xi cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 117*53ee8cc1Swenshuai.xi else 118*53ee8cc1Swenshuai.xi cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" 119*53ee8cc1Swenshuai.xi fi 120*53ee8cc1Swenshuai.xifi 121*53ee8cc1Swenshuai.xi 122*53ee8cc1Swenshuai.xiif grep -q '^CONFIG_MODULES=y' .config ; then 123*53ee8cc1Swenshuai.xi INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install 124*53ee8cc1Swenshuai.xi if [ "$ARCH" = "um" ] ; then 125*53ee8cc1Swenshuai.xi mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" 126*53ee8cc1Swenshuai.xi rmdir "$tmpdir/lib/modules/$version" 127*53ee8cc1Swenshuai.xi fi 128*53ee8cc1Swenshuai.xifi 129*53ee8cc1Swenshuai.xi 130*53ee8cc1Swenshuai.ximake headers_check 131*53ee8cc1Swenshuai.ximake headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" 132*53ee8cc1Swenshuai.xi 133*53ee8cc1Swenshuai.xi# Install the maintainer scripts 134*53ee8cc1Swenshuai.xi# Note: hook scripts under /etc/kernel are also executed by official Debian 135*53ee8cc1Swenshuai.xi# kernel packages, as well as kernel packages built using make-kpkg 136*53ee8cc1Swenshuai.xidebhookdir=${KDEB_HOOKDIR:-/etc/kernel} 137*53ee8cc1Swenshuai.xifor script in postinst postrm preinst prerm ; do 138*53ee8cc1Swenshuai.xi mkdir -p "$tmpdir$debhookdir/$script.d" 139*53ee8cc1Swenshuai.xi cat <<EOF > "$tmpdir/DEBIAN/$script" 140*53ee8cc1Swenshuai.xi#!/bin/sh 141*53ee8cc1Swenshuai.xi 142*53ee8cc1Swenshuai.xiset -e 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi# Pass maintainer script parameters to hook scripts 145*53ee8cc1Swenshuai.xiexport DEB_MAINT_PARAMS="\$*" 146*53ee8cc1Swenshuai.xi 147*53ee8cc1Swenshuai.xitest -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d 148*53ee8cc1Swenshuai.xiexit 0 149*53ee8cc1Swenshuai.xiEOF 150*53ee8cc1Swenshuai.xi chmod 755 "$tmpdir/DEBIAN/$script" 151*53ee8cc1Swenshuai.xidone 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi# Try to determine maintainer and email values 154*53ee8cc1Swenshuai.xiif [ -n "$DEBEMAIL" ]; then 155*53ee8cc1Swenshuai.xi email=$DEBEMAIL 156*53ee8cc1Swenshuai.xielif [ -n "$EMAIL" ]; then 157*53ee8cc1Swenshuai.xi email=$EMAIL 158*53ee8cc1Swenshuai.xielse 159*53ee8cc1Swenshuai.xi email=$(id -nu)@$(hostname -f) 160*53ee8cc1Swenshuai.xifi 161*53ee8cc1Swenshuai.xiif [ -n "$DEBFULLNAME" ]; then 162*53ee8cc1Swenshuai.xi name=$DEBFULLNAME 163*53ee8cc1Swenshuai.xielif [ -n "$NAME" ]; then 164*53ee8cc1Swenshuai.xi name=$NAME 165*53ee8cc1Swenshuai.xielse 166*53ee8cc1Swenshuai.xi name="Anonymous" 167*53ee8cc1Swenshuai.xifi 168*53ee8cc1Swenshuai.ximaintainer="$name <$email>" 169*53ee8cc1Swenshuai.xi 170*53ee8cc1Swenshuai.xi# Generate a simple changelog template 171*53ee8cc1Swenshuai.xicat <<EOF > debian/changelog 172*53ee8cc1Swenshuai.xilinux-upstream ($packageversion) unstable; urgency=low 173*53ee8cc1Swenshuai.xi 174*53ee8cc1Swenshuai.xi * Custom built Linux kernel. 175*53ee8cc1Swenshuai.xi 176*53ee8cc1Swenshuai.xi -- $maintainer $(date -R) 177*53ee8cc1Swenshuai.xiEOF 178*53ee8cc1Swenshuai.xi 179*53ee8cc1Swenshuai.xi# Generate copyright file 180*53ee8cc1Swenshuai.xicat <<EOF > debian/copyright 181*53ee8cc1Swenshuai.xiThis is a packacked upstream version of the Linux kernel. 182*53ee8cc1Swenshuai.xi 183*53ee8cc1Swenshuai.xiThe sources may be found at most Linux ftp sites, including: 184*53ee8cc1Swenshuai.xiftp://ftp.kernel.org/pub/linux/kernel 185*53ee8cc1Swenshuai.xi 186*53ee8cc1Swenshuai.xiCopyright: 1991 - 2009 Linus Torvalds and others. 187*53ee8cc1Swenshuai.xi 188*53ee8cc1Swenshuai.xiThe git repository for mainline kernel development is at: 189*53ee8cc1Swenshuai.xigit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 190*53ee8cc1Swenshuai.xi 191*53ee8cc1Swenshuai.xi This program is free software; you can redistribute it and/or modify 192*53ee8cc1Swenshuai.xi it under the terms of the GNU General Public License as published by 193*53ee8cc1Swenshuai.xi the Free Software Foundation; version 2 dated June, 1991. 194*53ee8cc1Swenshuai.xi 195*53ee8cc1Swenshuai.xiOn Debian GNU/Linux systems, the complete text of the GNU General Public 196*53ee8cc1Swenshuai.xiLicense version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 197*53ee8cc1Swenshuai.xiEOF 198*53ee8cc1Swenshuai.xi 199*53ee8cc1Swenshuai.xi# Generate a control file 200*53ee8cc1Swenshuai.xicat <<EOF > debian/control 201*53ee8cc1Swenshuai.xiSource: linux-upstream 202*53ee8cc1Swenshuai.xiSection: kernel 203*53ee8cc1Swenshuai.xiPriority: optional 204*53ee8cc1Swenshuai.xiMaintainer: $maintainer 205*53ee8cc1Swenshuai.xiStandards-Version: 3.8.4 206*53ee8cc1Swenshuai.xiHomepage: http://www.kernel.org/ 207*53ee8cc1Swenshuai.xiEOF 208*53ee8cc1Swenshuai.xi 209*53ee8cc1Swenshuai.xiif [ "$ARCH" = "um" ]; then 210*53ee8cc1Swenshuai.xi cat <<EOF >> debian/control 211*53ee8cc1Swenshuai.xi 212*53ee8cc1Swenshuai.xiPackage: $packagename 213*53ee8cc1Swenshuai.xiProvides: linux-image, linux-image-2.6, linux-modules-$version 214*53ee8cc1Swenshuai.xiArchitecture: any 215*53ee8cc1Swenshuai.xiDescription: User Mode Linux kernel, version $version 216*53ee8cc1Swenshuai.xi User-mode Linux is a port of the Linux kernel to its own system call 217*53ee8cc1Swenshuai.xi interface. It provides a kind of virtual machine, which runs Linux 218*53ee8cc1Swenshuai.xi as a user process under another Linux kernel. This is useful for 219*53ee8cc1Swenshuai.xi kernel development, sandboxes, jails, experimentation, and 220*53ee8cc1Swenshuai.xi many other things. 221*53ee8cc1Swenshuai.xi . 222*53ee8cc1Swenshuai.xi This package contains the Linux kernel, modules and corresponding other 223*53ee8cc1Swenshuai.xi files, version: $version. 224*53ee8cc1Swenshuai.xiEOF 225*53ee8cc1Swenshuai.xi 226*53ee8cc1Swenshuai.xielse 227*53ee8cc1Swenshuai.xi cat <<EOF >> debian/control 228*53ee8cc1Swenshuai.xi 229*53ee8cc1Swenshuai.xiPackage: $packagename 230*53ee8cc1Swenshuai.xiProvides: linux-image, linux-image-2.6, linux-modules-$version 231*53ee8cc1Swenshuai.xiSuggests: $fwpackagename 232*53ee8cc1Swenshuai.xiArchitecture: any 233*53ee8cc1Swenshuai.xiDescription: Linux kernel, version $version 234*53ee8cc1Swenshuai.xi This package contains the Linux kernel, modules and corresponding other 235*53ee8cc1Swenshuai.xi files, version: $version. 236*53ee8cc1Swenshuai.xiEOF 237*53ee8cc1Swenshuai.xi 238*53ee8cc1Swenshuai.xifi 239*53ee8cc1Swenshuai.xi 240*53ee8cc1Swenshuai.xi# Build header package 241*53ee8cc1Swenshuai.xi(cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles") 242*53ee8cc1Swenshuai.xi(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles") 243*53ee8cc1Swenshuai.xi(cd $objtree; find .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles") 244*53ee8cc1Swenshuai.xidestdir=$kernel_headers_dir/usr/src/linux-headers-$version 245*53ee8cc1Swenshuai.ximkdir -p "$destdir" 246*53ee8cc1Swenshuai.xi(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) 247*53ee8cc1Swenshuai.xi(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) 248*53ee8cc1Swenshuai.xirm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 249*53ee8cc1Swenshuai.xiarch=$(dpkg --print-architecture) 250*53ee8cc1Swenshuai.xi 251*53ee8cc1Swenshuai.xicat <<EOF >> debian/control 252*53ee8cc1Swenshuai.xi 253*53ee8cc1Swenshuai.xiPackage: $kernel_headers_packagename 254*53ee8cc1Swenshuai.xiProvides: linux-headers, linux-headers-2.6 255*53ee8cc1Swenshuai.xiArchitecture: $arch 256*53ee8cc1Swenshuai.xiDescription: Linux kernel headers for $KERNELRELEASE on $arch 257*53ee8cc1Swenshuai.xi This package provides kernel header files for $KERNELRELEASE on $arch 258*53ee8cc1Swenshuai.xi . 259*53ee8cc1Swenshuai.xi This is useful for people who need to build external modules 260*53ee8cc1Swenshuai.xiEOF 261*53ee8cc1Swenshuai.xi 262*53ee8cc1Swenshuai.xicreate_package "$kernel_headers_packagename" "$kernel_headers_dir" 263*53ee8cc1Swenshuai.xi 264*53ee8cc1Swenshuai.xi# Do we have firmware? Move it out of the way and build it into a package. 265*53ee8cc1Swenshuai.xiif [ -e "$tmpdir/lib/firmware" ]; then 266*53ee8cc1Swenshuai.xi mv "$tmpdir/lib/firmware" "$fwdir/lib/" 267*53ee8cc1Swenshuai.xi 268*53ee8cc1Swenshuai.xi cat <<EOF >> debian/control 269*53ee8cc1Swenshuai.xi 270*53ee8cc1Swenshuai.xiPackage: $fwpackagename 271*53ee8cc1Swenshuai.xiArchitecture: all 272*53ee8cc1Swenshuai.xiDescription: Linux kernel firmware, version $version 273*53ee8cc1Swenshuai.xi This package contains firmware from the Linux kernel, version $version. 274*53ee8cc1Swenshuai.xiEOF 275*53ee8cc1Swenshuai.xi 276*53ee8cc1Swenshuai.xi create_package "$fwpackagename" "$fwdir" 277*53ee8cc1Swenshuai.xifi 278*53ee8cc1Swenshuai.xi 279*53ee8cc1Swenshuai.xicat <<EOF >> debian/control 280*53ee8cc1Swenshuai.xi 281*53ee8cc1Swenshuai.xiPackage: $libc_headers_packagename 282*53ee8cc1Swenshuai.xiSection: devel 283*53ee8cc1Swenshuai.xiProvides: linux-kernel-headers 284*53ee8cc1Swenshuai.xiArchitecture: any 285*53ee8cc1Swenshuai.xiDescription: Linux support headers for userspace development 286*53ee8cc1Swenshuai.xi This package provides userspaces headers from the Linux kernel. These headers 287*53ee8cc1Swenshuai.xi are used by the installed headers for GNU glibc and other system libraries. 288*53ee8cc1Swenshuai.xiEOF 289*53ee8cc1Swenshuai.xi 290*53ee8cc1Swenshuai.xicreate_package "$libc_headers_packagename" "$libc_headers_dir" 291*53ee8cc1Swenshuai.xicreate_package "$packagename" "$tmpdir" 292*53ee8cc1Swenshuai.xi 293*53ee8cc1Swenshuai.xiexit 0 294