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 headerdir="$objtree/debian/headertmp"
81 packagename=linux-image-$version
82 fwpackagename=linux-firmware-image
83 hdrpackagename=linux-headers-$version
84 headerpackagename=linux-libc-dev
86 if [ "$ARCH" = "um" ] ; then
87 packagename=user-mode-linux-$version
90 # Setup the directory structure
91 rm -rf "$tmpdir" "$fwdir" "$hdrdir" "$headerdir"
92 mkdir -m 755 -p "$tmpdir/DEBIAN"
93 mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
94 mkdir -m 755 -p "$fwdir/DEBIAN"
95 mkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename"
96 mkdir -m 755 -p "$headerdir/DEBIAN"
97 mkdir -p "$headerdir/usr/share/doc/$headerpackagename"
98 if [ "$ARCH" = "um" ] ; then
99 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
102 # Build and install the kernel
103 if [ "$ARCH" = "um" ] ; then
105 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
106 cp .config "$tmpdir/usr/share/doc/$packagename/config"
107 gzip "$tmpdir/usr/share/doc/$packagename/config"
108 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
110 cp System.map "$tmpdir/boot/System.map-$version"
111 cp .config "$tmpdir/boot/config-$version"
112 # Not all arches include the boot path in KBUILD_IMAGE
113 if [ -e $KBUILD_IMAGE ]; then
114 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
116 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
120 if grep -q '^CONFIG_MODULES=y' .config ; then
121 INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install
122 if [ "$ARCH" = "um" ] ; then
123 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
124 rmdir "$tmpdir/lib/modules/$version"
129 make headers_install INSTALL_HDR_PATH="$headerdir/usr"
131 # Install the maintainer scripts
132 # Note: hook scripts under /etc/kernel are also executed by official Debian
133 # kernel packages, as well as kernel packages built using make-kpkg
134 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
135 for script in postinst postrm preinst prerm ; do
136 mkdir -p "$tmpdir$debhookdir/$script.d"
137 cat <<EOF > "$tmpdir/DEBIAN/$script"
142 # Pass maintainer script parameters to hook scripts
143 export DEB_MAINT_PARAMS="\$*"
145 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
148 chmod 755 "$tmpdir/DEBIAN/$script"
151 # Try to determine maintainer and email values
152 if [ -n "$DEBEMAIL" ]; then
154 elif [ -n "$EMAIL" ]; then
157 email=$(id -nu)@$(hostname -f)
159 if [ -n "$DEBFULLNAME" ]; then
161 elif [ -n "$NAME" ]; then
166 maintainer="$name <$email>"
168 # Generate a simple changelog template
169 cat <<EOF > debian/changelog
170 linux-upstream ($packageversion) unstable; urgency=low
172 * Custom built Linux kernel.
174 -- $maintainer $(date -R)
177 # Generate copyright file
178 cat <<EOF > debian/copyright
179 This is a packacked upstream version of the Linux kernel.
181 The sources may be found at most Linux ftp sites, including:
182 ftp://ftp.kernel.org/pub/linux/kernel
184 Copyright: 1991 - 2009 Linus Torvalds and others.
186 The git repository for mainline kernel development is at:
187 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
189 This program is free software; you can redistribute it and/or modify
190 it under the terms of the GNU General Public License as published by
191 the Free Software Foundation; version 2 dated June, 1991.
193 On Debian GNU/Linux systems, the complete text of the GNU General Public
194 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
197 # Generate a control file
198 cat <<EOF > debian/control
199 Source: linux-upstream
202 Maintainer: $maintainer
203 Standards-Version: 3.8.4
204 Homepage: http://www.kernel.org/
207 if [ "$ARCH" = "um" ]; then
208 cat <<EOF >> debian/control
210 Package: $packagename
211 Provides: linux-image, linux-image-2.6, linux-modules-$version
213 Description: User Mode Linux kernel, version $version
214 User-mode Linux is a port of the Linux kernel to its own system call
215 interface. It provides a kind of virtual machine, which runs Linux
216 as a user process under another Linux kernel. This is useful for
217 kernel development, sandboxes, jails, experimentation, and
220 This package contains the Linux kernel, modules and corresponding other
221 files, version: $version.
225 cat <<EOF >> debian/control
227 Package: $packagename
228 Provides: linux-image, linux-image-2.6, linux-modules-$version
229 Suggests: $fwpackagename
231 Description: Linux kernel, version $version
232 This package contains the Linux kernel, modules and corresponding other
233 files, version: $version.
238 # Build header package
239 find . -name Makefile -o -name Kconfig\* -o -name \*.pl > /tmp/files$$
240 find arch/x86/include include scripts -type f >> /tmp/files$$
241 (cd $objtree; find .config Module.symvers include scripts -type f >> /tmp/objfiles$$)
242 destdir=$hdrdir/usr/src/linux-headers-$version
243 mkdir -p "$destdir" "$hdrdir/DEBIAN" "$hdrdir/usr/share/doc/$hdrpackagename"
244 tar -c -f - -T /tmp/files$$ | (cd $destdir; tar -xf -)
245 (cd $objtree; tar -c -f - -T /tmp/objfiles$$) | (cd $destdir; tar -xf -)
246 rm -f /tmp/files$$ /tmp/objfiles$$
247 arch=$(dpkg --print-architecture)
249 cat <<EOF >> debian/control
251 Package: $hdrpackagename
252 Provides: linux-headers, linux-headers-2.6
254 Description: Linux kernel headers for $KERNELRELEASE on $arch
255 This package provides kernel header files for $KERNELRELEASE on $arch
257 This is useful for people who need to build external modules
260 create_package "$hdrpackagename" "$hdrdir"
262 # Do we have firmware? Move it out of the way and build it into a package.
263 if [ -e "$tmpdir/lib/firmware" ]; then
264 mv "$tmpdir/lib/firmware" "$fwdir/lib/"
266 cat <<EOF >> debian/control
268 Package: $fwpackagename
270 Description: Linux kernel firmware, version $version
271 This package contains firmware from the Linux kernel, version $version.
274 create_package "$fwpackagename" "$fwdir"
277 cat <<EOF >> debian/control
279 Package: $headerpackagename
281 Provides: linux-kernel-headers
283 Description: Linux support headers for userspace development
284 This package provides userspaces headers from the Linux kernel. These headers
285 are used by the installed headers for GNU glibc and other system libraries.
288 create_package "$headerpackagename" "$headerdir"
289 create_package "$packagename" "$tmpdir"