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 $KCONFIG_CONFIG && echo el) ;;
46 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_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 dbg_dir="$objtree/debian/dbgtmp"
82 packagename=linux-image-$version
83 fwpackagename=linux-firmware-image
84 kernel_headers_packagename=linux-headers-$version
85 libc_headers_packagename=linux-libc-dev
86 dbg_packagename=$packagename-dbg
88 if [ "$ARCH" = "um" ] ; then
89 packagename=user-mode-linux-$version
92 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
94 # Setup the directory structure
95 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
96 mkdir -m 755 -p "$tmpdir/DEBIAN"
97 mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
98 mkdir -m 755 -p "$fwdir/DEBIAN"
99 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
100 mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
101 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
102 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
103 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
104 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
105 if [ "$ARCH" = "um" ] ; then
106 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
108 if [ -n "$BUILD_DEBUG" ] ; then
109 mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
110 mkdir -m 755 -p "$dbg_dir/DEBIAN"
113 # Build and install the kernel
114 if [ "$ARCH" = "um" ] ; then
116 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
117 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
118 gzip "$tmpdir/usr/share/doc/$packagename/config"
119 cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
121 cp System.map "$tmpdir/boot/System.map-$version"
122 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
123 # Not all arches include the boot path in KBUILD_IMAGE
124 if [ -e $KBUILD_IMAGE ]; then
125 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
127 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
131 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
132 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
133 rm -f "$tmpdir/lib/modules/$version/build"
134 rm -f "$tmpdir/lib/modules/$version/source"
135 if [ "$ARCH" = "um" ] ; then
136 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
137 rmdir "$tmpdir/lib/modules/$version"
139 if [ -n "$BUILD_DEBUG" ] ; then
142 for module in $(find lib/modules/ -name *.ko); do
143 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
144 # only keep debug symbols in the debug file
145 objcopy --only-keep-debug $module $dbg_dir/usr/lib/debug/$module
146 # strip original module from debug symbols
147 objcopy --strip-debug $module
148 # then add a link to those
149 objcopy --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $module
155 if [ "$ARCH" != "um" ]; then
156 $MAKE headers_check KBUILD_SRC=
157 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
160 # Install the maintainer scripts
161 # Note: hook scripts under /etc/kernel are also executed by official Debian
162 # kernel packages, as well as kernel packages built using make-kpkg
163 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
164 for script in postinst postrm preinst prerm ; do
165 mkdir -p "$tmpdir$debhookdir/$script.d"
166 cat <<EOF > "$tmpdir/DEBIAN/$script"
171 # Pass maintainer script parameters to hook scripts
172 export DEB_MAINT_PARAMS="\$*"
174 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
177 chmod 755 "$tmpdir/DEBIAN/$script"
180 # Try to determine maintainer and email values
181 if [ -n "$DEBEMAIL" ]; then
183 elif [ -n "$EMAIL" ]; then
186 email=$(id -nu)@$(hostname -f)
188 if [ -n "$DEBFULLNAME" ]; then
190 elif [ -n "$NAME" ]; then
195 maintainer="$name <$email>"
197 # Generate a simple changelog template
198 cat <<EOF > debian/changelog
199 linux-upstream ($packageversion) unstable; urgency=low
201 * Custom built Linux kernel.
203 -- $maintainer $(date -R)
206 # Generate copyright file
207 cat <<EOF > debian/copyright
208 This is a packacked upstream version of the Linux kernel.
210 The sources may be found at most Linux ftp sites, including:
211 ftp://ftp.kernel.org/pub/linux/kernel
213 Copyright: 1991 - 2009 Linus Torvalds and others.
215 The git repository for mainline kernel development is at:
216 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
218 This program is free software; you can redistribute it and/or modify
219 it under the terms of the GNU General Public License as published by
220 the Free Software Foundation; version 2 dated June, 1991.
222 On Debian GNU/Linux systems, the complete text of the GNU General Public
223 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
226 # Generate a control file
227 cat <<EOF > debian/control
228 Source: linux-upstream
231 Maintainer: $maintainer
232 Standards-Version: 3.8.4
233 Homepage: http://www.kernel.org/
236 if [ "$ARCH" = "um" ]; then
237 cat <<EOF >> debian/control
239 Package: $packagename
240 Provides: linux-image, linux-image-2.6, linux-modules-$version
242 Description: User Mode Linux kernel, version $version
243 User-mode Linux is a port of the Linux kernel to its own system call
244 interface. It provides a kind of virtual machine, which runs Linux
245 as a user process under another Linux kernel. This is useful for
246 kernel development, sandboxes, jails, experimentation, and
249 This package contains the Linux kernel, modules and corresponding other
250 files, version: $version.
254 cat <<EOF >> debian/control
256 Package: $packagename
257 Provides: linux-image, linux-image-2.6, linux-modules-$version
258 Suggests: $fwpackagename
260 Description: Linux kernel, version $version
261 This package contains the Linux kernel, modules and corresponding other
262 files, version: $version.
267 # Build header package
268 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
269 (cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
270 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
271 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
273 (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
274 (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
275 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
276 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
277 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
278 arch=$(dpkg --print-architecture)
280 cat <<EOF >> debian/control
282 Package: $kernel_headers_packagename
283 Provides: linux-headers, linux-headers-2.6
285 Description: Linux kernel headers for $KERNELRELEASE on $arch
286 This package provides kernel header files for $KERNELRELEASE on $arch
288 This is useful for people who need to build external modules
291 # Do we have firmware? Move it out of the way and build it into a package.
292 if [ -e "$tmpdir/lib/firmware" ]; then
293 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
294 rmdir "$tmpdir/lib/firmware"
296 cat <<EOF >> debian/control
298 Package: $fwpackagename
300 Description: Linux kernel firmware, version $version
301 This package contains firmware from the Linux kernel, version $version.
304 create_package "$fwpackagename" "$fwdir"
307 cat <<EOF >> debian/control
309 Package: $libc_headers_packagename
311 Provides: linux-kernel-headers
313 Description: Linux support headers for userspace development
314 This package provides userspaces headers from the Linux kernel. These headers
315 are used by the installed headers for GNU glibc and other system libraries.
318 if [ "$ARCH" != "um" ]; then
319 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
320 create_package "$libc_headers_packagename" "$libc_headers_dir"
323 create_package "$packagename" "$tmpdir"
325 if [ -n "$BUILD_DEBUG" ] ; then
326 # Build debug package
327 # Different tools want the image in different locations
329 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
330 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
332 mkdir -p $dbg_dir/usr/lib/debug/boot/
333 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
335 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
337 cat <<EOF >> debian/control
339 Package: $dbg_packagename
341 Provides: linux-debug, linux-debug-$version
343 Description: Linux kernel debugging symbols for $version
344 This package will come in handy if you need to debug the kernel. It provides
345 all the necessary debug symbols for the kernel and its modules.
348 create_package "$dbg_packagename" "$dbg_dir"