xref: /linux/scripts/package/builddeb (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
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	mkdir -m 755 -p "$pdir/DEBIAN"
19	mkdir -p "$pdir/usr/share/doc/$pname"
20	cp debian/copyright "$pdir/usr/share/doc/$pname/"
21	cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
22	gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
23	sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
24		| xargs -r0 md5sum > DEBIAN/md5sums"
25
26	# Fix ownership and permissions
27	chown -R root:root "$pdir"
28	chmod -R go-w "$pdir"
29
30	# Create the package
31	dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
32	dpkg --build "$pdir" ..
33}
34
35set_debarch() {
36	# Attempt to find the correct Debian architecture
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*)
45		debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
46	ppc*)
47		debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
48	parisc*)
49		debarch=hppa ;;
50	mips*)
51		debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
52	arm64)
53		debarch=arm64 ;;
54	arm*)
55		debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
56	*)
57		debarch=$(dpkg --print-architecture)
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
67	if [ -n "$KBUILD_DEBARCH" ] ; then
68		debarch="$KBUILD_DEBARCH"
69	fi
70	forcearch="-DArchitecture=$debarch"
71
72}
73
74# Some variables and settings used throughout the script
75version=$KERNELRELEASE
76revision=$(cat .version)
77if [ -n "$KDEB_PKGVERSION" ]; then
78	packageversion=$KDEB_PKGVERSION
79else
80	packageversion=$version-$revision
81fi
82sourcename=$KDEB_SOURCENAME
83tmpdir="$objtree/debian/tmp"
84fwdir="$objtree/debian/fwtmp"
85kernel_headers_dir="$objtree/debian/hdrtmp"
86libc_headers_dir="$objtree/debian/headertmp"
87dbg_dir="$objtree/debian/dbgtmp"
88packagename=linux-image-$version
89fwpackagename=linux-firmware-image-$version
90kernel_headers_packagename=linux-headers-$version
91libc_headers_packagename=linux-libc-dev
92dbg_packagename=$packagename-dbg
93debarch=
94forcearch=
95set_debarch
96
97if [ "$ARCH" = "um" ] ; then
98	packagename=user-mode-linux-$version
99fi
100
101# Not all arches have the same installed path in debian
102# XXX: have each arch Makefile export a variable of the canonical image install
103# path instead
104case $ARCH in
105um)
106	installed_image_path="usr/bin/linux-$version"
107	;;
108parisc|mips|powerpc)
109	installed_image_path="boot/vmlinux-$version"
110	;;
111*)
112	installed_image_path="boot/vmlinuz-$version"
113esac
114
115BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
116
117# Setup the directory structure
118rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
119mkdir -m 755 -p "$tmpdir/DEBIAN"
120mkdir -p "$tmpdir/lib" "$tmpdir/boot"
121mkdir -p "$fwdir/lib/firmware/$version/"
122mkdir -p "$kernel_headers_dir/lib/modules/$version/"
123
124# Build and install the kernel
125if [ "$ARCH" = "um" ] ; then
126	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
127	$MAKE linux
128	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
129	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
130	gzip "$tmpdir/usr/share/doc/$packagename/config"
131else
132	cp System.map "$tmpdir/boot/System.map-$version"
133	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
134fi
135# Not all arches include the boot path in KBUILD_IMAGE
136if [ -e $KBUILD_IMAGE ]; then
137	cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
138else
139	cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
140fi
141
142if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
143	# Only some architectures with OF support have this target
144	if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
145		$MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
146	fi
147fi
148
149if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
150	INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
151	rm -f "$tmpdir/lib/modules/$version/build"
152	rm -f "$tmpdir/lib/modules/$version/source"
153	if [ "$ARCH" = "um" ] ; then
154		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
155		rmdir "$tmpdir/lib/modules/$version"
156	fi
157	if [ -n "$BUILD_DEBUG" ] ; then
158		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
159			module=lib/modules/$module
160			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
161			# only keep debug symbols in the debug file
162			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
163			# strip original module from debug symbols
164			$OBJCOPY --strip-debug $tmpdir/$module
165			# then add a link to those
166			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
167		done
168
169		# resign stripped modules
170		MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
171		if [ -n "$MODULE_SIG_ALL" ]; then
172			INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
173		fi
174	fi
175fi
176
177if [ "$ARCH" != "um" ]; then
178	$MAKE headers_check KBUILD_SRC=
179	$MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
180fi
181
182# Install the maintainer scripts
183# Note: hook scripts under /etc/kernel are also executed by official Debian
184# kernel packages, as well as kernel packages built using make-kpkg.
185# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
186# so do we; recent versions of dracut and initramfs-tools will obey this.
187debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
188if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
189	want_initrd=Yes
190else
191	want_initrd=No
192fi
193for script in postinst postrm preinst prerm ; do
194	mkdir -p "$tmpdir$debhookdir/$script.d"
195	cat <<EOF > "$tmpdir/DEBIAN/$script"
196#!/bin/sh
197
198set -e
199
200# Pass maintainer script parameters to hook scripts
201export DEB_MAINT_PARAMS="\$*"
202
203# Tell initramfs builder whether it's wanted
204export INITRD=$want_initrd
205
206test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
207exit 0
208EOF
209	chmod 755 "$tmpdir/DEBIAN/$script"
210done
211
212# Try to determine maintainer and email values
213if [ -n "$DEBEMAIL" ]; then
214       email=$DEBEMAIL
215elif [ -n "$EMAIL" ]; then
216       email=$EMAIL
217else
218       email=$(id -nu)@$(hostname -f 2>/dev/null || hostname)
219fi
220if [ -n "$DEBFULLNAME" ]; then
221       name=$DEBFULLNAME
222elif [ -n "$NAME" ]; then
223       name=$NAME
224else
225       name="Anonymous"
226fi
227maintainer="$name <$email>"
228
229# Try to determine distribution
230if [ -n "$KDEB_CHANGELOG_DIST" ]; then
231        distribution=$KDEB_CHANGELOG_DIST
232elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
233        : # nothing to do in this case
234else
235        distribution="unstable"
236        echo >&2 "Using default distribution of 'unstable' in the changelog"
237        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
238fi
239
240# Generate a simple changelog template
241cat <<EOF > debian/changelog
242$sourcename ($packageversion) $distribution; urgency=low
243
244  * Custom built Linux kernel.
245
246 -- $maintainer  $(date -R)
247EOF
248
249# Generate copyright file
250cat <<EOF > debian/copyright
251This is a packacked upstream version of the Linux kernel.
252
253The sources may be found at most Linux ftp sites, including:
254ftp://ftp.kernel.org/pub/linux/kernel
255
256Copyright: 1991 - 2015 Linus Torvalds and others.
257
258The git repository for mainline kernel development is at:
259git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
260
261    This program is free software; you can redistribute it and/or modify
262    it under the terms of the GNU General Public License as published by
263    the Free Software Foundation; version 2 dated June, 1991.
264
265On Debian GNU/Linux systems, the complete text of the GNU General Public
266License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
267EOF
268
269
270build_depends="bc, kmod, cpio "
271
272# Generate a control file
273cat <<EOF > debian/control
274Source: $sourcename
275Section: kernel
276Priority: optional
277Maintainer: $maintainer
278Build-Depends: $build_depends
279Standards-Version: 3.8.4
280Homepage: http://www.kernel.org/
281EOF
282
283if [ "$ARCH" = "um" ]; then
284	cat <<EOF >> debian/control
285
286Package: $packagename
287Provides: linux-image, linux-image-2.6, linux-modules-$version
288Architecture: any
289Description: User Mode Linux kernel, version $version
290 User-mode Linux is a port of the Linux kernel to its own system call
291 interface.  It provides a kind of virtual machine, which runs Linux
292 as a user process under another Linux kernel.  This is useful for
293 kernel development, sandboxes, jails, experimentation, and
294 many other things.
295 .
296 This package contains the Linux kernel, modules and corresponding other
297 files, version: $version.
298EOF
299
300else
301	cat <<EOF >> debian/control
302
303Package: $packagename
304Provides: linux-image, linux-image-2.6, linux-modules-$version
305Suggests: $fwpackagename
306Architecture: any
307Description: Linux kernel, version $version
308 This package contains the Linux kernel, modules and corresponding other
309 files, version: $version.
310EOF
311
312fi
313
314# Build kernel header package
315(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
316(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
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"
319(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
320destdir=$kernel_headers_dir/usr/src/linux-headers-$version
321mkdir -p "$destdir"
322(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
323(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
324(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
325ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
326rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
327
328cat <<EOF >> debian/control
329
330Package: $kernel_headers_packagename
331Provides: linux-headers, linux-headers-2.6
332Architecture: any
333Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
334 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
335 .
336 This is useful for people who need to build external modules
337EOF
338
339# Do we have firmware? Move it out of the way and build it into a package.
340if [ -e "$tmpdir/lib/firmware" ]; then
341	mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
342	rmdir "$tmpdir/lib/firmware"
343
344	cat <<EOF >> debian/control
345
346Package: $fwpackagename
347Architecture: all
348Description: Linux kernel firmware, version $version
349 This package contains firmware from the Linux kernel, version $version.
350EOF
351
352	create_package "$fwpackagename" "$fwdir"
353fi
354
355cat <<EOF >> debian/control
356
357Package: $libc_headers_packagename
358Section: devel
359Provides: linux-kernel-headers
360Architecture: any
361Description: Linux support headers for userspace development
362 This package provides userspaces headers from the Linux kernel.  These headers
363 are used by the installed headers for GNU glibc and other system libraries.
364EOF
365
366if [ "$ARCH" != "um" ]; then
367	create_package "$kernel_headers_packagename" "$kernel_headers_dir"
368	create_package "$libc_headers_packagename" "$libc_headers_dir"
369fi
370
371create_package "$packagename" "$tmpdir"
372
373if [ -n "$BUILD_DEBUG" ] ; then
374	# Build debug package
375	# Different tools want the image in different locations
376	# perf
377	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
378	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
379	# systemtap
380	mkdir -p $dbg_dir/usr/lib/debug/boot/
381	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
382	# kdump-tools
383	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
384
385	cat <<EOF >> debian/control
386
387Package: $dbg_packagename
388Section: debug
389Provides: linux-debug, linux-debug-$version
390Architecture: any
391Description: Linux kernel debugging symbols for $version
392 This package will come in handy if you need to debug the kernel. It provides
393 all the necessary debug symbols for the kernel and its modules.
394EOF
395
396	create_package "$dbg_packagename" "$dbg_dir"
397fi
398
399if [ "x$1" = "xdeb-pkg" ]
400then
401    cat <<EOF > debian/rules
402#!/usr/bin/make -f
403
404build:
405	\$(MAKE)
406
407binary-arch:
408	\$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg
409
410clean:
411	rm -rf debian/*tmp debian/files
412	mv debian/ debian.backup # debian/ might be cleaned away
413	\$(MAKE) clean
414	mv debian.backup debian
415
416binary: binary-arch
417EOF
418	mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz
419	tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control}
420	dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \
421		-b / ../${sourcename}_${version}.orig.tar.gz  ../${sourcename}_${packageversion}.debian.tar.gz
422	mv ${sourcename}_${packageversion}*dsc ..
423	dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes
424else
425	dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes
426fi
427
428exit 0
429