xref: /linux-6.15/scripts/package/builddeb (revision a5e40d86)
11da177e4SLinus Torvalds#!/bin/sh
21da177e4SLinus Torvalds#
34964451aSFrans Pop# builddeb 1.3
41da177e4SLinus Torvalds# Copyright 2003 Wichert Akkerman <[email protected]>
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"
293e854180SGuillem Jover	local dpkg_deb_opts
303e2ab256SFrans Pop
31bf7b0055SRiku Voipio	mkdir -m 755 -p "$pdir/DEBIAN"
32bf7b0055SRiku Voipio	mkdir -p "$pdir/usr/share/doc/$pname"
339461f666SFrans Pop	cp debian/copyright "$pdir/usr/share/doc/$pname/"
341ab18486Smaximilian attems	cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
3551ccdbfbSGuillem Jover	gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
36b59a1225SFEJES Jozsef	sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
37b59a1225SFEJES Jozsef		| xargs -r0 md5sum > DEBIAN/md5sums"
389461f666SFrans Pop
393e2ab256SFrans Pop	# Fix ownership and permissions
403e854180SGuillem Jover	if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then
413e854180SGuillem Jover		dpkg_deb_opts="--root-owner-group"
423e854180SGuillem Jover	else
433e2ab256SFrans Pop		chown -R root:root "$pdir"
443e854180SGuillem Jover	fi
45*a5e40d86SSven Joachim	# a+rX in case we are in a restrictive umask environment like 0077
46*a5e40d86SSven Joachim	# ug-s in case we build in a setuid/setgid directory
47*a5e40d86SSven Joachim	chmod -R go-w,a+rX,ug-s "$pdir"
483e2ab256SFrans Pop
49dca0c024SRiku Voipio	# Create the package
50b41d920aSRiku Voipio	dpkg-gencontrol -p$pname -P"$pdir"
513e854180SGuillem Jover	dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
52dca0c024SRiku Voipio}
53dca0c024SRiku Voipio
543126c17dSMasahiro Yamadadeploy_kernel_headers () {
553126c17dSMasahiro Yamada	pdir=$1
563126c17dSMasahiro Yamada
573126c17dSMasahiro Yamada	rm -rf $pdir
583126c17dSMasahiro Yamada
593126c17dSMasahiro Yamada	(
603126c17dSMasahiro Yamada		cd $srctree
613126c17dSMasahiro Yamada		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
623126c17dSMasahiro Yamada		find include scripts -type f -o -type l
63596b0474SMasahiro Yamada		find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
643126c17dSMasahiro Yamada		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
653126c17dSMasahiro Yamada	) > debian/hdrsrcfiles
663126c17dSMasahiro Yamada
673126c17dSMasahiro Yamada	{
6803f16cd0SJosh Poimboeuf		if is_enabled CONFIG_OBJTOOL; then
693126c17dSMasahiro Yamada			echo tools/objtool/objtool
703126c17dSMasahiro Yamada		fi
713126c17dSMasahiro Yamada
723126c17dSMasahiro Yamada		find arch/$SRCARCH/include Module.symvers include scripts -type f
733126c17dSMasahiro Yamada
743126c17dSMasahiro Yamada		if is_enabled CONFIG_GCC_PLUGINS; then
753126c17dSMasahiro Yamada			find scripts/gcc-plugins -name \*.so
763126c17dSMasahiro Yamada		fi
773126c17dSMasahiro Yamada	} > debian/hdrobjfiles
783126c17dSMasahiro Yamada
793126c17dSMasahiro Yamada	destdir=$pdir/usr/src/linux-headers-$version
803126c17dSMasahiro Yamada	mkdir -p $destdir
813126c17dSMasahiro Yamada	tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir
823126c17dSMasahiro Yamada	tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir
833126c17dSMasahiro Yamada	rm -f debian/hdrsrcfiles debian/hdrobjfiles
843126c17dSMasahiro Yamada
853126c17dSMasahiro Yamada	# copy .config manually to be where it's expected to be
863126c17dSMasahiro Yamada	cp $KCONFIG_CONFIG $destdir/.config
873126c17dSMasahiro Yamada
883126c17dSMasahiro Yamada	mkdir -p $pdir/lib/modules/$version/
893126c17dSMasahiro Yamada	ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
903126c17dSMasahiro Yamada}
913126c17dSMasahiro Yamada
92451dff37SMasahiro Yamadadeploy_libc_headers () {
93451dff37SMasahiro Yamada	pdir=$1
94451dff37SMasahiro Yamada
95451dff37SMasahiro Yamada	rm -rf $pdir
96451dff37SMasahiro Yamada
97451dff37SMasahiro Yamada	$MAKE -f $srctree/Makefile headers
98451dff37SMasahiro Yamada	$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
99451dff37SMasahiro Yamada
100451dff37SMasahiro Yamada	# move asm headers to /usr/include/<libc-machine>/asm to match the structure
101451dff37SMasahiro Yamada	# used by Debian-based distros (to support multi-arch)
102451dff37SMasahiro Yamada	host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH)
103451dff37SMasahiro Yamada	mkdir $pdir/usr/include/$host_arch
104451dff37SMasahiro Yamada	mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/
105451dff37SMasahiro Yamada}
106451dff37SMasahiro Yamada
1071da177e4SLinus Torvaldsversion=$KERNELRELEASE
108f9a4711eSMasahiro Yamadatmpdir=debian/linux-image
109f9a4711eSMasahiro Yamadadbg_dir=debian/linux-image-dbg
110f7a2c31fSmaximilian attemspackagename=linux-image-$version
111810e8437SAnisse Astierdbg_packagename=$packagename-dbg
112687c3dacSSam Ravnborg
1134f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
114687c3dacSSam Ravnborg	packagename=user-mode-linux-$version
115687c3dacSSam Ravnborgfi
1161da177e4SLinus Torvalds
1179de70176SAnisse Astier# Not all arches have the same installed path in debian
1189de70176SAnisse Astier# XXX: have each arch Makefile export a variable of the canonical image install
1199de70176SAnisse Astier# path instead
1209de70176SAnisse Astiercase $ARCH in
1219de70176SAnisse Astierum)
1229de70176SAnisse Astier	installed_image_path="usr/bin/linux-$version"
1239de70176SAnisse Astier	;;
1249de70176SAnisse Astierparisc|mips|powerpc)
1259de70176SAnisse Astier	installed_image_path="boot/vmlinux-$version"
1269de70176SAnisse Astier	;;
1279de70176SAnisse Astier*)
1289de70176SAnisse Astier	installed_image_path="boot/vmlinuz-$version"
1299de70176SAnisse Astieresac
1309de70176SAnisse Astier
131515f4c63SMasahiro YamadaBUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes)
132810e8437SAnisse Astier
1331da177e4SLinus Torvalds# Setup the directory structure
134451dff37SMasahiro Yamadarm -rf "$tmpdir" "$dbg_dir" debian/files
135e86c2412Smaximilian attemsmkdir -m 755 -p "$tmpdir/DEBIAN"
136bf7b0055SRiku Voipiomkdir -p "$tmpdir/lib" "$tmpdir/boot"
1371da177e4SLinus Torvalds
138aae6a671SMasahiro Yamada# Install the kernel
1394f66199bSFrans Popif [ "$ARCH" = "um" ] ; then
140bf7b0055SRiku Voipio	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
141687c3dacSSam Ravnborg	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
142d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
143687c3dacSSam Ravnborg	gzip "$tmpdir/usr/share/doc/$packagename/config"
144687c3dacSSam Ravnborgelse
1451da177e4SLinus Torvalds	cp System.map "$tmpdir/boot/System.map-$version"
146d2091767SAnisse Astier	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
1479de70176SAnisse Astierfi
14802826a6bSMasahiro Yamadacp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
1491da177e4SLinus Torvalds
150515f4c63SMasahiro Yamadaif is_enabled CONFIG_OF_EARLY_FLATTREE; then
151ca2a9d2cSArnaud Patard (Rtp)	# Only some architectures with OF support have this target
152d5615e47SRob Herring	if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then
153175209ccSMasahiro Yamada		$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
154ca2a9d2cSArnaud Patard (Rtp)	fi
155ca2a9d2cSArnaud Patard (Rtp)fi
156ca2a9d2cSArnaud Patard (Rtp)
157515f4c63SMasahiro Yamadaif is_enabled CONFIG_MODULES; then
158175209ccSMasahiro Yamada	INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
159a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/build"
160a47b6c61SJoerg Roedel	rm -f "$tmpdir/lib/modules/$version/source"
1614f66199bSFrans Pop	if [ "$ARCH" = "um" ] ; then
162687c3dacSSam Ravnborg		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
163687c3dacSSam Ravnborg		rmdir "$tmpdir/lib/modules/$version"
164687c3dacSSam Ravnborg	fi
165810e8437SAnisse Astier	if [ -n "$BUILD_DEBUG" ] ; then
1662d087139SMichal Marek		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
1672d087139SMichal Marek			module=lib/modules/$module
168810e8437SAnisse Astier			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
169810e8437SAnisse Astier			# only keep debug symbols in the debug file
1702d087139SMichal Marek			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
171810e8437SAnisse Astier			# strip original module from debug symbols
1722d087139SMichal Marek			$OBJCOPY --strip-debug $tmpdir/$module
173810e8437SAnisse Astier			# then add a link to those
1742d087139SMichal Marek			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
175810e8437SAnisse Astier		done
17664178cb6SAndrey Skvortsov
17764178cb6SAndrey Skvortsov		# resign stripped modules
178515f4c63SMasahiro Yamada		if is_enabled CONFIG_MODULE_SIG_ALL; then
179175209ccSMasahiro Yamada			INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
18064178cb6SAndrey Skvortsov		fi
181810e8437SAnisse Astier	fi
1821da177e4SLinus Torvaldsfi
1831da177e4SLinus Torvalds
1841da177e4SLinus Torvalds# Install the maintainer scripts
185fe233cb6SFrans Pop# Note: hook scripts under /etc/kernel are also executed by official Debian
1861c8ddae0SBen Hutchings# kernel packages, as well as kernel packages built using make-kpkg.
1871c8ddae0SBen Hutchings# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
1881c8ddae0SBen Hutchings# so do we; recent versions of dracut and initramfs-tools will obey this.
189fe233cb6SFrans Popdebhookdir=${KDEB_HOOKDIR:-/etc/kernel}
1901da177e4SLinus Torvaldsfor script in postinst postrm preinst prerm ; do
191fe233cb6SFrans Pop	mkdir -p "$tmpdir$debhookdir/$script.d"
1921da177e4SLinus Torvalds	cat <<EOF > "$tmpdir/DEBIAN/$script"
1931da177e4SLinus Torvalds#!/bin/sh
1941da177e4SLinus Torvalds
1951da177e4SLinus Torvaldsset -e
1961da177e4SLinus Torvalds
1974964451aSFrans Pop# Pass maintainer script parameters to hook scripts
198241ad11fSmaximilian attemsexport DEB_MAINT_PARAMS="\$*"
1994964451aSFrans Pop
2001c8ddae0SBen Hutchings# Tell initramfs builder whether it's wanted
201515f4c63SMasahiro Yamadaexport INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
2021c8ddae0SBen Hutchings
203c95182bfSAnisse Astiertest -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
2041da177e4SLinus Torvaldsexit 0
2051da177e4SLinus TorvaldsEOF
2061da177e4SLinus Torvalds	chmod 755 "$tmpdir/DEBIAN/$script"
2071da177e4SLinus Torvaldsdone
2081da177e4SLinus Torvalds
209d7d357bcSJoerg Roedelif [ "$ARCH" != "um" ]; then
210bac977cbSMasahiro Yamada	if is_enabled CONFIG_MODULES; then
2113126c17dSMasahiro Yamada		deploy_kernel_headers debian/linux-headers
2123126c17dSMasahiro Yamada		create_package linux-headers-$version debian/linux-headers
213bac977cbSMasahiro Yamada	fi
2143126c17dSMasahiro Yamada
215451dff37SMasahiro Yamada	deploy_libc_headers debian/linux-libc-dev
216451dff37SMasahiro Yamada	create_package linux-libc-dev debian/linux-libc-dev
217d7d357bcSJoerg Roedelfi
218d7d357bcSJoerg Roedel
2193e2ab256SFrans Popcreate_package "$packagename" "$tmpdir"
2201da177e4SLinus Torvalds
221810e8437SAnisse Astierif [ -n "$BUILD_DEBUG" ] ; then
222810e8437SAnisse Astier	# Build debug package
223810e8437SAnisse Astier	# Different tools want the image in different locations
224810e8437SAnisse Astier	# perf
225810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
226810e8437SAnisse Astier	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
227810e8437SAnisse Astier	# systemtap
228810e8437SAnisse Astier	mkdir -p $dbg_dir/usr/lib/debug/boot/
229810e8437SAnisse Astier	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
230810e8437SAnisse Astier	# kdump-tools
231810e8437SAnisse Astier	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
232810e8437SAnisse Astier	create_package "$dbg_packagename" "$dbg_dir"
233810e8437SAnisse Astierfi
234810e8437SAnisse Astier
2351da177e4SLinus Torvaldsexit 0
236