xref: /linux/scripts/package/builddeb (revision 3126c17d28b696ba555bb959888fe4b5143bb389)
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
49*3126c17dSMasahiro Yamadadeploy_kernel_headers () {
50*3126c17dSMasahiro Yamada	pdir=$1
51*3126c17dSMasahiro Yamada
52*3126c17dSMasahiro Yamada	rm -rf $pdir
53*3126c17dSMasahiro Yamada
54*3126c17dSMasahiro Yamada	(
55*3126c17dSMasahiro Yamada		cd $srctree
56*3126c17dSMasahiro Yamada		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
57*3126c17dSMasahiro Yamada		find include scripts -type f -o -type l
58*3126c17dSMasahiro Yamada		find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform
59*3126c17dSMasahiro Yamada		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
60*3126c17dSMasahiro Yamada	) > debian/hdrsrcfiles
61*3126c17dSMasahiro Yamada
62*3126c17dSMasahiro Yamada	{
63*3126c17dSMasahiro Yamada		if is_enabled CONFIG_STACK_VALIDATION; then
64*3126c17dSMasahiro Yamada			echo tools/objtool/objtool
65*3126c17dSMasahiro Yamada		fi
66*3126c17dSMasahiro Yamada
67*3126c17dSMasahiro Yamada		find arch/$SRCARCH/include Module.symvers include scripts -type f
68*3126c17dSMasahiro Yamada
69*3126c17dSMasahiro Yamada		if is_enabled CONFIG_GCC_PLUGINS; then
70*3126c17dSMasahiro Yamada			find scripts/gcc-plugins -name \*.so
71*3126c17dSMasahiro Yamada		fi
72*3126c17dSMasahiro Yamada	} > debian/hdrobjfiles
73*3126c17dSMasahiro Yamada
74*3126c17dSMasahiro Yamada	destdir=$pdir/usr/src/linux-headers-$version
75*3126c17dSMasahiro Yamada	mkdir -p $destdir
76*3126c17dSMasahiro Yamada	tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir
77*3126c17dSMasahiro Yamada	tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir
78*3126c17dSMasahiro Yamada	rm -f debian/hdrsrcfiles debian/hdrobjfiles
79*3126c17dSMasahiro Yamada
80*3126c17dSMasahiro Yamada	# copy .config manually to be where it's expected to be
81*3126c17dSMasahiro Yamada	cp $KCONFIG_CONFIG $destdir/.config
82*3126c17dSMasahiro Yamada
83*3126c17dSMasahiro Yamada	mkdir -p $pdir/lib/modules/$version/
84*3126c17dSMasahiro Yamada	ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
85*3126c17dSMasahiro Yamada}
86*3126c17dSMasahiro Yamada
871da177e4SLinus Torvaldsversion=$KERNELRELEASE
88f9a4711eSMasahiro Yamadatmpdir=debian/linux-image
89f9a4711eSMasahiro Yamadalibc_headers_dir=debian/linux-libc-dev
90f9a4711eSMasahiro Yamadadbg_dir=debian/linux-image-dbg
91f7a2c31fSmaximilian attemspackagename=linux-image-$version
92ee81b786Smaximilian attemslibc_headers_packagename=linux-libc-dev
93810e8437SAnisse Astierdbg_packagename=$packagename-dbg
94687c3dacSSam Ravnborg
954f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
96687c3dacSSam Ravnborg	packagename=user-mode-linux-$version
97687c3dacSSam Ravnborgfi
981da177e4SLinus Torvalds
999de70176SAnisse Astier# Not all arches have the same installed path in debian
1009de70176SAnisse Astier# XXX: have each arch Makefile export a variable of the canonical image install
1019de70176SAnisse Astier# path instead
1029de70176SAnisse Astiercase $ARCH in
1039de70176SAnisse Astierum)
1049de70176SAnisse Astier	installed_image_path="usr/bin/linux-$version"
1059de70176SAnisse Astier	;;
1069de70176SAnisse Astierparisc|mips|powerpc)
1079de70176SAnisse Astier	installed_image_path="boot/vmlinux-$version"
1089de70176SAnisse Astier	;;
1099de70176SAnisse Astier*)
1109de70176SAnisse Astier	installed_image_path="boot/vmlinuz-$version"
1119de70176SAnisse Astieresac
1129de70176SAnisse Astier
113515f4c63SMasahiro YamadaBUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes)
114810e8437SAnisse Astier
1151da177e4SLinus Torvalds# Setup the directory structure
116*3126c17dSMasahiro Yamadarm -rf "$tmpdir" "$libc_headers_dir" "$dbg_dir" debian/files
117e86c2412Smaximilian attemsmkdir -m 755 -p "$tmpdir/DEBIAN"
118bf7b0055SRiku Voipiomkdir -p "$tmpdir/lib" "$tmpdir/boot"
1191da177e4SLinus Torvalds
120aae6a671SMasahiro Yamada# Install the kernel
1214f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
122bf7b0055SRiku Voipio	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
123687c3dacSSam Ravnborg	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
124d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
125687c3dacSSam Ravnborg	gzip "$tmpdir/usr/share/doc/$packagename/config"
126687c3dacSSam Ravnborgelse
1271da177e4SLinus Torvalds	cp System.map "$tmpdir/boot/System.map-$version"
128d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
1299de70176SAnisse Astierfi
13002826a6bSMasahiro Yamadacp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
1311da177e4SLinus Torvalds
132515f4c63SMasahiro Yamadaif is_enabled CONFIG_OF_EARLY_FLATTREE; then
133ca2a9d2cSArnaud Patard (Rtp)	# Only some architectures with OF support have this target
134d5615e47SRob Herring	if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then
135175209ccSMasahiro Yamada		$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
136ca2a9d2cSArnaud Patard (Rtp)	fi
137ca2a9d2cSArnaud Patard (Rtp)fi
138ca2a9d2cSArnaud Patard (Rtp)
139515f4c63SMasahiro Yamadaif is_enabled CONFIG_MODULES; then
140175209ccSMasahiro Yamada	INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
141a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/build"
142a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/source"
1434f66199bSFrans Pop	if [ "$ARCH" = "um" ] ; then
144687c3dacSSam Ravnborg		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
145687c3dacSSam Ravnborg		rmdir "$tmpdir/lib/modules/$version"
146687c3dacSSam Ravnborg	fi
147810e8437SAnisse Astier	if [ -n "$BUILD_DEBUG" ] ; then
1482d087139SMichal Marek		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
1492d087139SMichal Marek			module=lib/modules/$module
150810e8437SAnisse Astier			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
151810e8437SAnisse Astier			# only keep debug symbols in the debug file
1522d087139SMichal Marek			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
153810e8437SAnisse Astier			# strip original module from debug symbols
1542d087139SMichal Marek			$OBJCOPY --strip-debug $tmpdir/$module
155810e8437SAnisse Astier			# then add a link to those
1562d087139SMichal Marek			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
157810e8437SAnisse Astier		done
15864178cb6SAndrey Skvortsov
15964178cb6SAndrey Skvortsov		# resign stripped modules
160515f4c63SMasahiro Yamada		if is_enabled CONFIG_MODULE_SIG_ALL; then
161175209ccSMasahiro Yamada			INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
16264178cb6SAndrey Skvortsov		fi
163810e8437SAnisse Astier	fi
1641da177e4SLinus Torvaldsfi
1651da177e4SLinus Torvalds
166d7d357bcSJoerg Roedelif [ "$ARCH" != "um" ]; then
1670315bb7aSMasahiro Yamada	$MAKE -f $srctree/Makefile headers
168175209ccSMasahiro Yamada	$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
1695a464217SCedric Hombourger	# move asm headers to /usr/include/<libc-machine>/asm to match the structure
1705a464217SCedric Hombourger	# used by Debian-based distros (to support multi-arch)
1715a464217SCedric Hombourger	host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH)
1725a464217SCedric Hombourger	mkdir $libc_headers_dir/usr/include/$host_arch
1735a464217SCedric Hombourger	mv $libc_headers_dir/usr/include/asm $libc_headers_dir/usr/include/$host_arch/
174d7d357bcSJoerg Roedelfi
175e6807785Smaximilian attems
1761da177e4SLinus Torvalds# Install the maintainer scripts
177fe233cb6SFrans Pop# Note: hook scripts under /etc/kernel are also executed by official Debian
1781c8ddae0SBen Hutchings# kernel packages, as well as kernel packages built using make-kpkg.
1791c8ddae0SBen Hutchings# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
1801c8ddae0SBen Hutchings# so do we; recent versions of dracut and initramfs-tools will obey this.
181fe233cb6SFrans Popdebhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1821da177e4SLinus Torvaldsfor script in postinst postrm preinst prerm ; do
183fe233cb6SFrans Pop	mkdir -p "$tmpdir$debhookdir/$script.d"
1841da177e4SLinus Torvalds	cat <<EOF > "$tmpdir/DEBIAN/$script"
1851da177e4SLinus Torvalds#!/bin/sh
1861da177e4SLinus Torvalds
1871da177e4SLinus Torvaldsset -e
1881da177e4SLinus Torvalds
1894964451aSFrans Pop# Pass maintainer script parameters to hook scripts
190241ad11fSmaximilian attemsexport DEB_MAINT_PARAMS="\$*"
1914964451aSFrans Pop
1921c8ddae0SBen Hutchings# Tell initramfs builder whether it's wanted
193515f4c63SMasahiro Yamadaexport INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
1941c8ddae0SBen Hutchings
195c95182bfSAnisse Astiertest -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
1961da177e4SLinus Torvaldsexit 0
1971da177e4SLinus TorvaldsEOF
1981da177e4SLinus Torvalds	chmod 755 "$tmpdir/DEBIAN/$script"
1991da177e4SLinus Torvaldsdone
2001da177e4SLinus Torvalds
201d7d357bcSJoerg Roedelif [ "$ARCH" != "um" ]; then
202*3126c17dSMasahiro Yamada	deploy_kernel_headers debian/linux-headers
203*3126c17dSMasahiro Yamada	create_package linux-headers-$version debian/linux-headers
204*3126c17dSMasahiro Yamada
205ee81b786Smaximilian attems	create_package "$libc_headers_packagename" "$libc_headers_dir"
206d7d357bcSJoerg Roedelfi
207d7d357bcSJoerg Roedel
2083e2ab256SFrans Popcreate_package "$packagename" "$tmpdir"
2091da177e4SLinus Torvalds
210810e8437SAnisse Astierif [ -n "$BUILD_DEBUG" ] ; then
211810e8437SAnisse Astier	# Build debug package
212810e8437SAnisse Astier	# Different tools want the image in different locations
213810e8437SAnisse Astier	# perf
214810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
215810e8437SAnisse Astier	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
216810e8437SAnisse Astier	# systemtap
217810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/boot/
218810e8437SAnisse Astier	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
219810e8437SAnisse Astier	# kdump-tools
220810e8437SAnisse Astier	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
221810e8437SAnisse Astier	create_package "$dbg_packagename" "$dbg_dir"
222810e8437SAnisse Astierfi
223810e8437SAnisse Astier
2241da177e4SLinus Torvaldsexit 0
225