scripts/package/Makefile: rpmbuild is needed for rpm targets
[linux-2.6-microblaze.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         # Create the package
29         dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
30         dpkg --build "$pdir" ..
31 }
32
33 set_debarch() {
34         # Attempt to find the correct Debian architecture
35         case "$UTS_MACHINE" in
36         i386|ia64|alpha)
37                 debarch="$UTS_MACHINE" ;;
38         x86_64)
39                 debarch=amd64 ;;
40         sparc*)
41                 debarch=sparc ;;
42         s390*)
43                 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
44         ppc*)
45                 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
46         parisc*)
47                 debarch=hppa ;;
48         mips*)
49                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
50         arm64)
51                 debarch=arm64 ;;
52         arm*)
53                 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
54         *)
55                 debarch=$(dpkg --print-architecture)
56                 echo "" >&2
57                 echo "** ** **  WARNING  ** ** **" >&2
58                 echo "" >&2
59                 echo "Your architecture doesn't have it's equivalent" >&2
60                 echo "Debian userspace architecture defined!" >&2
61                 echo "Falling back to using your current userspace instead!" >&2
62                 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
63                 echo "" >&2
64         esac
65         if [ -n "$KBUILD_DEBARCH" ] ; then
66                 debarch="$KBUILD_DEBARCH"
67         fi
68         forcearch="-DArchitecture=$debarch"
69
70 }
71
72 # Some variables and settings used throughout the script
73 version=$KERNELRELEASE
74 revision=$(cat .version)
75 if [ -n "$KDEB_PKGVERSION" ]; then
76         packageversion=$KDEB_PKGVERSION
77 else
78         packageversion=$version-$revision
79 fi
80 tmpdir="$objtree/debian/tmp"
81 fwdir="$objtree/debian/fwtmp"
82 kernel_headers_dir="$objtree/debian/hdrtmp"
83 libc_headers_dir="$objtree/debian/headertmp"
84 dbg_dir="$objtree/debian/dbgtmp"
85 packagename=linux-image-$version
86 fwpackagename=linux-firmware-image-$version
87 kernel_headers_packagename=linux-headers-$version
88 libc_headers_packagename=linux-libc-dev
89 dbg_packagename=$packagename-dbg
90 debarch=
91 forcearch=
92 set_debarch
93
94 if [ "$ARCH" = "um" ] ; then
95         packagename=user-mode-linux-$version
96 fi
97
98 # Not all arches have the same installed path in debian
99 # XXX: have each arch Makefile export a variable of the canonical image install
100 # path instead
101 case $ARCH in
102 um)
103         installed_image_path="usr/bin/linux-$version"
104         ;;
105 parisc|mips|powerpc)
106         installed_image_path="boot/vmlinux-$version"
107         ;;
108 *)
109         installed_image_path="boot/vmlinuz-$version"
110 esac
111
112 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
113
114 # Setup the directory structure
115 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
116 mkdir -m 755 -p "$tmpdir/DEBIAN"
117 mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
118 mkdir -m 755 -p "$fwdir/DEBIAN"
119 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
120 mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
121 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
122 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
123 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
124 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
125 if [ "$ARCH" = "um" ] ; then
126         mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
127 fi
128 if [ -n "$BUILD_DEBUG" ] ; then
129         mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
130         mkdir -m 755 -p "$dbg_dir/DEBIAN"
131 fi
132
133 # Build and install the kernel
134 if [ "$ARCH" = "um" ] ; then
135         $MAKE linux
136         cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
137         cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
138         gzip "$tmpdir/usr/share/doc/$packagename/config"
139 else
140         cp System.map "$tmpdir/boot/System.map-$version"
141         cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
142 fi
143 # Not all arches include the boot path in KBUILD_IMAGE
144 if [ -e $KBUILD_IMAGE ]; then
145         cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
146 else
147         cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
148 fi
149
150 if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
151         # Only some architectures with OF support have this target
152         if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
153                 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
154         fi
155 fi
156
157 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
158         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
159         rm -f "$tmpdir/lib/modules/$version/build"
160         rm -f "$tmpdir/lib/modules/$version/source"
161         if [ "$ARCH" = "um" ] ; then
162                 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
163                 rmdir "$tmpdir/lib/modules/$version"
164         fi
165         if [ -n "$BUILD_DEBUG" ] ; then
166                 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
167                         module=lib/modules/$module
168                         mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
169                         # only keep debug symbols in the debug file
170                         $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
171                         # strip original module from debug symbols
172                         $OBJCOPY --strip-debug $tmpdir/$module
173                         # then add a link to those
174                         $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
175                 done
176
177                 # resign stripped modules
178                 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
179                 if [ -n "$MODULE_SIG_ALL" ]; then
180                         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
181                 fi
182         fi
183 fi
184
185 if [ "$ARCH" != "um" ]; then
186         $MAKE headers_check KBUILD_SRC=
187         $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
188 fi
189
190 # Install the maintainer scripts
191 # Note: hook scripts under /etc/kernel are also executed by official Debian
192 # kernel packages, as well as kernel packages built using make-kpkg.
193 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
194 # so do we; recent versions of dracut and initramfs-tools will obey this.
195 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
196 if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
197         want_initrd=Yes
198 else
199         want_initrd=No
200 fi
201 for script in postinst postrm preinst prerm ; do
202         mkdir -p "$tmpdir$debhookdir/$script.d"
203         cat <<EOF > "$tmpdir/DEBIAN/$script"
204 #!/bin/sh
205
206 set -e
207
208 # Pass maintainer script parameters to hook scripts
209 export DEB_MAINT_PARAMS="\$*"
210
211 # Tell initramfs builder whether it's wanted
212 export INITRD=$want_initrd
213
214 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
215 exit 0
216 EOF
217         chmod 755 "$tmpdir/DEBIAN/$script"
218 done
219
220 # Try to determine maintainer and email values
221 if [ -n "$DEBEMAIL" ]; then
222        email=$DEBEMAIL
223 elif [ -n "$EMAIL" ]; then
224        email=$EMAIL
225 else
226        email=$(id -nu)@$(hostname -f)
227 fi
228 if [ -n "$DEBFULLNAME" ]; then
229        name=$DEBFULLNAME
230 elif [ -n "$NAME" ]; then
231        name=$NAME
232 else
233        name="Anonymous"
234 fi
235 maintainer="$name <$email>"
236
237 # Try to determine distribution
238 if [ -n "$KDEB_CHANGELOG_DIST" ]; then
239         distribution=$KDEB_CHANGELOG_DIST
240 elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
241         : # nothing to do in this case
242 else
243         distribution="unstable"
244         echo >&2 "Using default distribution of 'unstable' in the changelog"
245         echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
246 fi
247
248 # Generate a simple changelog template
249 cat <<EOF > debian/changelog
250 linux-upstream ($packageversion) $distribution; urgency=low
251
252   * Custom built Linux kernel.
253
254  -- $maintainer  $(date -R)
255 EOF
256
257 # Generate copyright file
258 cat <<EOF > debian/copyright
259 This is a packacked upstream version of the Linux kernel.
260
261 The sources may be found at most Linux ftp sites, including:
262 ftp://ftp.kernel.org/pub/linux/kernel
263
264 Copyright: 1991 - 2015 Linus Torvalds and others.
265
266 The git repository for mainline kernel development is at:
267 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
268
269     This program is free software; you can redistribute it and/or modify
270     it under the terms of the GNU General Public License as published by
271     the Free Software Foundation; version 2 dated June, 1991.
272
273 On Debian GNU/Linux systems, the complete text of the GNU General Public
274 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
275 EOF
276
277 # Generate a control file
278 cat <<EOF > debian/control
279 Source: linux-upstream
280 Section: kernel
281 Priority: optional
282 Maintainer: $maintainer
283 Standards-Version: 3.8.4
284 Homepage: http://www.kernel.org/
285 EOF
286
287 if [ "$ARCH" = "um" ]; then
288         cat <<EOF >> debian/control
289
290 Package: $packagename
291 Provides: linux-image, linux-image-2.6, linux-modules-$version
292 Architecture: any
293 Description: User Mode Linux kernel, version $version
294  User-mode Linux is a port of the Linux kernel to its own system call
295  interface.  It provides a kind of virtual machine, which runs Linux
296  as a user process under another Linux kernel.  This is useful for
297  kernel development, sandboxes, jails, experimentation, and
298  many other things.
299  .
300  This package contains the Linux kernel, modules and corresponding other
301  files, version: $version.
302 EOF
303
304 else
305         cat <<EOF >> debian/control
306
307 Package: $packagename
308 Provides: linux-image, linux-image-2.6, linux-modules-$version
309 Suggests: $fwpackagename
310 Architecture: any
311 Description: Linux kernel, version $version
312  This package contains the Linux kernel, modules and corresponding other
313  files, version: $version.
314 EOF
315
316 fi
317
318 # Build kernel header package
319 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
320 (cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
321 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
322 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
323 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
324 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
325 mkdir -p "$destdir"
326 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
327 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
328 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
329 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
330 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
331
332 cat <<EOF >> debian/control
333
334 Package: $kernel_headers_packagename
335 Provides: linux-headers, linux-headers-2.6
336 Architecture: any
337 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
338  This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
339  .
340  This is useful for people who need to build external modules
341 EOF
342
343 # Do we have firmware? Move it out of the way and build it into a package.
344 if [ -e "$tmpdir/lib/firmware" ]; then
345         mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
346         rmdir "$tmpdir/lib/firmware"
347
348         cat <<EOF >> debian/control
349
350 Package: $fwpackagename
351 Architecture: all
352 Description: Linux kernel firmware, version $version
353  This package contains firmware from the Linux kernel, version $version.
354 EOF
355
356         create_package "$fwpackagename" "$fwdir"
357 fi
358
359 cat <<EOF >> debian/control
360
361 Package: $libc_headers_packagename
362 Section: devel
363 Provides: linux-kernel-headers
364 Architecture: any
365 Description: Linux support headers for userspace development
366  This package provides userspaces headers from the Linux kernel.  These headers
367  are used by the installed headers for GNU glibc and other system libraries.
368 EOF
369
370 if [ "$ARCH" != "um" ]; then
371         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
372         create_package "$libc_headers_packagename" "$libc_headers_dir"
373 fi
374
375 create_package "$packagename" "$tmpdir"
376
377 if [ -n "$BUILD_DEBUG" ] ; then
378         # Build debug package
379         # Different tools want the image in different locations
380         # perf
381         mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
382         cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
383         # systemtap
384         mkdir -p $dbg_dir/usr/lib/debug/boot/
385         ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
386         # kdump-tools
387         ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
388
389         cat <<EOF >> debian/control
390
391 Package: $dbg_packagename
392 Section: debug
393 Provides: linux-debug, linux-debug-$version
394 Architecture: any
395 Description: Linux kernel debugging symbols for $version
396  This package will come in handy if you need to debug the kernel. It provides
397  all the necessary debug symbols for the kernel and its modules.
398 EOF
399
400         create_package "$dbg_packagename" "$dbg_dir"
401 fi
402
403 exit 0