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 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
101 if [ "$ARCH" = "um" ] ; then
102 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
105 # Build and install the kernel
106 if [ "$ARCH" = "um" ] ; then
108 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
109 cp .config "$tmpdir/usr/share/doc/$packagename/config"
110 gzip "$tmpdir/usr/share/doc/$packagename/config"
111 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
113 cp System.map "$tmpdir/boot/System.map-$version"
114 cp .config "$tmpdir/boot/config-$version"
115 # Not all arches include the boot path in KBUILD_IMAGE
116 if [ -e $KBUILD_IMAGE ]; then
117 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
119 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
123 if grep -q '^CONFIG_MODULES=y' .config ; then
124 INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install
125 rm -f "$tmpdir/lib/modules/$version/build"
126 rm -f "$tmpdir/lib/modules/$version/source"
127 if [ "$ARCH" = "um" ] ; then
128 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
129 rmdir "$tmpdir/lib/modules/$version"
134 make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
136 # Install the maintainer scripts
137 # Note: hook scripts under /etc/kernel are also executed by official Debian
138 # kernel packages, as well as kernel packages built using make-kpkg
139 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
140 for script in postinst postrm preinst prerm ; do
141 mkdir -p "$tmpdir$debhookdir/$script.d"
142 cat <<EOF > "$tmpdir/DEBIAN/$script"
147 # Pass maintainer script parameters to hook scripts
148 export DEB_MAINT_PARAMS="\$*"
150 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
153 chmod 755 "$tmpdir/DEBIAN/$script"
156 # Try to determine maintainer and email values
157 if [ -n "$DEBEMAIL" ]; then
159 elif [ -n "$EMAIL" ]; then
162 email=$(id -nu)@$(hostname -f)
164 if [ -n "$DEBFULLNAME" ]; then
166 elif [ -n "$NAME" ]; then
171 maintainer="$name <$email>"
173 # Generate a simple changelog template
174 cat <<EOF > debian/changelog
175 linux-upstream ($packageversion) unstable; urgency=low
177 * Custom built Linux kernel.
179 -- $maintainer $(date -R)
182 # Generate copyright file
183 cat <<EOF > debian/copyright
184 This is a packacked upstream version of the Linux kernel.
186 The sources may be found at most Linux ftp sites, including:
187 ftp://ftp.kernel.org/pub/linux/kernel
189 Copyright: 1991 - 2009 Linus Torvalds and others.
191 The git repository for mainline kernel development is at:
192 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
194 This program is free software; you can redistribute it and/or modify
195 it under the terms of the GNU General Public License as published by
196 the Free Software Foundation; version 2 dated June, 1991.
198 On Debian GNU/Linux systems, the complete text of the GNU General Public
199 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
202 # Generate a control file
203 cat <<EOF > debian/control
204 Source: linux-upstream
207 Maintainer: $maintainer
208 Standards-Version: 3.8.4
209 Homepage: http://www.kernel.org/
212 if [ "$ARCH" = "um" ]; then
213 cat <<EOF >> debian/control
215 Package: $packagename
216 Provides: linux-image, linux-image-2.6, linux-modules-$version
218 Description: User Mode Linux kernel, version $version
219 User-mode Linux is a port of the Linux kernel to its own system call
220 interface. It provides a kind of virtual machine, which runs Linux
221 as a user process under another Linux kernel. This is useful for
222 kernel development, sandboxes, jails, experimentation, and
225 This package contains the Linux kernel, modules and corresponding other
226 files, version: $version.
230 cat <<EOF >> debian/control
232 Package: $packagename
233 Provides: linux-image, linux-image-2.6, linux-modules-$version
234 Suggests: $fwpackagename
236 Description: Linux kernel, version $version
237 This package contains the Linux kernel, modules and corresponding other
238 files, version: $version.
243 # Build header package
244 (cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
245 (cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
246 (cd $objtree; find .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
247 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
249 (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
250 (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
251 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
252 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
253 arch=$(dpkg --print-architecture)
255 cat <<EOF >> debian/control
257 Package: $kernel_headers_packagename
258 Provides: linux-headers, linux-headers-2.6
260 Description: Linux kernel headers for $KERNELRELEASE on $arch
261 This package provides kernel header files for $KERNELRELEASE on $arch
263 This is useful for people who need to build external modules
266 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
268 # Do we have firmware? Move it out of the way and build it into a package.
269 if [ -e "$tmpdir/lib/firmware" ]; then
270 mv "$tmpdir/lib/firmware" "$fwdir/lib/"
272 cat <<EOF >> debian/control
274 Package: $fwpackagename
276 Description: Linux kernel firmware, version $version
277 This package contains firmware from the Linux kernel, version $version.
280 create_package "$fwpackagename" "$fwdir"
283 cat <<EOF >> debian/control
285 Package: $libc_headers_packagename
287 Provides: linux-kernel-headers
289 Description: Linux support headers for userspace development
290 This package provides userspaces headers from the Linux kernel. These headers
291 are used by the installed headers for GNU glibc and other system libraries.
294 create_package "$libc_headers_packagename" "$libc_headers_dir"
295 create_package "$packagename" "$tmpdir"