Commit b611daae authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kbuild: deb-pkg: split image and debug objects staging out into functions



Prepare for the refactoring in the next commit.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent f50aa51c
Loading
Loading
Loading
Loading
+116 −106
Original line number Original line Diff line number Diff line
@@ -51,6 +51,115 @@ create_package() {
	dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
	dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
}
}


install_linux_image () {
	pdir=$1
	pname=$2

	rm -rf ${pdir}

	# Only some architectures with OF support have this target
	if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
		${MAKE} -f ${srctree}/Makefile INSTALL_DTBS_PATH="${pdir}/usr/lib/linux-image-${KERNELRELEASE}" dtbs_install
	fi

	if is_enabled CONFIG_MODULES; then
		${MAKE} -f ${srctree}/Makefile INSTALL_MOD_PATH="${pdir}" modules_install
		rm -f "${pdir}/lib/modules/${KERNELRELEASE}/build"
		rm -f "${pdir}/lib/modules/${KERNELRELEASE}/source"
		if [ "${SRCARCH}" = um ] ; then
			mkdir -p "${pdir}/usr/lib/uml/modules"
			mv "${pdir}/lib/modules/${KERNELRELEASE}" "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}"
		fi
	fi

	# Install the kernel
	if [ "${ARCH}" = um ] ; then
		mkdir -p "${pdir}/usr/bin" "${pdir}/usr/share/doc/${pname}"
		cp System.map "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}/System.map"
		cp ${KCONFIG_CONFIG} "${pdir}/usr/share/doc/${pname}/config"
		gzip "${pdir}/usr/share/doc/${pname}/config"
	else
		mkdir -p "${pdir}/boot"
		cp System.map "${pdir}/boot/System.map-${KERNELRELEASE}"
		cp ${KCONFIG_CONFIG} "${pdir}/boot/config-${KERNELRELEASE}"
	fi

	# Not all arches have the same installed path in debian
	# XXX: have each arch Makefile export a variable of the canonical image install
	# path instead
	case "${SRCARCH}" in
	um)
		installed_image_path="usr/bin/linux-${KERNELRELEASE}";;
	parisc|mips|powerpc)
		installed_image_path="boot/vmlinux-${KERNELRELEASE}";;
	*)
		installed_image_path="boot/vmlinuz-${KERNELRELEASE}";;
	esac
	cp "$(${MAKE} -s -f ${srctree}/Makefile image_name)" "${pdir}/${installed_image_path}"

	# Install the maintainer scripts
	# Note: hook scripts under /etc/kernel are also executed by official Debian
	# kernel packages, as well as kernel packages built using make-kpkg.
	# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
	# so do we; recent versions of dracut and initramfs-tools will obey this.
	debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
	for script in postinst postrm preinst prerm; do
		mkdir -p "${pdir}${debhookdir}/${script}.d"

		mkdir -p "${pdir}/DEBIAN"
		cat <<-EOF > "${pdir}/DEBIAN/${script}"

		#!/bin/sh

		set -e

		# Pass maintainer script parameters to hook scripts
		export DEB_MAINT_PARAMS="\$*"

		# Tell initramfs builder whether it's wanted
		export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)

		test -d ${debhookdir}/${script}.d && run-parts --arg="${KERNELRELEASE}" --arg="/${installed_image_path}" ${debhookdir}/${script}.d
		exit 0
		EOF
		chmod 755 "${pdir}/DEBIAN/${script}"
	done
}

install_linux_image_dbg () {
	pdir=$1
	image_pdir=$2

	rm -rf ${pdir}

	for module in $(find ${image_pdir}/lib/modules/ -name *.ko -printf '%P\n'); do
		module=lib/modules/${module}
		mkdir -p $(dirname ${pdir}/usr/lib/debug/${module})
		# only keep debug symbols in the debug file
		${OBJCOPY} --only-keep-debug ${image_pdir}/${module} ${pdir}/usr/lib/debug/${module}
		# strip original module from debug symbols
		${OBJCOPY} --strip-debug ${image_pdir}/${module}
		# then add a link to those
		${OBJCOPY} --add-gnu-debuglink=${pdir}/usr/lib/debug/${module} ${image_pdir}/${module}
	done

	# re-sign stripped modules
	if is_enabled CONFIG_MODULE_SIG_ALL; then
		${MAKE} -f ${srctree}/Makefile INSTALL_MOD_PATH="${image_pdir}" modules_sign
	fi

	# Build debug package
	# Different tools want the image in different locations
	# perf
	mkdir -p ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
	cp vmlinux ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
	# systemtap
	mkdir -p ${pdir}/usr/lib/debug/boot/
	ln -s ../lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/boot/vmlinux-${KERNELRELEASE}
	# kdump-tools
	ln -s lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/vmlinux-${KERNELRELEASE}
}

