deb-pkg: split debug symbols in their own package
[cascardo/linux.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 ;;
39         ppc*)
40                 debarch=powerpc ;;
41         parisc*)
42                 debarch=hppa ;;
43         mips*)
44                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el) ;;
45         arm*)
46                 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el) ;;
47         *)
48                 echo "" >&2
49                 echo "** ** **  WARNING  ** ** **" >&2
50                 echo "" >&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
55                 echo "" >&2
56         esac
57         if [ -n "$KBUILD_DEBARCH" ] ; then
58                 debarch="$KBUILD_DEBARCH"
59         fi
60         if [ -n "$debarch" ] ; then
61                 forcearch="-DArchitecture=$debarch"
62         fi
63
64         # Create the package
65         dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir"
66         dpkg --build "$pdir" ..
67 }
68
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
74 else
75         packageversion=$version-$revision
76 fi
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
87
88 if [ "$ARCH" = "um" ] ; then
89         packagename=user-mode-linux-$version
90 fi
91
92 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
93
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"
107 fi
108 if [ -n "$BUILD_DEBUG" ] ; then
109         mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
110         mkdir -m 755 -p "$dbg_dir/DEBIAN"
111 fi
112
113 # Build and install the kernel
114 if [ "$ARCH" = "um" ] ; then
115         $MAKE linux
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"
120 else 
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"
126         else
127                 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
128         fi
129 fi
130
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"
138         fi
139         if [ -n "$BUILD_DEBUG" ] ; then
140                 (
141                         cd $tmpdir
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
150                         done
151                 )
152         fi
153 fi
154
155 if [ "$ARCH" != "um" ]; then
156         $MAKE headers_check KBUILD_SRC=
157         $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
158 fi
159
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"
167 #!/bin/sh
168
169 set -e
170
171 # Pass maintainer script parameters to hook scripts
172 export DEB_MAINT_PARAMS="\$*"
173
174 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
175 exit 0
176 EOF
177         chmod 755 "$tmpdir/DEBIAN/$script"
178 done
179
180 # Try to determine maintainer and email values
181 if [ -n "$DEBEMAIL" ]; then
182        email=$DEBEMAIL
183 elif [ -n "$EMAIL" ]; then
184        email=$EMAIL
185 else
186        email=$(id -nu)@$(hostname -f)
187 fi
188 if [ -n "$DEBFULLNAME" ]; then
189        name=$DEBFULLNAME
190 elif [ -n "$NAME" ]; then
191        name=$NAME
192 else
193        name="Anonymous"
194 fi
195 maintainer="$name <$email>"
196
197 # Generate a simple changelog template
198 cat <<EOF > debian/changelog
199 linux-upstream ($packageversion) unstable; urgency=low
200
201   * Custom built Linux kernel.
202
203  -- $maintainer  $(date -R)
204 EOF
205
206 # Generate copyright file
207 cat <<EOF > debian/copyright
208 This is a packacked upstream version of the Linux kernel.
209
210 The sources may be found at most Linux ftp sites, including:
211 ftp://ftp.kernel.org/pub/linux/kernel
212
213 Copyright: 1991 - 2009 Linus Torvalds and others.
214
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
217
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.
221
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'.
224 EOF
225
226 # Generate a control file
227 cat <<EOF > debian/control
228 Source: linux-upstream
229 Section: kernel
230 Priority: optional
231 Maintainer: $maintainer
232 Standards-Version: 3.8.4
233 Homepage: http://www.kernel.org/
234 EOF
235
236 if [ "$ARCH" = "um" ]; then
237         cat <<EOF >> debian/control
238
239 Package: $packagename
240 Provides: linux-image, linux-image-2.6, linux-modules-$version
241 Architecture: any
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
247  many other things.
248  .
249  This package contains the Linux kernel, modules and corresponding other
250  files, version: $version.
251 EOF
252
253 else
254         cat <<EOF >> debian/control
255
256 Package: $packagename
257 Provides: linux-image, linux-image-2.6, linux-modules-$version
258 Suggests: $fwpackagename
259 Architecture: any
260 Description: Linux kernel, version $version
261  This package contains the Linux kernel, modules and corresponding other
262  files, version: $version.
263 EOF
264
265 fi
266
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
272 mkdir -p "$destdir"
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)
279
280 cat <<EOF >> debian/control
281
282 Package: $kernel_headers_packagename
283 Provides: linux-headers, linux-headers-2.6
284 Architecture: $arch
285 Description: Linux kernel headers for $KERNELRELEASE on $arch
286  This package provides kernel header files for $KERNELRELEASE on $arch
287  .
288  This is useful for people who need to build external modules
289 EOF
290
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"
295
296         cat <<EOF >> debian/control
297
298 Package: $fwpackagename
299 Architecture: all
300 Description: Linux kernel firmware, version $version
301  This package contains firmware from the Linux kernel, version $version.
302 EOF
303
304         create_package "$fwpackagename" "$fwdir"
305 fi
306
307 cat <<EOF >> debian/control
308
309 Package: $libc_headers_packagename
310 Section: devel
311 Provides: linux-kernel-headers
312 Architecture: any
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.
316 EOF
317
318 if [ "$ARCH" != "um" ]; then
319         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
320         create_package "$libc_headers_packagename" "$libc_headers_dir"
321 fi
322
323 create_package "$packagename" "$tmpdir"
324
325 if [ -n "$BUILD_DEBUG" ] ; then
326         # Build debug package
327         # Different tools want the image in different locations
328         # perf
329         mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
330         cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
331         # systemtap
332         mkdir -p $dbg_dir/usr/lib/debug/boot/
333         ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
334         # kdump-tools
335         ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
336
337         cat <<EOF >> debian/control
338
339 Package: $dbg_packagename
340 Section: debug
341 Provides: linux-debug, linux-debug-$version
342 Architecture: any
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.
346 EOF
347
348         create_package "$dbg_packagename" "$dbg_dir"
349 fi
350
351 exit 0