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