deploy_kernel_headers () {
deploy_kernel_headers () {
	pdir=$1
	pdir=$1


@@ -105,8 +214,6 @@ deploy_libc_headers () {
}
}


version=$KERNELRELEASE
version=$KERNELRELEASE
tmpdir=debian/linux-image
dbg_dir=debian/linux-image-dbg
packagename=linux-image-$version
packagename=linux-image-$version
dbg_packagename=$packagename-dbg
dbg_packagename=$packagename-dbg


@@ -114,97 +221,7 @@ if [ "$ARCH" = "um" ] ; then
	packagename=user-mode-linux-$version
	packagename=user-mode-linux-$version
fi
fi


# Not all arches have the same installed path in debian
rm -f debian/files
# XXX: have each arch Makefile export a variable of the canonical image install
# path instead
case $ARCH in
um)
	installed_image_path="usr/bin/linux-$version"
	;;
parisc|mips|powerpc)
	installed_image_path="boot/vmlinux-$version"
	;;
*)
	installed_image_path="boot/vmlinuz-$version"
esac

BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes)

# Setup the directory structure
rm -rf "$tmpdir" "$dbg_dir" debian/files
mkdir -m 755 -p "$tmpdir/DEBIAN"
mkdir -p "$tmpdir/lib" "$tmpdir/boot"

# Install the kernel
if [ "$ARCH" = "um" ] ; then
	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
	gzip "$tmpdir/usr/share/doc/$packagename/config"
else
	cp System.map "$tmpdir/boot/System.map-$version"
	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
fi
cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"

if is_enabled CONFIG_OF_EARLY_FLATTREE; then
	# Only some architectures with OF support have this target
	if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then
		$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
	fi
fi

if is_enabled CONFIG_MODULES; then
	INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
	rm -f "$tmpdir/lib/modules/$version/build"
	rm -f "$tmpdir/lib/modules/$version/source"
	if [ "$ARCH" = "um" ] ; then
		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
		rmdir "$tmpdir/lib/modules/$version"
	fi
	if [ -n "$BUILD_DEBUG" ] ; then
		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
			module=lib/modules/$module
			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
			# only keep debug symbols in the debug file
			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
			# strip original module from debug symbols
			$OBJCOPY --strip-debug $tmpdir/$module
			# then add a link to those
			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
		done

		# resign stripped modules
		if is_enabled CONFIG_MODULE_SIG_ALL; then
			INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
		fi
	fi
fi

# Install the maintainer scripts
# Note: hook scripts under /etc/kernel are also executed by official Debian
# kernel packages, as well as kernel packages built using make-kpkg.
# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
# so do we; recent versions of dracut and initramfs-tools will obey this.
debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
for script in postinst postrm preinst prerm ; do
	mkdir -p "$tmpdir$debhookdir/$script.d"
	cat <<EOF > "$tmpdir/DEBIAN/$script"
#!/bin/sh

set -e

# Pass maintainer script parameters to hook scripts
export DEB_MAINT_PARAMS="\$*"

# Tell initramfs builder whether it's wanted
export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)

test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
exit 0
EOF
	chmod 755 "$tmpdir/DEBIAN/$script"
done


if [ "$ARCH" != "um" ]; then
if [ "$ARCH" != "um" ]; then
	if is_enabled CONFIG_MODULES; then
	if is_enabled CONFIG_MODULES; then
@@ -216,20 +233,13 @@ if [ "$ARCH" != "um" ]; then
	create_package linux-libc-dev debian/linux-libc-dev
	create_package linux-libc-dev debian/linux-libc-dev
fi
fi


create_package "$packagename" "$tmpdir"
install_linux_image debian/linux-image "$packagename"


if [ -n "$BUILD_DEBUG" ] ; then
if is_enabled CONFIG_DEBUG_INFO; then
	# Build debug package
	install_linux_image_dbg debian/linux-image-dbg debian/linux-image
	# Different tools want the image in different locations
	create_package "$dbg_packagename" debian/linux-image-dbg
	# perf
	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
	# systemtap
	mkdir -p $dbg_dir/usr/lib/debug/boot/
	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
	# kdump-tools
	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
	create_package "$dbg_packagename" "$dbg_dir"
fi
fi


create_package "$packagename" debian/linux-image

exit 0
exit 0