kbuild: Only build linux-image package for UML
[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 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 if [ "$ARCH" != "um" ]; then
134         make headers_check
135         make headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
136 fi
137
138 # Install the maintainer scripts
139 # Note: hook scripts under /etc/kernel are also executed by official Debian
140 # kernel packages, as well as kernel packages built using make-kpkg
141 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
142 for script in postinst postrm preinst prerm ; do
143         mkdir -p "$tmpdir$debhookdir/$script.d"
144         cat <<EOF > "$tmpdir/DEBIAN/$script"
145 #!/bin/sh
146
147 set -e
148
149 # Pass maintainer script parameters to hook scripts
150 export DEB_MAINT_PARAMS="\$*"
151
152 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
153 exit 0
154 EOF
155         chmod 755 "$tmpdir/DEBIAN/$script"
156 done
157
158 # Try to determine maintainer and email values
159 if [ -n "$DEBEMAIL" ]; then
160        email=$DEBEMAIL
161 elif [ -n "$EMAIL" ]; then
162        email=$EMAIL
163 else
164        email=$(id -nu)@$(hostname -f)
165 fi
166 if [ -n "$DEBFULLNAME" ]; then
167        name=$DEBFULLNAME
168 elif [ -n "$NAME" ]; then
169        name=$NAME
170 else
171        name="Anonymous"
172 fi
173 maintainer="$name <$email>"
174
175 # Generate a simple changelog template
176 cat <<EOF > debian/changelog
177 linux-upstream ($packageversion) unstable; urgency=low
178
179   * Custom built Linux kernel.
180
181  -- $maintainer  $(date -R)
182 EOF
183
184 # Generate copyright file
185 cat <<EOF > debian/copyright
186 This is a packacked upstream version of the Linux kernel.
187
188 The sources may be found at most Linux ftp sites, including:
189 ftp://ftp.kernel.org/pub/linux/kernel
190
191 Copyright: 1991 - 2009 Linus Torvalds and others.
192
193 The git repository for mainline kernel development is at:
194 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
195
196     This program is free software; you can redistribute it and/or modify
197     it under the terms of the GNU General Public License as published by
198     the Free Software Foundation; version 2 dated June, 1991.
199
200 On Debian GNU/Linux systems, the complete text of the GNU General Public
201 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
202 EOF
203
204 # Generate a control file
205 cat <<EOF > debian/control
206 Source: linux-upstream
207 Section: kernel
208 Priority: optional
209 Maintainer: $maintainer
210 Standards-Version: 3.8.4
211 Homepage: http://www.kernel.org/
212 EOF
213
214 if [ "$ARCH" = "um" ]; then
215         cat <<EOF >> debian/control
216
217 Package: $packagename
218 Provides: linux-image, linux-image-2.6, linux-modules-$version
219 Architecture: any
220 Description: User Mode Linux kernel, version $version
221  User-mode Linux is a port of the Linux kernel to its own system call
222  interface.  It provides a kind of virtual machine, which runs Linux
223  as a user process under another Linux kernel.  This is useful for
224  kernel development, sandboxes, jails, experimentation, and
225  many other things.
226  .
227  This package contains the Linux kernel, modules and corresponding other
228  files, version: $version.
229 EOF
230
231 else
232         cat <<EOF >> debian/control
233
234 Package: $packagename
235 Provides: linux-image, linux-image-2.6, linux-modules-$version
236 Suggests: $fwpackagename
237 Architecture: any
238 Description: Linux kernel, version $version
239  This package contains the Linux kernel, modules and corresponding other
240  files, version: $version.
241 EOF
242
243 fi
244
245 # Build header package
246 (cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
247 (cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
248 (cd $objtree; find .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
249 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
250 mkdir -p "$destdir"
251 (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
252 (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
253 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
254 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
255 arch=$(dpkg --print-architecture)
256
257 cat <<EOF >> debian/control
258
259 Package: $kernel_headers_packagename
260 Provides: linux-headers, linux-headers-2.6
261 Architecture: $arch
262 Description: Linux kernel headers for $KERNELRELEASE on $arch
263  This package provides kernel header files for $KERNELRELEASE on $arch
264  .
265  This is useful for people who need to build external modules
266 EOF
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 if [ "$ARCH" != "um" ]; then
295         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
296         create_package "$libc_headers_packagename" "$libc_headers_dir"
297 fi
298
299 create_package "$packagename" "$tmpdir"
300
301 exit 0