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