package/Makefile: move source tar creation to a 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
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"
29
dca0c024
RV
30 # Create the package
31 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
32 dpkg --build "$pdir" ..
33}
34
35set_debarch() {
10f26fa6 36 # Attempt to find the correct Debian architecture
10f26fa6
AST
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*)
a1323fd1 45 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
10f26fa6 46 ppc*)
22739edf 47 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
10f26fa6
AST
48 parisc*)
49 debarch=hppa ;;
50 mips*)
c5e318f6 51 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
a8d9c9f1
FB
52 arm64)
53 debarch=arm64 ;;
10f26fa6 54 arm*)
c5e318f6 55 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
10f26fa6 56 *)
dca0c024 57 debarch=$(dpkg --print-architecture)
10f26fa6
AST
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
55f88ecc
AST
67 if [ -n "$KBUILD_DEBARCH" ] ; then
68 debarch="$KBUILD_DEBARCH"
69 fi
dca0c024 70 forcearch="-DArchitecture=$debarch"
10f26fa6 71
3e2ab256
FP
72}
73
1da177e4
LT
74# Some variables and settings used throughout the script
75version=$KERNELRELEASE
4f66199b 76revision=$(cat .version)
c72c75db
FP
77if [ -n "$KDEB_PKGVERSION" ]; then
78 packageversion=$KDEB_PKGVERSION
79else
80 packageversion=$version-$revision
81fi
1da177e4 82tmpdir="$objtree/debian/tmp"
bf1b3644 83fwdir="$objtree/debian/fwtmp"
ee81b786 84kernel_headers_dir="$objtree/debian/hdrtmp"
85libc_headers_dir="$objtree/debian/headertmp"
810e8437 86dbg_dir="$objtree/debian/dbgtmp"
f7a2c31f 87packagename=linux-image-$version
95e2a7d8 88fwpackagename=linux-firmware-image-$version
ee81b786 89kernel_headers_packagename=linux-headers-$version
90libc_headers_packagename=linux-libc-dev
810e8437 91dbg_packagename=$packagename-dbg
dca0c024
RV
92debarch=
93forcearch=
94set_debarch
687c3dac 95
4f66199b 96if [ "$ARCH" = "um" ] ; then
687c3dac
SR
97 packagename=user-mode-linux-$version
98fi
1da177e4 99
9de70176
AA
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
810e8437
AA
114BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
115
1da177e4 116# Setup the directory structure
810e8437 117rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
e86c2412 118mkdir -m 755 -p "$tmpdir/DEBIAN"
bf7b0055
RV
119mkdir -p "$tmpdir/lib" "$tmpdir/boot"
120mkdir -p "$fwdir/lib/firmware/$version/"
a47b6c61 121mkdir -p "$kernel_headers_dir/lib/modules/$version/"
1da177e4
LT
122
123# Build and install the kernel
4f66199b 124if [ "$ARCH" = "um" ] ; then
bf7b0055 125 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
687c3dac
SR
126 $MAKE linux
127 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
d2091767 128 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
687c3dac 129 gzip "$tmpdir/usr/share/doc/$packagename/config"
38385f8f 130else
687c3dac 131 cp System.map "$tmpdir/boot/System.map-$version"
d2091767 132 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
9de70176
AA
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"
687c3dac 139fi
1da177e4 140
ca2a9d2c
APR
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
d2091767 148if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
dddcbb7c 149 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
a47b6c61
JR
150 rm -f "$tmpdir/lib/modules/$version/build"
151 rm -f "$tmpdir/lib/modules/$version/source"
4f66199b 152 if [ "$ARCH" = "um" ] ; then
687c3dac
SR
153 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
154 rmdir "$tmpdir/lib/modules/$version"
155 fi
810e8437 156 if [ -n "$BUILD_DEBUG" ] ; then
2d087139
MM
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
64178cb6
AS
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
810e8437 173 fi
1da177e4
LT
174fi
175
d7d357bc 176if [ "$ARCH" != "um" ]; then
dddcbb7c
JR
177 $MAKE headers_check KBUILD_SRC=
178 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
d7d357bc 179fi
e6807785 180
1da177e4 181# Install the maintainer scripts
fe233cb6 182# Note: hook scripts under /etc/kernel are also executed by official Debian
1c8ddae0
BH
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.
fe233cb6 186debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1c8ddae0
BH
187if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
188 want_initrd=Yes
189else
190 want_initrd=No
191fi
1da177e4 192for script in postinst postrm preinst prerm ; do
fe233cb6 193 mkdir -p "$tmpdir$debhookdir/$script.d"
1da177e4
LT
194 cat <<EOF > "$tmpdir/DEBIAN/$script"
195#!/bin/sh
196
197set -e
198
4964451a 199# Pass maintainer script parameters to hook scripts
241ad11f 200export DEB_MAINT_PARAMS="\$*"
4964451a 201
1c8ddae0
BH
202# Tell initramfs builder whether it's wanted
203export INITRD=$want_initrd
204
c95182bf 205test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1da177e4
LT
206exit 0
207EOF
208 chmod 755 "$tmpdir/DEBIAN/$script"
209done
210
edec611d 211# Try to determine maintainer and email values
212if [ -n "$DEBEMAIL" ]; then
213 email=$DEBEMAIL
214elif [ -n "$EMAIL" ]; then
215 email=$EMAIL
216else
bea107b1 217 email=$(id -nu)@$(hostname -f 2>/dev/null || hostname)
edec611d 218fi
219if [ -n "$DEBFULLNAME" ]; then
220 name=$DEBFULLNAME
221elif [ -n "$NAME" ]; then
222 name=$NAME
223else
224 name="Anonymous"
225fi
226maintainer="$name <$email>"
227
d9f711db
SD
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
1da177e4
LT
239# Generate a simple changelog template
240cat <<EOF > debian/changelog
d9f711db 241linux-upstream ($packageversion) $distribution; urgency=low
1da177e4 242
a83ca277 243 * Custom built Linux kernel.
1da177e4 244
edec611d 245 -- $maintainer $(date -R)
1da177e4
LT
246EOF
247
9461f666
FP
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
701ca30c 255Copyright: 1991 - 2015 Linus Torvalds and others.
9461f666
FP
256
257The git repository for mainline kernel development is at:
701ca30c 258git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
9461f666
FP
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
1da177e4 268# Generate a control file
3e2ab256 269cat <<EOF > debian/control
4bf4cd49 270Source: linux-upstream
aa42abed 271Section: kernel
dc5962fd 272Priority: optional
edec611d 273Maintainer: $maintainer
2d7204ac 274Standards-Version: 3.8.4
ee6eed80 275Homepage: http://www.kernel.org/
3e2ab256
FP
276EOF
277
278if [ "$ARCH" = "um" ]; then
279 cat <<EOF >> debian/control
dc5962fd
SR
280
281Package: $packagename
8ebc2fe9 282Provides: linux-image, linux-image-2.6, linux-modules-$version
dc5962fd
SR
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
a83ca277 292 files, version: $version.
dc5962fd
SR
293EOF
294
295else
3e2ab256 296 cat <<EOF >> debian/control
1da177e4 297
687c3dac 298Package: $packagename
8ebc2fe9 299Provides: linux-image, linux-image-2.6, linux-modules-$version
bf1b3644 300Suggests: $fwpackagename
1da177e4 301Architecture: any
dc5962fd 302Description: Linux kernel, version $version
1da177e4 303 This package contains the Linux kernel, modules and corresponding other
a83ca277 304 files, version: $version.
1da177e4 305EOF
4f66199b 306
dc5962fd 307fi
1da177e4 308
8bf13561 309# Build kernel header package
a765a7ce
MM
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"
8bf13561
FB
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"
a765a7ce 314(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
ee81b786 315destdir=$kernel_headers_dir/usr/src/linux-headers-$version
316mkdir -p "$destdir"
a765a7ce
MM
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 -)
d2091767 319(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
a47b6c61 320ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
6c635224 321rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
cd8d60a2
TT
322
323cat <<EOF >> debian/control
324
ee81b786 325Package: $kernel_headers_packagename
cd8d60a2 326Provides: linux-headers, linux-headers-2.6
f8ce239d
BH
327Architecture: any
328Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
329 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
cd8d60a2
TT
330 .
331 This is useful for people who need to build external modules
332EOF
333
bf1b3644
JM
334# Do we have firmware? Move it out of the way and build it into a package.
335if [ -e "$tmpdir/lib/firmware" ]; then
6607ddad 336 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
337 rmdir "$tmpdir/lib/firmware"
bf1b3644
JM
338
339 cat <<EOF >> debian/control
340
341Package: $fwpackagename
342Architecture: all
343Description: Linux kernel firmware, version $version
a83ca277 344 This package contains firmware from the Linux kernel, version $version.
bf1b3644
JM
345EOF
346
3e2ab256 347 create_package "$fwpackagename" "$fwdir"
bf1b3644
JM
348fi
349
e6807785 350cat <<EOF >> debian/control
351
ee81b786 352Package: $libc_headers_packagename
e6807785 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
d7d357bc
JR
361if [ "$ARCH" != "um" ]; then
362 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
363 create_package "$libc_headers_packagename" "$libc_headers_dir"
364fi
365
3e2ab256 366create_package "$packagename" "$tmpdir"
1da177e4 367
810e8437
AA
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
1da177e4 394exit 0
This page took 0.798461 seconds and 5 git commands to generate.