Merge branch 'next' into for-linus
[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 ;;
39         ppc*)
40                 debarch=powerpc ;;
41         parisc*)
42                 debarch=hppa ;;
43         mips*)
44                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;;
45         arm*)
46                 debarch=arm$(grep -q CONFIG_AEABI=y .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 packagename=linux-image-$version
82 fwpackagename=linux-firmware-image
83 kernel_headers_packagename=linux-headers-$version
84 libc_headers_packagename=linux-libc-dev
85
86 if [ "$ARCH" = "um" ] ; then
87         packagename=user-mode-linux-$version
88 fi
89
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"
102 fi
103
104 # Build and install the kernel
105 if [ "$ARCH" = "um" ] ; then
106         $MAKE linux
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"
111 else 
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"
117         else
118                 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
119         fi
120 fi
121
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"
127         fi
128 fi
129
130 make headers_check
131 make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
132
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"
140 #!/bin/sh
141
142 set -e
143
144 # Pass maintainer script parameters to hook scripts
145 export DEB_MAINT_PARAMS="\$*"
146
147 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
148 exit 0
149 EOF
150         chmod 755 "$tmpdir/DEBIAN/$script"
151 done
152
153 # Try to determine maintainer and email values
154 if [ -n "$DEBEMAIL" ]; then
155        email=$DEBEMAIL
156 elif [ -n "$EMAIL" ]; then
157        email=$EMAIL
158 else
159        email=$(id -nu)@$(hostname -f)
160 fi
161 if [ -n "$DEBFULLNAME" ]; then
162        name=$DEBFULLNAME
163 elif [ -n "$NAME" ]; then
164        name=$NAME
165 else
166        name="Anonymous"
167 fi
168 maintainer="$name <$email>"
169
170 # Generate a simple changelog template
171 cat <<EOF > debian/changelog
172 linux-upstream ($packageversion) unstable; urgency=low
173
174   * Custom built Linux kernel.
175
176  -- $maintainer  $(date -R)
177 EOF
178
179 # Generate copyright file
180 cat <<EOF > debian/copyright
181 This is a packacked upstream version of the Linux kernel.
182
183 The sources may be found at most Linux ftp sites, including:
184 ftp://ftp.kernel.org/pub/linux/kernel
185
186 Copyright: 1991 - 2009 Linus Torvalds and others.
187
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
190
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.
194
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'.
197 EOF
198
199 # Generate a control file
200 cat <<EOF > debian/control
201 Source: linux-upstream
202 Section: kernel
203 Priority: optional
204 Maintainer: $maintainer
205 Standards-Version: 3.8.4
206 Homepage: http://www.kernel.org/
207 EOF
208
209 if [ "$ARCH" = "um" ]; then
210         cat <<EOF >> debian/control
211
212 Package: $packagename
213 Provides: linux-image, linux-image-2.6, linux-modules-$version
214 Architecture: any
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
220  many other things.
221  .
222  This package contains the Linux kernel, modules and corresponding other
223  files, version: $version.
224 EOF
225
226 else
227         cat <<EOF >> debian/control
228
229 Package: $packagename
230 Provides: linux-image, linux-image-2.6, linux-modules-$version
231 Suggests: $fwpackagename
232 Architecture: any
233 Description: Linux kernel, version $version
234  This package contains the Linux kernel, modules and corresponding other
235  files, version: $version.
236 EOF
237
238 fi
239
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
245 mkdir -p "$destdir"
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)
250
251 cat <<EOF >> debian/control
252
253 Package: $kernel_headers_packagename
254 Provides: linux-headers, linux-headers-2.6
255 Architecture: $arch
256 Description: Linux kernel headers for $KERNELRELEASE on $arch
257  This package provides kernel header files for $KERNELRELEASE on $arch
258  .
259  This is useful for people who need to build external modules
260 EOF
261
262 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
263
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/"
267
268         cat <<EOF >> debian/control
269
270 Package: $fwpackagename
271 Architecture: all
272 Description: Linux kernel firmware, version $version
273  This package contains firmware from the Linux kernel, version $version.
274 EOF
275
276         create_package "$fwpackagename" "$fwdir"
277 fi
278
279 cat <<EOF >> debian/control
280
281 Package: $libc_headers_packagename
282 Section: devel
283 Provides: linux-kernel-headers
284 Architecture: any
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.
288 EOF
289
290 create_package "$libc_headers_packagename" "$libc_headers_dir"
291 create_package "$packagename" "$tmpdir"
292
293 exit 0