Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[pandora-kernel.git] / scripts / package / builddeb
1 #!/bin/sh
2 #
3 # builddeb 1.3
4 # Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
5 #
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
11 # removal.
12
13 set -e
14
15 create_package() {
16         local pname="$1" pdir="$2"
17
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"
23
24         # Fix ownership and permissions
25         chown -R root:root "$pdir"
26         chmod -R go-w "$pdir"
27
28         # Attempt to find the correct Debian architecture
29         local forcearch="" debarch=""
30         case "$UTS_MACHINE" in
31         i386|ia64|alpha)
32                 debarch="$UTS_MACHINE" ;;
33         x86_64)
34                 debarch=amd64 ;;
35         sparc*)
36                 debarch=sparc ;;
37         s390*)
38                 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
39         ppc*)
40                 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
41         parisc*)
42                 debarch=hppa ;;
43         mips*)
44                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
45         arm64)
46                 debarch=arm64 ;;
47         arm*)
48                 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
49         *)
50                 echo "" >&2
51                 echo "** ** **  WARNING  ** ** **" >&2
52                 echo "" >&2
53                 echo "Your architecture doesn't have it's equivalent" >&2
54                 echo "Debian userspace architecture defined!" >&2
55                 echo "Falling back to using your current userspace instead!" >&2
56                 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
57                 echo "" >&2
58         esac
59         if [ -n "$KBUILD_DEBARCH" ] ; then
60                 debarch="$KBUILD_DEBARCH"
61         fi
62         if [ -n "$debarch" ] ; then
63                 forcearch="-DArchitecture=$debarch"
64         fi
65
66         # Create the package
67         dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir"
68         dpkg --build "$pdir" ..
69 }
70
71 # Some variables and settings used throughout the script
72 version=$KERNELRELEASE
73 revision=$(cat .version)
74 if [ -n "$KDEB_PKGVERSION" ]; then
75         packageversion=$KDEB_PKGVERSION
76 else
77         packageversion=$version-$revision
78 fi
79 tmpdir="$objtree/debian/tmp"
80 fwdir="$objtree/debian/fwtmp"
81 kernel_headers_dir="$objtree/debian/hdrtmp"
82 libc_headers_dir="$objtree/debian/headertmp"
83 dbg_dir="$objtree/debian/dbgtmp"
84 packagename=linux-image-$version
85 fwpackagename=linux-firmware-image-$version
86 kernel_headers_packagename=linux-headers-$version
87 libc_headers_packagename=linux-libc-dev
88 dbg_packagename=$packagename-dbg
89
90 if [ "$ARCH" = "um" ] ; then
91         packagename=user-mode-linux-$version
92 fi
93
94 # Not all arches have the same installed path in debian
95 # XXX: have each arch Makefile export a variable of the canonical image install
96 # path instead
97 case $ARCH in
98 um)
99         installed_image_path="usr/bin/linux-$version"
100         ;;
101 parisc|mips|powerpc)
102         installed_image_path="boot/vmlinux-$version"
103         ;;
104 *)
105         installed_image_path="boot/vmlinuz-$version"
106 esac
107
108 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
109
110 # Setup the directory structure
111 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
112 mkdir -m 755 -p "$tmpdir/DEBIAN"
113 mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
114 mkdir -m 755 -p "$fwdir/DEBIAN"
115 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
116 mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
117 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
118 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
119 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
120 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
121 if [ "$ARCH" = "um" ] ; then
122         mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
123 fi
124 if [ -n "$BUILD_DEBUG" ] ; then
125         mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
126         mkdir -m 755 -p "$dbg_dir/DEBIAN"
127 fi
128
129 # Build and install the kernel
130 if [ "$ARCH" = "um" ] ; then
131         $MAKE linux
132         cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
133         cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
134         gzip "$tmpdir/usr/share/doc/$packagename/config"
135 else
136         cp System.map "$tmpdir/boot/System.map-$version"
137         cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
138 fi
139 # Not all arches include the boot path in KBUILD_IMAGE
140 if [ -e $KBUILD_IMAGE ]; then
141         cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
142 else
143         cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
144 fi
145
146 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
147         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
148         rm -f "$tmpdir/lib/modules/$version/build"
149         rm -f "$tmpdir/lib/modules/$version/source"
150         if [ "$ARCH" = "um" ] ; then
151                 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
152                 rmdir "$tmpdir/lib/modules/$version"
153         fi
154         if [ -n "$BUILD_DEBUG" ] ; then
155                 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
156                         module=lib/modules/$module
157                         mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
158                         # only keep debug symbols in the debug file
159                         $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
160                         # strip original module from debug symbols
161                         $OBJCOPY --strip-debug $tmpdir/$module
162                         # then add a link to those
163                         $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
164                 done
165         fi
166 fi
167
168 if [ "$ARCH" != "um" ]; then
169         $MAKE headers_check KBUILD_SRC=
170         $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
171 fi
172
173 # Install the maintainer scripts
174 # Note: hook scripts under /etc/kernel are also executed by official Debian
175 # kernel packages, as well as kernel packages built using make-kpkg.
176 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
177 # so do we; recent versions of dracut and initramfs-tools will obey this.
178 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
179 if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
180         want_initrd=Yes
181 else
182         want_initrd=No
183 fi
184 for script in postinst postrm preinst prerm ; do
185         mkdir -p "$tmpdir$debhookdir/$script.d"
186         cat <<EOF > "$tmpdir/DEBIAN/$script"
187 #!/bin/sh
188
189 set -e
190
191 # Pass maintainer script parameters to hook scripts
192 export DEB_MAINT_PARAMS="\$*"
193
194 # Tell initramfs builder whether it's wanted
195 export INITRD=$want_initrd
196
197 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
198 exit 0
199 EOF
200         chmod 755 "$tmpdir/DEBIAN/$script"
201 done
202
203 # Try to determine maintainer and email values
204 if [ -n "$DEBEMAIL" ]; then
205        email=$DEBEMAIL
206 elif [ -n "$EMAIL" ]; then
207        email=$EMAIL
208 else
209        email=$(id -nu)@$(hostname -f)
210 fi
211 if [ -n "$DEBFULLNAME" ]; then
212        name=$DEBFULLNAME
213 elif [ -n "$NAME" ]; then
214        name=$NAME
215 else
216        name="Anonymous"
217 fi
218 maintainer="$name <$email>"
219
220 # Generate a simple changelog template
221 cat <<EOF > debian/changelog
222 linux-upstream ($packageversion) unstable; urgency=low
223
224   * Custom built Linux kernel.
225
226  -- $maintainer  $(date -R)
227 EOF
228
229 # Generate copyright file
230 cat <<EOF > debian/copyright
231 This is a packacked upstream version of the Linux kernel.
232
233 The sources may be found at most Linux ftp sites, including:
234 ftp://ftp.kernel.org/pub/linux/kernel
235
236 Copyright: 1991 - 2009 Linus Torvalds and others.
237
238 The git repository for mainline kernel development is at:
239 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
240
241     This program is free software; you can redistribute it and/or modify
242     it under the terms of the GNU General Public License as published by
243     the Free Software Foundation; version 2 dated June, 1991.
244
245 On Debian GNU/Linux systems, the complete text of the GNU General Public
246 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
247 EOF
248
249 # Generate a control file
250 cat <<EOF > debian/control
251 Source: linux-upstream
252 Section: kernel
253 Priority: optional
254 Maintainer: $maintainer
255 Standards-Version: 3.8.4
256 Homepage: http://www.kernel.org/
257 EOF
258
259 if [ "$ARCH" = "um" ]; then
260         cat <<EOF >> debian/control
261
262 Package: $packagename
263 Provides: linux-image, linux-image-2.6, linux-modules-$version
264 Architecture: any
265 Description: User Mode Linux kernel, version $version
266  User-mode Linux is a port of the Linux kernel to its own system call
267  interface.  It provides a kind of virtual machine, which runs Linux
268  as a user process under another Linux kernel.  This is useful for
269  kernel development, sandboxes, jails, experimentation, and
270  many other things.
271  .
272  This package contains the Linux kernel, modules and corresponding other
273  files, version: $version.
274 EOF
275
276 else
277         cat <<EOF >> debian/control
278
279 Package: $packagename
280 Provides: linux-image, linux-image-2.6, linux-modules-$version
281 Suggests: $fwpackagename
282 Architecture: any
283 Description: Linux kernel, version $version
284  This package contains the Linux kernel, modules and corresponding other
285  files, version: $version.
286 EOF
287
288 fi
289
290 # Build kernel header package
291 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
292 (cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
293 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
294 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
295 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
296 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
297 mkdir -p "$destdir"
298 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
299 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
300 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
301 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
302 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
303
304 cat <<EOF >> debian/control
305
306 Package: $kernel_headers_packagename
307 Provides: linux-headers, linux-headers-2.6
308 Architecture: any
309 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
310  This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
311  .
312  This is useful for people who need to build external modules
313 EOF
314
315 # Do we have firmware? Move it out of the way and build it into a package.
316 if [ -e "$tmpdir/lib/firmware" ]; then
317         mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
318         rmdir "$tmpdir/lib/firmware"
319
320         cat <<EOF >> debian/control
321
322 Package: $fwpackagename
323 Architecture: all
324 Description: Linux kernel firmware, version $version
325  This package contains firmware from the Linux kernel, version $version.
326 EOF
327
328         create_package "$fwpackagename" "$fwdir"
329 fi
330
331 cat <<EOF >> debian/control
332
333 Package: $libc_headers_packagename
334 Section: devel
335 Provides: linux-kernel-headers
336 Architecture: any
337 Description: Linux support headers for userspace development
338  This package provides userspaces headers from the Linux kernel.  These headers
339  are used by the installed headers for GNU glibc and other system libraries.
340 EOF
341
342 if [ "$ARCH" != "um" ]; then
343         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
344         create_package "$libc_headers_packagename" "$libc_headers_dir"
345 fi
346
347 create_package "$packagename" "$tmpdir"
348
349 if [ -n "$BUILD_DEBUG" ] ; then
350         # Build debug package
351         # Different tools want the image in different locations
352         # perf
353         mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
354         cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
355         # systemtap
356         mkdir -p $dbg_dir/usr/lib/debug/boot/
357         ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
358         # kdump-tools
359         ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
360
361         cat <<EOF >> debian/control
362
363 Package: $dbg_packagename
364 Section: debug
365 Provides: linux-debug, linux-debug-$version
366 Architecture: any
367 Description: Linux kernel debugging symbols for $version
368  This package will come in handy if you need to debug the kernel. It provides
369  all the necessary debug symbols for the kernel and its modules.
370 EOF
371
372         create_package "$dbg_packagename" "$dbg_dir"
373 fi
374
375 exit 0