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