]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - scripts/package/builddeb
Merge tag 'reset-fixes-for-4.14' of git://git.pengutronix.de/git/pza/linux into fixes
[mirror_ubuntu-bionic-kernel.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
bf7b0055
RV
18 mkdir -m 755 -p "$pdir/DEBIAN"
19 mkdir -p "$pdir/usr/share/doc/$pname"
9461f666 20 cp debian/copyright "$pdir/usr/share/doc/$pname/"
1ab18486 21 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
22 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
b59a1225
FJ
23 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
24 | xargs -r0 md5sum > DEBIAN/md5sums"
9461f666 25
3e2ab256
FP
26 # Fix ownership and permissions
27 chown -R root:root "$pdir"
28 chmod -R go-w "$pdir"
ca617dc6
HS
29 # in case we are in a restrictive umask environment like 0077
30 chmod -R a+rX "$pdir"
3e2ab256 31
dca0c024
RV
32 # Create the package
33 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
34 dpkg --build "$pdir" ..
35}
36
37set_debarch() {
10f26fa6 38 # Attempt to find the correct Debian architecture
10f26fa6
AST
39 case "$UTS_MACHINE" in
40 i386|ia64|alpha)
41 debarch="$UTS_MACHINE" ;;
42 x86_64)
43 debarch=amd64 ;;
44 sparc*)
45 debarch=sparc ;;
46 s390*)
a1323fd1 47 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
10f26fa6 48 ppc*)
22739edf 49 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
10f26fa6
AST
50 parisc*)
51 debarch=hppa ;;
52 mips*)
c5e318f6 53 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
152b695d 54 aarch64|arm64)
a8d9c9f1 55 debarch=arm64 ;;
10f26fa6 56 arm*)
63a478fb
BH
57 if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then
58 if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then
59 debarch=armhf
60 else
61 debarch=armel
62 fi
63 else
64 debarch=arm
65 fi
66 ;;
10f26fa6 67 *)
dca0c024 68 debarch=$(dpkg --print-architecture)
10f26fa6
AST
69 echo "" >&2
70 echo "** ** ** WARNING ** ** **" >&2
71 echo "" >&2
9eb3c958 72 echo "Your architecture doesn't have its equivalent" >&2
10f26fa6
AST
73 echo "Debian userspace architecture defined!" >&2
74 echo "Falling back to using your current userspace instead!" >&2
75 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
76 echo "" >&2
77 esac
55f88ecc
AST
78 if [ -n "$KBUILD_DEBARCH" ] ; then
79 debarch="$KBUILD_DEBARCH"
80 fi
dca0c024 81 forcearch="-DArchitecture=$debarch"
10f26fa6 82
3e2ab256
FP
83}
84
1da177e4
LT
85# Some variables and settings used throughout the script
86version=$KERNELRELEASE
4f66199b 87revision=$(cat .version)
c72c75db
FP
88if [ -n "$KDEB_PKGVERSION" ]; then
89 packageversion=$KDEB_PKGVERSION
90else
91 packageversion=$version-$revision
92fi
3716001b 93sourcename=$KDEB_SOURCENAME
1da177e4 94tmpdir="$objtree/debian/tmp"
ee81b786 95kernel_headers_dir="$objtree/debian/hdrtmp"
96libc_headers_dir="$objtree/debian/headertmp"
810e8437 97dbg_dir="$objtree/debian/dbgtmp"
f7a2c31f 98packagename=linux-image-$version
ee81b786 99kernel_headers_packagename=linux-headers-$version
100libc_headers_packagename=linux-libc-dev
810e8437 101dbg_packagename=$packagename-dbg
dca0c024
RV
102debarch=
103forcearch=
104set_debarch
687c3dac 105
4f66199b 106if [ "$ARCH" = "um" ] ; then
687c3dac
SR
107 packagename=user-mode-linux-$version
108fi
1da177e4 109
9de70176
AA
110# Not all arches have the same installed path in debian
111# XXX: have each arch Makefile export a variable of the canonical image install
112# path instead
113case $ARCH in
114um)
115 installed_image_path="usr/bin/linux-$version"
116 ;;
117parisc|mips|powerpc)
118 installed_image_path="boot/vmlinux-$version"
119 ;;
120*)
121 installed_image_path="boot/vmlinuz-$version"
122esac
123
810e8437
AA
124BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
125
1da177e4 126# Setup the directory structure
cc18abbe 127rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
e86c2412 128mkdir -m 755 -p "$tmpdir/DEBIAN"
bf7b0055 129mkdir -p "$tmpdir/lib" "$tmpdir/boot"
a47b6c61 130mkdir -p "$kernel_headers_dir/lib/modules/$version/"
1da177e4
LT
131
132# Build and install the kernel
4f66199b 133if [ "$ARCH" = "um" ] ; then
bf7b0055 134 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
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 142fi
09549aa1 143cp "$($MAKE -s image_name)" "$tmpdir/$installed_image_path"
1da177e4 144
ca2a9d2c
AP
145if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
146 # Only some architectures with OF support have this target
147 if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
148 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
149 fi
150fi
151
d2091767 152if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
dddcbb7c 153 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
a47b6c61
JR
154 rm -f "$tmpdir/lib/modules/$version/build"
155 rm -f "$tmpdir/lib/modules/$version/source"
4f66199b 156 if [ "$ARCH" = "um" ] ; then
687c3dac
SR
157 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
158 rmdir "$tmpdir/lib/modules/$version"
159 fi
810e8437 160 if [ -n "$BUILD_DEBUG" ] ; then
2d087139
MM
161 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
162 module=lib/modules/$module
163 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
164 # only keep debug symbols in the debug file
165 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
166 # strip original module from debug symbols
167 $OBJCOPY --strip-debug $tmpdir/$module
168 # then add a link to those
169 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
170 done
64178cb6
AS
171
172 # resign stripped modules
173 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
174 if [ -n "$MODULE_SIG_ALL" ]; then
175 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
176 fi
810e8437 177 fi
1da177e4
LT
178fi
179
d7d357bc 180if [ "$ARCH" != "um" ]; then
dddcbb7c
JR
181 $MAKE headers_check KBUILD_SRC=
182 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
d7d357bc 183fi
e6807785 184
1da177e4 185# Install the maintainer scripts
fe233cb6 186# Note: hook scripts under /etc/kernel are also executed by official Debian
1c8ddae0
BH
187# kernel packages, as well as kernel packages built using make-kpkg.
188# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
189# so do we; recent versions of dracut and initramfs-tools will obey this.
fe233cb6 190debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1c8ddae0
BH
191if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
192 want_initrd=Yes
193else
194 want_initrd=No
195fi
1da177e4 196for script in postinst postrm preinst prerm ; do
fe233cb6 197 mkdir -p "$tmpdir$debhookdir/$script.d"
1da177e4
LT
198 cat <<EOF > "$tmpdir/DEBIAN/$script"
199#!/bin/sh
200
201set -e
202
4964451a 203# Pass maintainer script parameters to hook scripts
241ad11f 204export DEB_MAINT_PARAMS="\$*"
4964451a 205
1c8ddae0
BH
206# Tell initramfs builder whether it's wanted
207export INITRD=$want_initrd
208
c95182bf 209test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1da177e4
LT
210exit 0
211EOF
212 chmod 755 "$tmpdir/DEBIAN/$script"
213done
214
edec611d 215# Try to determine maintainer and email values
216if [ -n "$DEBEMAIL" ]; then
217 email=$DEBEMAIL
218elif [ -n "$EMAIL" ]; then
219 email=$EMAIL
220else
bea107b1 221 email=$(id -nu)@$(hostname -f 2>/dev/null || hostname)
edec611d 222fi
223if [ -n "$DEBFULLNAME" ]; then
224 name=$DEBFULLNAME
225elif [ -n "$NAME" ]; then
226 name=$NAME
227else
228 name="Anonymous"
229fi
230maintainer="$name <$email>"
231
d9f711db
SD
232# Try to determine distribution
233if [ -n "$KDEB_CHANGELOG_DIST" ]; then
234 distribution=$KDEB_CHANGELOG_DIST
4c586062
MM
235# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog
236elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then
d9f711db
SD
237 : # nothing to do in this case
238else
239 distribution="unstable"
240 echo >&2 "Using default distribution of 'unstable' in the changelog"
241 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
242fi
243
1da177e4
LT
244# Generate a simple changelog template
245cat <<EOF > debian/changelog
3716001b 246$sourcename ($packageversion) $distribution; urgency=low
1da177e4 247
a83ca277 248 * Custom built Linux kernel.
1da177e4 249
edec611d 250 -- $maintainer $(date -R)
1da177e4
LT
251EOF
252
9461f666
FP
253# Generate copyright file
254cat <<EOF > debian/copyright
255This is a packacked upstream version of the Linux kernel.
256
4f6cce39
SP
257The sources may be found at most Linux archive sites, including:
258https://www.kernel.org/pub/linux/kernel
9461f666 259
1d349923 260Copyright: 1991 - 2017 Linus Torvalds and others.
9461f666
FP
261
262The git repository for mainline kernel development is at:
701ca30c 263git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
9461f666
FP
264
265 This program is free software; you can redistribute it and/or modify
266 it under the terms of the GNU General Public License as published by
267 the Free Software Foundation; version 2 dated June, 1991.
268
269On Debian GNU/Linux systems, the complete text of the GNU General Public
270License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
271EOF
272
3716001b
RV
273
274build_depends="bc, kmod, cpio "
275
1da177e4 276# Generate a control file
3e2ab256 277cat <<EOF > debian/control
3716001b 278Source: $sourcename
aa42abed 279Section: kernel
dc5962fd 280Priority: optional
edec611d 281Maintainer: $maintainer
3716001b 282Build-Depends: $build_depends
ee6eed80 283Homepage: http://www.kernel.org/
3e2ab256
FP
284EOF
285
286if [ "$ARCH" = "um" ]; then
287 cat <<EOF >> debian/control
dc5962fd
SR
288
289Package: $packagename
290Architecture: any
291Description: User Mode Linux kernel, version $version
292 User-mode Linux is a port of the Linux kernel to its own system call
293 interface. It provides a kind of virtual machine, which runs Linux
294 as a user process under another Linux kernel. This is useful for
295 kernel development, sandboxes, jails, experimentation, and
296 many other things.
297 .
298 This package contains the Linux kernel, modules and corresponding other
a83ca277 299 files, version: $version.
dc5962fd
SR
300EOF
301
302else
3e2ab256 303 cat <<EOF >> debian/control
1da177e4 304
687c3dac 305Package: $packagename
1da177e4 306Architecture: any
dc5962fd 307Description: Linux kernel, version $version
1da177e4 308 This package contains the Linux kernel, modules and corresponding other
a83ca277 309 files, version: $version.
1da177e4 310EOF
4f66199b 311
dc5962fd 312fi
1da177e4 313
8bf13561 314# Build kernel header package
a765a7ce 315(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
962475ac 316(cd $srctree; find arch/*/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
8bf13561
FB
317(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
318(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
15f6d337
WK
319if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then
320 (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles"
321fi
a765a7ce 322(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
d3e2773c
KC
323if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then
324 (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles"
325fi
ee81b786 326destdir=$kernel_headers_dir/usr/src/linux-headers-$version
327mkdir -p "$destdir"
a765a7ce
MM
328(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
329(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
d2091767 330(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
a47b6c61 331ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
6c635224 332rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
cd8d60a2
TT
333
334cat <<EOF >> debian/control
335
ee81b786 336Package: $kernel_headers_packagename
f8ce239d
BH
337Architecture: any
338Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
339 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
cd8d60a2
TT
340 .
341 This is useful for people who need to build external modules
342EOF
343
e6807785 344cat <<EOF >> debian/control
345
ee81b786 346Package: $libc_headers_packagename
e6807785 347Section: devel
348Provides: linux-kernel-headers
349Architecture: any
350Description: Linux support headers for userspace development
351 This package provides userspaces headers from the Linux kernel. These headers
352 are used by the installed headers for GNU glibc and other system libraries.
353EOF
354
d7d357bc
JR
355if [ "$ARCH" != "um" ]; then
356 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
357 create_package "$libc_headers_packagename" "$libc_headers_dir"
358fi
359
3e2ab256 360create_package "$packagename" "$tmpdir"
1da177e4 361
810e8437
AA
362if [ -n "$BUILD_DEBUG" ] ; then
363 # Build debug package
364 # Different tools want the image in different locations
365 # perf
366 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
367 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
368 # systemtap
369 mkdir -p $dbg_dir/usr/lib/debug/boot/
370 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
371 # kdump-tools
372 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
373
374 cat <<EOF >> debian/control
375
376Package: $dbg_packagename
377Section: debug
810e8437
AA
378Architecture: any
379Description: Linux kernel debugging symbols for $version
380 This package will come in handy if you need to debug the kernel. It provides
381 all the necessary debug symbols for the kernel and its modules.
382EOF
383
384 create_package "$dbg_packagename" "$dbg_dir"
385fi
386
3716001b
RV
387if [ "x$1" = "xdeb-pkg" ]
388then
389 cat <<EOF > debian/rules
390#!/usr/bin/make -f
391
392build:
393 \$(MAKE)
394
395binary-arch:
396 \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg
397
398clean:
8d740a37 399 rm -rf debian/*tmp debian/files
3716001b
RV
400 mv debian/ debian.backup # debian/ might be cleaned away
401 \$(MAKE) clean
402 mv debian.backup debian
403
404binary: binary-arch
405EOF
406 mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz
407 tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control}
408 dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \
409 -b / ../${sourcename}_${version}.orig.tar.gz ../${sourcename}_${packageversion}.debian.tar.gz
410 mv ${sourcename}_${packageversion}*dsc ..
411 dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes
412else
413 dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes
414fi
415
1da177e4 416exit 0