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