builddeb: fix stripped module signatures if CONFIG_DEBUG_INFO and CONFIG_MODULE_SIG_A...
[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
64178cb6
AS
169
170 # resign stripped modules
171 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
172 if [ -n "$MODULE_SIG_ALL" ]; then
173 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
174 fi
810e8437 175 fi
1da177e4
LT
176fi
177
d7d357bc 178if [ "$ARCH" != "um" ]; then
dddcbb7c
JR
179 $MAKE headers_check KBUILD_SRC=
180 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
d7d357bc 181fi
e6807785 182
1da177e4 183# Install the maintainer scripts
fe233cb6 184# Note: hook scripts under /etc/kernel are also executed by official Debian
1c8ddae0
BH
185# kernel packages, as well as kernel packages built using make-kpkg.
186# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
187# so do we; recent versions of dracut and initramfs-tools will obey this.
fe233cb6 188debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1c8ddae0
BH
189if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
190 want_initrd=Yes
191else
192 want_initrd=No
193fi
1da177e4 194for script in postinst postrm preinst prerm ; do
fe233cb6 195 mkdir -p "$tmpdir$debhookdir/$script.d"
1da177e4
LT
196 cat <<EOF > "$tmpdir/DEBIAN/$script"
197#!/bin/sh
198
199set -e
200
4964451a 201# Pass maintainer script parameters to hook scripts
241ad11f 202export DEB_MAINT_PARAMS="\$*"
4964451a 203
1c8ddae0
BH
204# Tell initramfs builder whether it's wanted
205export INITRD=$want_initrd
206
c95182bf 207test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1da177e4
LT
208exit 0
209EOF
210 chmod 755 "$tmpdir/DEBIAN/$script"
211done
212
edec611d 213# Try to determine maintainer and email values
214if [ -n "$DEBEMAIL" ]; then
215 email=$DEBEMAIL
216elif [ -n "$EMAIL" ]; then
217 email=$EMAIL
218else
219 email=$(id -nu)@$(hostname -f)
220fi
221if [ -n "$DEBFULLNAME" ]; then
222 name=$DEBFULLNAME
223elif [ -n "$NAME" ]; then
224 name=$NAME
225else
226 name="Anonymous"
227fi
228maintainer="$name <$email>"
229
d9f711db
SD
230# Try to determine distribution
231if [ -n "$KDEB_CHANGELOG_DIST" ]; then
232 distribution=$KDEB_CHANGELOG_DIST
233elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
234 : # nothing to do in this case
235else
236 distribution="unstable"
237 echo >&2 "Using default distribution of 'unstable' in the changelog"
238 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
239fi
240
1da177e4
LT
241# Generate a simple changelog template
242cat <<EOF > debian/changelog
d9f711db 243linux-upstream ($packageversion) $distribution; urgency=low
1da177e4 244
a83ca277 245 * Custom built Linux kernel.
1da177e4 246
edec611d 247 -- $maintainer $(date -R)
1da177e4
LT
248EOF
249
9461f666
FP
250# Generate copyright file
251cat <<EOF > debian/copyright
252This is a packacked upstream version of the Linux kernel.
253
254The sources may be found at most Linux ftp sites, including:
255ftp://ftp.kernel.org/pub/linux/kernel
256
701ca30c 257Copyright: 1991 - 2015 Linus Torvalds and others.
9461f666
FP
258
259The git repository for mainline kernel development is at:
701ca30c 260git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
9461f666
FP
261
262 This program is free software; you can redistribute it and/or modify
263 it under the terms of the GNU General Public License as published by
264 the Free Software Foundation; version 2 dated June, 1991.
265
266On Debian GNU/Linux systems, the complete text of the GNU General Public
267License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
268EOF
269
1da177e4 270# Generate a control file
3e2ab256 271cat <<EOF > debian/control
4bf4cd49 272Source: linux-upstream
aa42abed 273Section: kernel
dc5962fd 274Priority: optional
edec611d 275Maintainer: $maintainer
2d7204ac 276Standards-Version: 3.8.4
ee6eed80 277Homepage: http://www.kernel.org/
3e2ab256
FP
278EOF
279
280if [ "$ARCH" = "um" ]; then
281 cat <<EOF >> debian/control
dc5962fd
SR
282
283Package: $packagename
8ebc2fe9 284Provides: linux-image, linux-image-2.6, linux-modules-$version
dc5962fd
SR
285Architecture: any
286Description: User Mode Linux kernel, version $version
287 User-mode Linux is a port of the Linux kernel to its own system call
288 interface. It provides a kind of virtual machine, which runs Linux
289 as a user process under another Linux kernel. This is useful for
290 kernel development, sandboxes, jails, experimentation, and
291 many other things.
292 .
293 This package contains the Linux kernel, modules and corresponding other
a83ca277 294 files, version: $version.
dc5962fd
SR
295EOF
296
297else
3e2ab256 298 cat <<EOF >> debian/control
1da177e4 299
687c3dac 300Package: $packagename
8ebc2fe9 301Provides: linux-image, linux-image-2.6, linux-modules-$version
bf1b3644 302Suggests: $fwpackagename
1da177e4 303Architecture: any
dc5962fd 304Description: Linux kernel, version $version
1da177e4 305 This package contains the Linux kernel, modules and corresponding other
a83ca277 306 files, version: $version.
1da177e4 307EOF
4f66199b 308
dc5962fd 309fi
1da177e4 310
8bf13561 311# Build kernel header package
a765a7ce
MM
312(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
313(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
8bf13561
FB
314(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
315(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
a765a7ce 316(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
ee81b786 317destdir=$kernel_headers_dir/usr/src/linux-headers-$version
318mkdir -p "$destdir"
a765a7ce
MM
319(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
320(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
d2091767 321(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
a47b6c61 322ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
6c635224 323rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
cd8d60a2
TT
324
325cat <<EOF >> debian/control
326
ee81b786 327Package: $kernel_headers_packagename
cd8d60a2 328Provides: linux-headers, linux-headers-2.6
f8ce239d
BH
329Architecture: any
330Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
331 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
cd8d60a2
TT
332 .
333 This is useful for people who need to build external modules
334EOF
335
bf1b3644
JM
336# Do we have firmware? Move it out of the way and build it into a package.
337if [ -e "$tmpdir/lib/firmware" ]; then
6607ddad 338 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
339 rmdir "$tmpdir/lib/firmware"
bf1b3644
JM
340
341 cat <<EOF >> debian/control
342
343Package: $fwpackagename
344Architecture: all
345Description: Linux kernel firmware, version $version
a83ca277 346 This package contains firmware from the Linux kernel, version $version.
bf1b3644
JM
347EOF
348
3e2ab256 349 create_package "$fwpackagename" "$fwdir"
bf1b3644
JM
350fi
351
e6807785 352cat <<EOF >> debian/control
353
ee81b786 354Package: $libc_headers_packagename
e6807785 355Section: devel
356Provides: linux-kernel-headers
357Architecture: any
358Description: Linux support headers for userspace development
359 This package provides userspaces headers from the Linux kernel. These headers
360 are used by the installed headers for GNU glibc and other system libraries.
361EOF
362
d7d357bc
JR
363if [ "$ARCH" != "um" ]; then
364 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
365 create_package "$libc_headers_packagename" "$libc_headers_dir"
366fi
367
3e2ab256 368create_package "$packagename" "$tmpdir"
1da177e4 369
810e8437
AA
370if [ -n "$BUILD_DEBUG" ] ; then
371 # Build debug package
372 # Different tools want the image in different locations
373 # perf
374 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
375 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
376 # systemtap
377 mkdir -p $dbg_dir/usr/lib/debug/boot/
378 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
379 # kdump-tools
380 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
381
382 cat <<EOF >> debian/control
383
384Package: $dbg_packagename
385Section: debug
386Provides: linux-debug, linux-debug-$version
387Architecture: any
388Description: Linux kernel debugging symbols for $version
389 This package will come in handy if you need to debug the kernel. It provides
390 all the necessary debug symbols for the kernel and its modules.
391EOF
392
393 create_package "$dbg_packagename" "$dbg_dir"
394fi
395
1da177e4 396exit 0
This page took 0.561151 seconds and 5 git commands to generate.