xref: /openbmc/linux/scripts/package/builddeb (revision 596b0474)
11da177e4SLinus Torvalds#!/bin/sh
21da177e4SLinus Torvalds#
34964451aSFrans Pop# builddeb 1.3
41da177e4SLinus Torvalds# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
51da177e4SLinus Torvalds#
61da177e4SLinus Torvalds# Simple script to generate a deb package for a Linux kernel. All the
74f66199bSFrans Pop# complexity of what to do with a kernel after it is installed or removed
81da177e4SLinus Torvalds# is left to other scripts and packages: they can install scripts in the
9fe233cb6SFrans Pop# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location
10fe233cb6SFrans Pop# specified in KDEB_HOOKDIR) that will be called on package install and
11fe233cb6SFrans Pop# removal.
121da177e4SLinus Torvalds
131da177e4SLinus Torvaldsset -e
141da177e4SLinus Torvalds
15515f4c63SMasahiro Yamadais_enabled() {
166fb7ef5aSMasahiro Yamada	grep -q "^$1=y" include/config/auto.conf
17515f4c63SMasahiro Yamada}
18515f4c63SMasahiro Yamada
19515f4c63SMasahiro Yamadaif_enabled_echo() {
20515f4c63SMasahiro Yamada	if is_enabled "$1"; then
21515f4c63SMasahiro Yamada		echo -n "$2"
22515f4c63SMasahiro Yamada	elif [ $# -ge 3 ]; then
23515f4c63SMasahiro Yamada		echo -n "$3"
24515f4c63SMasahiro Yamada	fi
25515f4c63SMasahiro Yamada}
26515f4c63SMasahiro Yamada
273e2ab256SFrans Popcreate_package() {
283e2ab256SFrans Pop	local pname="$1" pdir="$2"
293e2ab256SFrans Pop
30bf7b0055SRiku Voipio	mkdir -m 755 -p "$pdir/DEBIAN"
31bf7b0055SRiku Voipio	mkdir -p "$pdir/usr/share/doc/$pname"
329461f666SFrans Pop	cp debian/copyright "$pdir/usr/share/doc/$pname/"
331ab18486Smaximilian attems	cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
341ab18486Smaximilian attems	gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
35b59a1225SFEJES Jozsef	sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
36b59a1225SFEJES Jozsef		| xargs -r0 md5sum > DEBIAN/md5sums"
379461f666SFrans Pop
383e2ab256SFrans Pop	# Fix ownership and permissions
393e2ab256SFrans Pop	chown -R root:root "$pdir"
403e2ab256SFrans Pop	chmod -R go-w "$pdir"
41ca617dc6SHenning Schild	# in case we are in a restrictive umask environment like 0077
42ca617dc6SHenning Schild	chmod -R a+rX "$pdir"
433e2ab256SFrans Pop
44dca0c024SRiku Voipio	# Create the package
45b41d920aSRiku Voipio	dpkg-gencontrol -p$pname -P"$pdir"
461a7f0a34SMichał Mirosław	dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
47dca0c024SRiku Voipio}
48dca0c024SRiku Voipio
493126c17dSMasahiro Yamadadeploy_kernel_headers () {
503126c17dSMasahiro Yamada	pdir=$1
513126c17dSMasahiro Yamada
523126c17dSMasahiro Yamada	rm -rf $pdir
533126c17dSMasahiro Yamada
543126c17dSMasahiro Yamada	(
553126c17dSMasahiro Yamada		cd $srctree
563126c17dSMasahiro Yamada		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
573126c17dSMasahiro Yamada		find include scripts -type f -o -type l
58596b0474SMasahiro Yamada		find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
593126c17dSMasahiro Yamada		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
603126c17dSMasahiro Yamada	) > debian/hdrsrcfiles
613126c17dSMasahiro Yamada
623126c17dSMasahiro Yamada	{
633126c17dSMasahiro Yamada		if is_enabled CONFIG_STACK_VALIDATION; then
643126c17dSMasahiro Yamada			echo tools/objtool/objtool
653126c17dSMasahiro Yamada		fi
663126c17dSMasahiro Yamada
673126c17dSMasahiro Yamada		find arch/$SRCARCH/include Module.symvers include scripts -type f
683126c17dSMasahiro Yamada
693126c17dSMasahiro Yamada		if is_enabled CONFIG_GCC_PLUGINS; then
703126c17dSMasahiro Yamada			find scripts/gcc-plugins -name \*.so
713126c17dSMasahiro Yamada		fi
723126c17dSMasahiro Yamada	} > debian/hdrobjfiles
733126c17dSMasahiro Yamada
743126c17dSMasahiro Yamada	destdir=$pdir/usr/src/linux-headers-$version
753126c17dSMasahiro Yamada	mkdir -p $destdir
763126c17dSMasahiro Yamada	tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir
773126c17dSMasahiro Yamada	tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir
783126c17dSMasahiro Yamada	rm -f debian/hdrsrcfiles debian/hdrobjfiles
793126c17dSMasahiro Yamada
803126c17dSMasahiro Yamada	# copy .config manually to be where it's expected to be
813126c17dSMasahiro Yamada	cp $KCONFIG_CONFIG $destdir/.config
823126c17dSMasahiro Yamada
833126c17dSMasahiro Yamada	mkdir -p $pdir/lib/modules/$version/
843126c17dSMasahiro Yamada	ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
853126c17dSMasahiro Yamada}
863126c17dSMasahiro Yamada
87451dff37SMasahiro Yamadadeploy_libc_headers () {
88451dff37SMasahiro Yamada	pdir=$1
89451dff37SMasahiro Yamada
90451dff37SMasahiro Yamada	rm -rf $pdir
91451dff37SMasahiro Yamada
92451dff37SMasahiro Yamada	$MAKE -f $srctree/Makefile headers
93451dff37SMasahiro Yamada	$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
94451dff37SMasahiro Yamada
95451dff37SMasahiro Yamada	# move asm headers to /usr/include/<libc-machine>/asm to match the structure
96451dff37SMasahiro Yamada	# used by Debian-based distros (to support multi-arch)
97451dff37SMasahiro Yamada	host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH)
98451dff37SMasahiro Yamada	mkdir $pdir/usr/include/$host_arch
99451dff37SMasahiro Yamada	mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/
100451dff37SMasahiro Yamada}
101451dff37SMasahiro Yamada
1021da177e4SLinus Torvaldsversion=$KERNELRELEASE
103f9a4711eSMasahiro Yamadatmpdir=debian/linux-image
104f9a4711eSMasahiro Yamadadbg_dir=debian/linux-image-dbg
105f7a2c31fSmaximilian attemspackagename=linux-image-$version
106810e8437SAnisse Astierdbg_packagename=$packagename-dbg
107687c3dacSSam Ravnborg
1084f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
109687c3dacSSam Ravnborg	packagename=user-mode-linux-$version
110687c3dacSSam Ravnborgfi
1111da177e4SLinus Torvalds
1129de70176SAnisse Astier# Not all arches have the same installed path in debian
1139de70176SAnisse Astier# XXX: have each arch Makefile export a variable of the canonical image install
1149de70176SAnisse Astier# path instead
1159de70176SAnisse Astiercase $ARCH in
1169de70176SAnisse Astierum)
1179de70176SAnisse Astier	installed_image_path="usr/bin/linux-$version"
1189de70176SAnisse Astier	;;
1199de70176SAnisse Astierparisc|mips|powerpc)
1209de70176SAnisse Astier	installed_image_path="boot/vmlinux-$version"
1219de70176SAnisse Astier	;;
1229de70176SAnisse Astier*)
1239de70176SAnisse Astier	installed_image_path="boot/vmlinuz-$version"
1249de70176SAnisse Astieresac
1259de70176SAnisse Astier
126515f4c63SMasahiro YamadaBUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes)
127810e8437SAnisse Astier
1281da177e4SLinus Torvalds# Setup the directory structure
129451dff37SMasahiro Yamadarm -rf "$tmpdir" "$dbg_dir" debian/files
130e86c2412Smaximilian attemsmkdir -m 755 -p "$tmpdir/DEBIAN"
131bf7b0055SRiku Voipiomkdir -p "$tmpdir/lib" "$tmpdir/boot"
1321da177e4SLinus Torvalds
133aae6a671SMasahiro Yamada# Install the kernel
1344f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
135bf7b0055SRiku Voipio	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
136687c3dacSSam Ravnborg	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
137d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
138687c3dacSSam Ravnborg	gzip "$tmpdir/usr/share/doc/$packagename/config"
139687c3dacSSam Ravnborgelse
1401da177e4SLinus Torvalds	cp System.map "$tmpdir/boot/System.map-$version"
141d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
1429de70176SAnisse Astierfi
14302826a6bSMasahiro Yamadacp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
1441da177e4SLinus Torvalds
145515f4c63SMasahiro Yamadaif is_enabled CONFIG_OF_EARLY_FLATTREE; then
146ca2a9d2cSArnaud Patard (Rtp)	# Only some architectures with OF support have this target
147d5615e47SRob Herring	if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then
148175209ccSMasahiro Yamada		$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
149ca2a9d2cSArnaud Patard (Rtp)	fi
150ca2a9d2cSArnaud Patard (Rtp)fi
151ca2a9d2cSArnaud Patard (Rtp)
152515f4c63SMasahiro Yamadaif is_enabled CONFIG_MODULES; then
153175209ccSMasahiro Yamada	INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
154a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/build"
155a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/source"
1564f66199bSFrans Pop	if [ "$ARCH" = "um" ] ; then
157687c3dacSSam Ravnborg		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
158687c3dacSSam Ravnborg		rmdir "$tmpdir/lib/modules/$version"
159687c3dacSSam Ravnborg	fi
160810e8437SAnisse Astier	if [ -n "$BUILD_DEBUG" ] ; then
1612d087139SMichal Marek		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
1622d087139SMichal Marek			module=lib/modules/$module
163810e8437SAnisse Astier			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
164810e8437SAnisse Astier			# only keep debug symbols in the debug file
1652d087139SMichal Marek			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
166810e8437SAnisse Astier			# strip original module from debug symbols
1672d087139SMichal Marek			$OBJCOPY --strip-debug $tmpdir/$module
168810e8437SAnisse Astier			# then add a link to those
1692d087139SMichal Marek			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
170810e8437SAnisse Astier		done
17164178cb6SAndrey Skvortsov
17264178cb6SAndrey Skvortsov		# resign stripped modules
173515f4c63SMasahiro Yamada		if is_enabled CONFIG_MODULE_SIG_ALL; then
174175209ccSMasahiro Yamada			INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
17564178cb6SAndrey Skvortsov		fi
176810e8437SAnisse Astier	fi
1771da177e4SLinus Torvaldsfi
1781da177e4SLinus Torvalds
1791da177e4SLinus Torvalds# Install the maintainer scripts
180fe233cb6SFrans Pop# Note: hook scripts under /etc/kernel are also executed by official Debian
1811c8ddae0SBen Hutchings# kernel packages, as well as kernel packages built using make-kpkg.
1821c8ddae0SBen Hutchings# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
1831c8ddae0SBen Hutchings# so do we; recent versions of dracut and initramfs-tools will obey this.
184fe233cb6SFrans Popdebhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1851da177e4SLinus Torvaldsfor script in postinst postrm preinst prerm ; do
186fe233cb6SFrans Pop	mkdir -p "$tmpdir$debhookdir/$script.d"
1871da177e4SLinus Torvalds	cat <<EOF > "$tmpdir/DEBIAN/$script"
1881da177e4SLinus Torvalds#!/bin/sh
1891da177e4SLinus Torvalds
1901da177e4SLinus Torvaldsset -e
1911da177e4SLinus Torvalds
1924964451aSFrans Pop# Pass maintainer script parameters to hook scripts
193241ad11fSmaximilian attemsexport DEB_MAINT_PARAMS="\$*"
1944964451aSFrans Pop
1951c8ddae0SBen Hutchings# Tell initramfs builder whether it's wanted
196515f4c63SMasahiro Yamadaexport INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
1971c8ddae0SBen Hutchings
198c95182bfSAnisse Astiertest -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1991da177e4SLinus Torvaldsexit 0
2001da177e4SLinus TorvaldsEOF
2011da177e4SLinus Torvalds	chmod 755 "$tmpdir/DEBIAN/$script"
2021da177e4SLinus Torvaldsdone
2031da177e4SLinus Torvalds
204d7d357bcSJoerg Roedelif [ "$ARCH" != "um" ]; then
2053126c17dSMasahiro Yamada	deploy_kernel_headers debian/linux-headers
2063126c17dSMasahiro Yamada	create_package linux-headers-$version debian/linux-headers
2073126c17dSMasahiro Yamada
208451dff37SMasahiro Yamada	deploy_libc_headers debian/linux-libc-dev
209451dff37SMasahiro Yamada	create_package linux-libc-dev debian/linux-libc-dev
210d7d357bcSJoerg Roedelfi
211d7d357bcSJoerg Roedel
2123e2ab256SFrans Popcreate_package "$packagename" "$tmpdir"
2131da177e4SLinus Torvalds
214810e8437SAnisse Astierif [ -n "$BUILD_DEBUG" ] ; then
215810e8437SAnisse Astier	# Build debug package
216810e8437SAnisse Astier	# Different tools want the image in different locations
217810e8437SAnisse Astier	# perf
218810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
219810e8437SAnisse Astier	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
220810e8437SAnisse Astier	# systemtap
221810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/boot/
222810e8437SAnisse Astier	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
223810e8437SAnisse Astier	# kdump-tools
224810e8437SAnisse Astier	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
225810e8437SAnisse Astier	create_package "$dbg_packagename" "$dbg_dir"
226810e8437SAnisse Astierfi
227810e8437SAnisse Astier
2281da177e4SLinus Torvaldsexit 0
229