deb-pkg: move setting debarch for a separate function
[deliverable/linux.git] / scripts / package / builddeb
CommitLineData
1da177e4
LT
1#!/bin/sh
2#
4964451a 3# builddeb 1.3
1da177e4
LT
4# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
5#
6# Simple script to generate a deb package for a Linux kernel. All the
4f66199b 7# complexity of what to do with a kernel after it is installed or removed
1da177e4 8# is left to other scripts and packages: they can install scripts in the
fe233cb6
FP
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.
1da177e4
LT
12
13set -e
14
3e2ab256
FP
15create_package() {
16 local pname="$1" pdir="$2"
17
9461f666 18 cp debian/copyright "$pdir/usr/share/doc/$pname/"
1ab18486 19 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
20 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
b59a1225
FJ
21 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
22 | xargs -r0 md5sum > DEBIAN/md5sums"
9461f666 23
3e2ab256
FP
24 # Fix ownership and permissions
25 chown -R root:root "$pdir"
26 chmod -R go-w "$pdir"
27
dca0c024
RV
28 # Create the package
29 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
30 dpkg --build "$pdir" ..
31}
32
33set_debarch() {
10f26fa6 34 # Attempt to find the correct Debian architecture
10f26fa6
AST
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*)
a1323fd1 43 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
10f26fa6 44 ppc*)
22739edf 45 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
10f26fa6
AST
46 parisc*)
47 debarch=hppa ;;
48 mips*)
c5e318f6 49 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
a8d9c9f1
FB
50 arm64)
51 debarch=arm64 ;;
10f26fa6 52 arm*)
c5e318f6 53 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
10f26fa6 54 *)
dca0c024 55 debarch=$(dpkg --print-architecture)
10f26fa6
AST
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
55f88ecc
AST
65 if [ -n "$KBUILD_DEBARCH" ] ; then
66 debarch="$KBUILD_DEBARCH"
67 fi
dca0c024 68 forcearch="-DArchitecture=$debarch"
10f26fa6 69
3e2ab256
FP
70}
71
1da177e4
LT
72# Some variables and settings used throughout the script
73version=$KERNELRELEASE
4f66199b 74revision=$(cat .version)
c72c75db
FP
75if [ -n "$KDEB_PKGVERSION" ]; then
76 packageversion=$KDEB_PKGVERSION
77else
78 packageversion=$version-$revision
79fi
1da177e4 80tmpdir="$objtree/debian/tmp"
bf1b3644 81fwdir="$objtree/debian/fwtmp"
ee81b786 82kernel_headers_dir="$objtree/debian/hdrtmp"
83libc_headers_dir="$objtree/debian/headertmp"
810e8437 84dbg_dir="$objtree/debian/dbgtmp"
f7a2c31f 85packagename=linux-image-$version
95e2a7d8 86fwpackagename=linux-firmware-image-$version
ee81b786 87kernel_headers_packagename=linux-headers-$version
88libc_headers_packagename=linux-libc-dev
810e8437 89dbg_packagename=$packagename-dbg
dca0c024
RV
90debarch=
91forcearch=
92set_debarch
687c3dac 93
4f66199b 94if [ "$ARCH" = "um" ] ; then
687c3dac
SR
95 packagename=user-mode-linux-$version
96fi
1da177e4 97
9de70176
AA
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
810e8437
AA
112BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
113
1da177e4 114# Setup the directory structure
810e8437 115rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
e86c2412 116mkdir -m 755 -p "$tmpdir/DEBIAN"
117mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
118mkdir -m 755 -p "$fwdir/DEBIAN"
6607ddad 119mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
ee81b786 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"
a47b6c61 124mkdir -p "$kernel_headers_dir/lib/modules/$version/"
4f66199b 125if [ "$ARCH" = "um" ] ; then
9461f666 126 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
687c3dac 127fi
810e8437
AA
128if [ -n "$BUILD_DEBUG" ] ; then
129 mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
130 mkdir -m 755 -p "$dbg_dir/DEBIAN"
131fi
1da177e4
LT
132
133# Build and install the kernel
4f66199b 134if [ "$ARCH" = "um" ] ; then
687c3dac
SR
135 $MAKE linux
136 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
d2091767 137 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
687c3dac 138 gzip "$tmpdir/usr/share/doc/$packagename/config"
38385f8f 139else
687c3dac 140 cp System.map "$tmpdir/boot/System.map-$version"
d2091767 141 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
9de70176
AA
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"
687c3dac 148fi
1da177e4 149
d2091767 150if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
dddcbb7c 151 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
a47b6c61
JR
152 rm -f "$tmpdir/lib/modules/$version/build"
153 rm -f "$tmpdir/lib/modules/$version/source"
4f66199b 154 if [ "$ARCH" = "um" ] ; then
687c3dac
SR
155 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
156 rmdir "$tmpdir/lib/modules/$version"
157 fi
810e8437 158 if [ -n "$BUILD_DEBUG" ] ; then
2d087139
MM
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
810e8437 169 fi
1da177e4
LT
170fi
171
d7d357bc 172if [ "$ARCH" != "um" ]; then
dddcbb7c
JR
173 $MAKE headers_check KBUILD_SRC=
174 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
d7d357bc 175fi
e6807785 176
1da177e4 177# Install the maintainer scripts
fe233cb6 178# Note: hook scripts under /etc/kernel are also executed by official Debian
1c8ddae0
BH
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.
fe233cb6 182debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1c8ddae0
BH
183if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
184 want_initrd=Yes
185else
186 want_initrd=No
187fi
1da177e4 188for script in postinst postrm preinst prerm ; do
fe233cb6 189 mkdir -p "$tmpdir$debhookdir/$script.d"
1da177e4
LT
190 cat <<EOF > "$tmpdir/DEBIAN/$script"
191#!/bin/sh
192
193set -e
194
4964451a 195# Pass maintainer script parameters to hook scripts
241ad11f 196export DEB_MAINT_PARAMS="\$*"
4964451a 197
1c8ddae0
BH
198# Tell initramfs builder whether it's wanted
199export INITRD=$want_initrd
200
c95182bf 201test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1da177e4
LT
202exit 0
203EOF
204 chmod 755 "$tmpdir/DEBIAN/$script"
205done
206
edec611d 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
d9f711db
SD
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
1da177e4
LT
235# Generate a simple changelog template
236cat <<EOF > debian/changelog
d9f711db 237linux-upstream ($packageversion) $distribution; urgency=low
1da177e4 238
a83ca277 239 * Custom built Linux kernel.
1da177e4 240
edec611d 241 -- $maintainer $(date -R)
1da177e4
LT
242EOF
243
9461f666
FP
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
701ca30c 251Copyright: 1991 - 2015 Linus Torvalds and others.
9461f666
FP
252
253The git repository for mainline kernel development is at:
701ca30c 254git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
9461f666
FP
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
1da177e4 264# Generate a control file
3e2ab256 265cat <<EOF > debian/control
4bf4cd49 266Source: linux-upstream
aa42abed 267Section: kernel
dc5962fd 268Priority: optional
edec611d 269Maintainer: $maintainer
2d7204ac 270Standards-Version: 3.8.4
ee6eed80 271Homepage: http://www.kernel.org/
3e2ab256
FP
272EOF
273
274if [ "$ARCH" = "um" ]; then
275 cat <<EOF >> debian/control
dc5962fd
SR
276
277Package: $packagename
8ebc2fe9 278Provides: linux-image, linux-image-2.6, linux-modules-$version
dc5962fd
SR
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
a83ca277 288 files, version: $version.
dc5962fd
SR
289EOF
290
291else
3e2ab256 292 cat <<EOF >> debian/control
1da177e4 293
687c3dac 294Package: $packagename
8ebc2fe9 295Provides: linux-image, linux-image-2.6, linux-modules-$version
bf1b3644 296Suggests: $fwpackagename
1da177e4 297Architecture: any
dc5962fd 298Description: Linux kernel, version $version
1da177e4 299 This package contains the Linux kernel, modules and corresponding other
a83ca277 300 files, version: $version.
1da177e4 301EOF
4f66199b 302
dc5962fd 303fi
1da177e4 304
8bf13561 305# Build kernel header package
a765a7ce
MM
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"
8bf13561
FB
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"
a765a7ce 310(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
ee81b786 311destdir=$kernel_headers_dir/usr/src/linux-headers-$version
312mkdir -p "$destdir"
a765a7ce
MM
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 -)
d2091767 315(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
a47b6c61 316ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
6c635224 317rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
cd8d60a2
TT
318
319cat <<EOF >> debian/control
320
ee81b786 321Package: $kernel_headers_packagename
cd8d60a2 322Provides: linux-headers, linux-headers-2.6
f8ce239d
BH
323Architecture: any
324Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
325 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
cd8d60a2
TT
326 .
327 This is useful for people who need to build external modules
328EOF
329
bf1b3644
JM
330# Do we have firmware? Move it out of the way and build it into a package.
331if [ -e "$tmpdir/lib/firmware" ]; then
6607ddad 332 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
333 rmdir "$tmpdir/lib/firmware"
bf1b3644
JM
334
335 cat <<EOF >> debian/control
336
337Package: $fwpackagename
338Architecture: all
339Description: Linux kernel firmware, version $version
a83ca277 340 This package contains firmware from the Linux kernel, version $version.
bf1b3644
JM
341EOF
342
3e2ab256 343 create_package "$fwpackagename" "$fwdir"
bf1b3644
JM
344fi
345
e6807785 346cat <<EOF >> debian/control
347
ee81b786 348Package: $libc_headers_packagename
e6807785 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
d7d357bc
JR
357if [ "$ARCH" != "um" ]; then
358 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
359 create_package "$libc_headers_packagename" "$libc_headers_dir"
360fi
361
3e2ab256 362create_package "$packagename" "$tmpdir"
1da177e4 363
810e8437
AA
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
1da177e4 390exit 0
This page took 0.567154 seconds and 5 git commands to generate.