4 # Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
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
16 local pname="$1" pdir="$2"
18 cp debian/copyright "$pdir/usr/share/doc/$pname/"
19 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
20 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
21 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
22 | xargs -r0 md5sum > DEBIAN/md5sums"
24 # Fix ownership and permissions
25 chown -R root:root "$pdir"
28 # Attempt to find the correct Debian architecture
29 local forcearch="" debarch=""
30 case "$UTS_MACHINE" in
32 debarch="$UTS_MACHINE" ;;
44 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;;
46 debarch=arm$(grep -q CONFIG_AEABI=y .config && echo el) ;;
49 echo "** ** ** WARNING ** ** **" >&2
51 echo "Your architecture doesn't have it's equivalent" >&2
52 echo "Debian userspace architecture defined!" >&2
53 echo "Falling back to using your current userspace instead!" >&2
54 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
57 if [ -n "$KBUILD_DEBARCH" ] ; then
58 debarch="$KBUILD_DEBARCH"
60 if [ -n "$debarch" ] ; then
61 forcearch="-DArchitecture=$debarch"
65 dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir"
66 dpkg --build "$pdir" ..
69 # Some variables and settings used throughout the script
70 version=$KERNELRELEASE
71 revision=$(cat .version)
72 if [ -n "$KDEB_PKGVERSION" ]; then
73 packageversion=$KDEB_PKGVERSION
75 packageversion=$version-$revision
77 tmpdir="$objtree/debian/tmp"
78 fwdir="$objtree/debian/fwtmp"
79 hdrdir="$objtree/debian/hdrtmp"
80 packagename=linux-image-$version
81 fwpackagename=linux-firmware-image
82 hdrpackagename=linux-headers-$version
84 if [ "$ARCH" = "um" ] ; then
85 packagename=user-mode-linux-$version
88 # Setup the directory structure
89 rm -rf "$tmpdir" "$fwdir" "$hdrdir"
90 mkdir -m 755 -p "$tmpdir/DEBIAN"
91 mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
92 mkdir -m 755 -p "$fwdir/DEBIAN"
93 mkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename"
94 if [ "$ARCH" = "um" ] ; then
95 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
98 # Build and install the kernel
99 if [ "$ARCH" = "um" ] ; then
101 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
102 cp .config "$tmpdir/usr/share/doc/$packagename/config"
103 gzip "$tmpdir/usr/share/doc/$packagename/config"
104 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
106 cp System.map "$tmpdir/boot/System.map-$version"
107 cp .config "$tmpdir/boot/config-$version"
108 # Not all arches include the boot path in KBUILD_IMAGE
109 if [ -e $KBUILD_IMAGE ]; then
110 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
112 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
116 if grep -q '^CONFIG_MODULES=y' .config ; then
117 INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install
118 if [ "$ARCH" = "um" ] ; then
119 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
120 rmdir "$tmpdir/lib/modules/$version"
124 # Install the maintainer scripts
125 # Note: hook scripts under /etc/kernel are also executed by official Debian
126 # kernel packages, as well as kernel packages built using make-kpkg
127 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
128 for script in postinst postrm preinst prerm ; do
129 mkdir -p "$tmpdir$debhookdir/$script.d"
130 cat <<EOF > "$tmpdir/DEBIAN/$script"
135 # Pass maintainer script parameters to hook scripts
136 export DEB_MAINT_PARAMS="\$*"
138 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
141 chmod 755 "$tmpdir/DEBIAN/$script"
144 # Try to determine maintainer and email values
145 if [ -n "$DEBEMAIL" ]; then
147 elif [ -n "$EMAIL" ]; then
150 email=$(id -nu)@$(hostname -f)
152 if [ -n "$DEBFULLNAME" ]; then
154 elif [ -n "$NAME" ]; then
159 maintainer="$name <$email>"
161 # Generate a simple changelog template
162 cat <<EOF > debian/changelog
163 linux-upstream ($packageversion) unstable; urgency=low
165 * Custom built Linux kernel.
167 -- $maintainer $(date -R)
170 # Generate copyright file
171 cat <<EOF > debian/copyright
172 This is a packacked upstream version of the Linux kernel.
174 The sources may be found at most Linux ftp sites, including:
175 ftp://ftp.kernel.org/pub/linux/kernel
177 Copyright: 1991 - 2009 Linus Torvalds and others.
179 The git repository for mainline kernel development is at:
180 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
182 This program is free software; you can redistribute it and/or modify
183 it under the terms of the GNU General Public License as published by
184 the Free Software Foundation; version 2 dated June, 1991.
186 On Debian GNU/Linux systems, the complete text of the GNU General Public
187 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
190 # Generate a control file
191 cat <<EOF > debian/control
192 Source: linux-upstream
195 Maintainer: $maintainer
196 Standards-Version: 3.8.4
197 Homepage: http://www.kernel.org/
200 if [ "$ARCH" = "um" ]; then
201 cat <<EOF >> debian/control
203 Package: $packagename
204 Provides: linux-image, linux-image-2.6, linux-modules-$version
206 Description: User Mode Linux kernel, version $version
207 User-mode Linux is a port of the Linux kernel to its own system call
208 interface. It provides a kind of virtual machine, which runs Linux
209 as a user process under another Linux kernel. This is useful for
210 kernel development, sandboxes, jails, experimentation, and
213 This package contains the Linux kernel, modules and corresponding other
214 files, version: $version.
218 cat <<EOF >> debian/control
220 Package: $packagename
221 Provides: linux-image, linux-image-2.6, linux-modules-$version
222 Suggests: $fwpackagename
224 Description: Linux kernel, version $version
225 This package contains the Linux kernel, modules and corresponding other
226 files, version: $version.
231 # Build header package
232 find . -name Makefile -o -name Kconfig\* -o -name \*.pl > /tmp/files$$
233 find arch/x86/include include scripts -type f >> /tmp/files$$
234 (cd $objtree; find .config Module.symvers include scripts -type f >> /tmp/objfiles$$)
235 destdir=$hdrdir/usr/src/linux-headers-$version
236 mkdir -p "$destdir" "$hdrdir/DEBIAN" "$hdrdir/usr/share/doc/$hdrpackagename"
237 tar -c -f - -T /tmp/files$$ | (cd $destdir; tar -xf -)
238 (cd $objtree; tar -c -f - -T /tmp/objfiles$$) | (cd $destdir; tar -xf -)
239 rm -f /tmp/files$$ /tmp/objfiles$$
240 arch=$(dpkg --print-architecture)
242 cat <<EOF >> debian/control
244 Package: $hdrpackagename
245 Provides: linux-headers, linux-headers-2.6
247 Description: Linux kernel headers for $KERNELRELEASE on $arch
248 This package provides kernel header files for $KERNELRELEASE on $arch
250 This is useful for people who need to build external modules
253 create_package "$hdrpackagename" "$hdrdir"
255 # Do we have firmware? Move it out of the way and build it into a package.
256 if [ -e "$tmpdir/lib/firmware" ]; then
257 mv "$tmpdir/lib/firmware" "$fwdir/lib/"
259 cat <<EOF >> debian/control
261 Package: $fwpackagename
263 Description: Linux kernel firmware, version $version
264 This package contains firmware from the Linux kernel, version $version.
267 create_package "$fwpackagename" "$fwdir"
270 create_package "$packagename" "$tmpdir"