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 kernel_headers_dir="$objtree/debian/hdrtmp"
80 libc_headers_dir="$objtree/debian/headertmp"
81 packagename=linux-image-$version
82 fwpackagename=linux-firmware-image
83 kernel_headers_packagename=linux-headers-$version
84 libc_headers_packagename=linux-libc-dev
86 if [ "$ARCH" = "um" ] ; then
87 packagename=user-mode-linux-$version
90 # Setup the directory structure
91 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir"
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 "$libc_headers_dir/DEBIAN"
97 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
98 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
99 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
100 if [ "$ARCH" = "um" ] ; then
101 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
104 # Build and install the kernel
105 if [ "$ARCH" = "um" ] ; then
107 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
108 cp .config "$tmpdir/usr/share/doc/$packagename/config"
109 gzip "$tmpdir/usr/share/doc/$packagename/config"
110 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
112 cp System.map "$tmpdir/boot/System.map-$version"
113 cp .config "$tmpdir/boot/config-$version"
114 # Not all arches include the boot path in KBUILD_IMAGE
115 if [ -e $KBUILD_IMAGE ]; then
116 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
118 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
122 if grep -q '^CONFIG_MODULES=y' .config ; then
123 INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install
124 if [ "$ARCH" = "um" ] ; then
125 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
126 rmdir "$tmpdir/lib/modules/$version"
131 make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
133 # Install the maintainer scripts
134 # Note: hook scripts under /etc/kernel are also executed by official Debian
135 # kernel packages, as well as kernel packages built using make-kpkg
136 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
137 for script in postinst postrm preinst prerm ; do
138 mkdir -p "$tmpdir$debhookdir/$script.d"
139 cat <<EOF > "$tmpdir/DEBIAN/$script"
144 # Pass maintainer script parameters to hook scripts
145 export DEB_MAINT_PARAMS="\$*"
147 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
150 chmod 755 "$tmpdir/DEBIAN/$script"
153 # Try to determine maintainer and email values
154 if [ -n "$DEBEMAIL" ]; then
156 elif [ -n "$EMAIL" ]; then
159 email=$(id -nu)@$(hostname -f)
161 if [ -n "$DEBFULLNAME" ]; then
163 elif [ -n "$NAME" ]; then
168 maintainer="$name <$email>"
170 # Generate a simple changelog template
171 cat <<EOF > debian/changelog
172 linux-upstream ($packageversion) unstable; urgency=low
174 * Custom built Linux kernel.
176 -- $maintainer $(date -R)
179 # Generate copyright file
180 cat <<EOF > debian/copyright
181 This is a packacked upstream version of the Linux kernel.
183 The sources may be found at most Linux ftp sites, including:
184 ftp://ftp.kernel.org/pub/linux/kernel
186 Copyright: 1991 - 2009 Linus Torvalds and others.
188 The git repository for mainline kernel development is at:
189 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
191 This program is free software; you can redistribute it and/or modify
192 it under the terms of the GNU General Public License as published by
193 the Free Software Foundation; version 2 dated June, 1991.
195 On Debian GNU/Linux systems, the complete text of the GNU General Public
196 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
199 # Generate a control file
200 cat <<EOF > debian/control
201 Source: linux-upstream
204 Maintainer: $maintainer
205 Standards-Version: 3.8.4
206 Homepage: http://www.kernel.org/
209 if [ "$ARCH" = "um" ]; then
210 cat <<EOF >> debian/control
212 Package: $packagename
213 Provides: linux-image, linux-image-2.6, linux-modules-$version
215 Description: User Mode Linux kernel, version $version
216 User-mode Linux is a port of the Linux kernel to its own system call
217 interface. It provides a kind of virtual machine, which runs Linux
218 as a user process under another Linux kernel. This is useful for
219 kernel development, sandboxes, jails, experimentation, and
222 This package contains the Linux kernel, modules and corresponding other
223 files, version: $version.
227 cat <<EOF >> debian/control
229 Package: $packagename
230 Provides: linux-image, linux-image-2.6, linux-modules-$version
231 Suggests: $fwpackagename
233 Description: Linux kernel, version $version
234 This package contains the Linux kernel, modules and corresponding other
235 files, version: $version.
240 # Build header package
241 find . -name Makefile -o -name Kconfig\* -o -name \*.pl > /tmp/files$$
242 find arch/x86/include include scripts -type f >> /tmp/files$$
243 (cd $objtree; find .config Module.symvers include scripts -type f >> /tmp/objfiles$$)
244 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
246 tar -c -f - -T /tmp/files$$ | (cd $destdir; tar -xf -)
247 (cd $objtree; tar -c -f - -T /tmp/objfiles$$) | (cd $destdir; tar -xf -)
248 rm -f /tmp/files$$ /tmp/objfiles$$
249 arch=$(dpkg --print-architecture)
251 cat <<EOF >> debian/control
253 Package: $kernel_headers_packagename
254 Provides: linux-headers, linux-headers-2.6
256 Description: Linux kernel headers for $KERNELRELEASE on $arch
257 This package provides kernel header files for $KERNELRELEASE on $arch
259 This is useful for people who need to build external modules
262 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
264 # Do we have firmware? Move it out of the way and build it into a package.
265 if [ -e "$tmpdir/lib/firmware" ]; then
266 mv "$tmpdir/lib/firmware" "$fwdir/lib/"
268 cat <<EOF >> debian/control
270 Package: $fwpackagename
272 Description: Linux kernel firmware, version $version
273 This package contains firmware from the Linux kernel, version $version.
276 create_package "$fwpackagename" "$fwdir"
279 cat <<EOF >> debian/control
281 Package: $libc_headers_packagename
283 Provides: linux-kernel-headers
285 Description: Linux support headers for userspace development
286 This package provides userspaces headers from the Linux kernel. These headers
287 are used by the installed headers for GNU glibc and other system libraries.
290 create_package "$libc_headers_packagename" "$libc_headers_dir"
291 create_package "$packagename" "$tmpdir"