kbuild: create linux-headers package in deb-pkg
[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 hdrdir="$objtree/debian/hdrtmp"
80 packagename=linux-image-$version
81 fwpackagename=linux-firmware-image
82 hdrpackagename=linux-headers-$version
83
84 if [ "$ARCH" = "um" ] ; then
85         packagename=user-mode-linux-$version
86 fi
87
88 # Setup the directory structure
89 rm -rf "$tmpdir" "$fwdir" "$hdrdir"
90 mkdir -m 755 -p "$tmpdir/DEBIAN"
91 mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
92 mkdir -m 755 -p "$fwdir/DEBIAN"
93 mkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename"
94 if [ "$ARCH" = "um" ] ; then
95         mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
96 fi
97
98 # Build and install the kernel
99 if [ "$ARCH" = "um" ] ; then
100         $MAKE linux
101         cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
102         cp .config "$tmpdir/usr/share/doc/$packagename/config"
103         gzip "$tmpdir/usr/share/doc/$packagename/config"
104         cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
105 else 
106         cp System.map "$tmpdir/boot/System.map-$version"
107         cp .config "$tmpdir/boot/config-$version"
108         # Not all arches include the boot path in KBUILD_IMAGE
109         if [ -e $KBUILD_IMAGE ]; then
110                 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
111         else
112                 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
113         fi
114 fi
115
116 if grep -q '^CONFIG_MODULES=y' .config ; then
117         INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install
118         if [ "$ARCH" = "um" ] ; then
119                 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
120                 rmdir "$tmpdir/lib/modules/$version"
121         fi
122 fi
123
124 # Install the maintainer scripts
125 # Note: hook scripts under /etc/kernel are also executed by official Debian
126 # kernel packages, as well as kernel packages built using make-kpkg
127 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
128 for script in postinst postrm preinst prerm ; do
129         mkdir -p "$tmpdir$debhookdir/$script.d"
130         cat <<EOF > "$tmpdir/DEBIAN/$script"
131 #!/bin/sh
132
133 set -e
134
135 # Pass maintainer script parameters to hook scripts
136 export DEB_MAINT_PARAMS="\$*"
137
138 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
139 exit 0
140 EOF
141         chmod 755 "$tmpdir/DEBIAN/$script"
142 done
143
144 # Try to determine maintainer and email values
145 if [ -n "$DEBEMAIL" ]; then
146        email=$DEBEMAIL
147 elif [ -n "$EMAIL" ]; then
148        email=$EMAIL
149 else
150        email=$(id -nu)@$(hostname -f)
151 fi
152 if [ -n "$DEBFULLNAME" ]; then
153        name=$DEBFULLNAME
154 elif [ -n "$NAME" ]; then
155        name=$NAME
156 else
157        name="Anonymous"
158 fi
159 maintainer="$name <$email>"
160
161 # Generate a simple changelog template
162 cat <<EOF > debian/changelog
163 linux-upstream ($packageversion) unstable; urgency=low
164
165   * Custom built Linux kernel.
166
167  -- $maintainer  $(date -R)
168 EOF
169
170 # Generate copyright file
171 cat <<EOF > debian/copyright
172 This is a packacked upstream version of the Linux kernel.
173
174 The sources may be found at most Linux ftp sites, including:
175 ftp://ftp.kernel.org/pub/linux/kernel
176
177 Copyright: 1991 - 2009 Linus Torvalds and others.
178
179 The git repository for mainline kernel development is at:
180 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
181
182     This program is free software; you can redistribute it and/or modify
183     it under the terms of the GNU General Public License as published by
184     the Free Software Foundation; version 2 dated June, 1991.
185
186 On Debian GNU/Linux systems, the complete text of the GNU General Public
187 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
188 EOF
189
190 # Generate a control file
191 cat <<EOF > debian/control
192 Source: linux-upstream
193 Section: kernel
194 Priority: optional
195 Maintainer: $maintainer
196 Standards-Version: 3.8.4
197 Homepage: http://www.kernel.org/
198 EOF
199
200 if [ "$ARCH" = "um" ]; then
201         cat <<EOF >> debian/control
202
203 Package: $packagename
204 Provides: linux-image, linux-image-2.6, linux-modules-$version
205 Architecture: any
206 Description: User Mode Linux kernel, version $version
207  User-mode Linux is a port of the Linux kernel to its own system call
208  interface.  It provides a kind of virtual machine, which runs Linux
209  as a user process under another Linux kernel.  This is useful for
210  kernel development, sandboxes, jails, experimentation, and
211  many other things.
212  .
213  This package contains the Linux kernel, modules and corresponding other
214  files, version: $version.
215 EOF
216
217 else
218         cat <<EOF >> debian/control
219
220 Package: $packagename
221 Provides: linux-image, linux-image-2.6, linux-modules-$version
222 Suggests: $fwpackagename
223 Architecture: any
224 Description: Linux kernel, version $version
225  This package contains the Linux kernel, modules and corresponding other
226  files, version: $version.
227 EOF
228
229 fi
230
231 # Build header package
232 find . -name Makefile -o -name Kconfig\* -o -name \*.pl > /tmp/files$$
233 find arch/x86/include include scripts -type f >> /tmp/files$$
234 (cd $objtree; find .config Module.symvers include scripts -type f >> /tmp/objfiles$$)
235 destdir=$hdrdir/usr/src/linux-headers-$version
236 mkdir -p "$destdir" "$hdrdir/DEBIAN" "$hdrdir/usr/share/doc/$hdrpackagename"
237 tar -c -f - -T /tmp/files$$ | (cd $destdir; tar -xf -)
238 (cd $objtree; tar -c -f - -T /tmp/objfiles$$) | (cd $destdir; tar -xf -)
239 rm -f /tmp/files$$ /tmp/objfiles$$
240 arch=$(dpkg --print-architecture)
241
242 cat <<EOF >> debian/control
243
244 Package: $hdrpackagename
245 Provides: linux-headers, linux-headers-2.6
246 Architecture: $arch
247 Description: Linux kernel headers for $KERNELRELEASE on $arch
248  This package provides kernel header files for $KERNELRELEASE on $arch
249  .
250  This is useful for people who need to build external modules
251 EOF
252
253 create_package "$hdrpackagename" "$hdrdir"
254
255 # Do we have firmware? Move it out of the way and build it into a package.
256 if [ -e "$tmpdir/lib/firmware" ]; then
257         mv "$tmpdir/lib/firmware" "$fwdir/lib/"
258
259         cat <<EOF >> debian/control
260
261 Package: $fwpackagename
262 Architecture: all
263 Description: Linux kernel firmware, version $version
264  This package contains firmware from the Linux kernel, version $version.
265 EOF
266
267         create_package "$fwpackagename" "$fwdir"
268 fi
269
270 create_package "$packagename" "$tmpdir"
271
272 exit 0