Description: Use Ubuntu-style build for Livepatch Generation
 This patch changes the livepatch mechanism for Ubuntu. Instead of using
 the kernel makefile directly, the build is performed using debian/rules,
 so it matches how the Ubuntu kernel is actually made.

Author: Benjamin M Romer <benjamin.romer@canonical.com>
Last-Update: 2022-05-24

--- a/kpatch-build/kpatch-build
+++ b/kpatch-build/kpatch-build
@@ -177,12 +177,12 @@
 	for (( ; APPLIED_PATCHES>0; APPLIED_PATCHES-- )); do
 		idx=$(( APPLIED_PATCHES - 1))
 		patch="${PATCH_LIST[$idx]}"
-		patch -p1 -R -d "$BUILDDIR" < "$patch" &> /dev/null
+		patch -p1 -R -d "$KERNEL_SRCDIR" < "$patch" &> /dev/null
 	done
 
 	# If $BUILDDIR was a git repo, make sure git actually sees that
 	# we've reverted our patch(es).
-	[[ -d "$BUILDDIR/.git" ]] && (cd "$BUILDDIR" && git update-index -q --refresh)
+	[[ -d "$BUILDDIR/.git" ]] && (cd "$KERNEL_SRCDIR" && git update-index -q --refresh)
 }
 
 # List of kernel tree files that kpatch-build backed up to
@@ -931,7 +931,12 @@
 	fi
 	BUILDDIR="$OOT_MODULE_SRCDIR"
 else
-	BUILDDIR="$KERNEL_SRCDIR"
+	if [[ $DISTRO = ubuntu ]]; then
+		BUILDDIR="$TEMPDIR/build-generic"
+		mkdir -p "$BUILDDIR"
+	else
+		BUILDDIR="$KERNEL_SRCDIR"
+	fi
 fi
 
 [[ "$SKIPCLEANUP" -eq 0 ]] && trap cleanup EXIT INT TERM HUP
@@ -994,6 +999,12 @@
 		backup_kernel_file "vmlinux"
 		VMLINUX="$KERNEL_BACKUPDIR/vmlinux"
 	fi
+
+	# save debian before it gets removed with mrproper
+	if [[ -e "$SRCDIR/debian" ]]; then
+		cp -rf "$SRCDIR/debian" "$TEMPDIR/debian.bak"
+	fi
+
 elif [[ -n "$OOT_MODULE" ]]; then
 	if [[ -z "${CONFIGFILE}" ]]; then
 		CONFIGFILE="/boot/config-${ARCHVERSION}"
@@ -1244,7 +1255,7 @@
 fi
 
 echo "Testing patch file(s)"
-cd "$BUILDDIR" || die
+cd "$KERNEL_SRCDIR" || die
 verify_patch_files
 apply_patches
 remove_patches
@@ -1298,13 +1309,30 @@
 	MAKEVARS+=("ARCH=$KARCH")
 fi
 
+if [[ $DISTRO = ubuntu ]]; then
+	mv "$KERNEL_SRCDIR/debian" "$KERNEL_SRCDIR/debian.master" "$TEMPDIR"
+	make mrproper 2>&1 | logger || die
+	mv "$TEMPDIR/debian" "$TEMPDIR/debian.master" "$KERNEL_SRCDIR"
+	fakeroot debian/rules clean 2>&1 | logger || die
+	# shellcheck disable=SC1117
+	MAKEFLAGS="--no-print-directory" fakeroot \
+		debian/rules "${MAKEVARS[@]}" "-j$CPUS" \
+		build-generic build_image=vmlinux builddir="$TEMPDIR" \
+		enable_zfs=false  2>&1 | logger \
+		|| die
+else
+	# $TARGETS used as list, no quotes.
+	# shellcheck disable=SC2086
+	make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+fi
 
-# $TARGETS used as list, no quotes.
-# shellcheck disable=SC2086
-make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+MODULE_SYMVERS="$KERNEL_SRCDIR/Module.symvers"
+if [[ "$DISTRO" = ubuntu ]]; then
+	MODULE_SYMVERS="$TEMPDIR/build-generic/Module.symvers"
+fi
 
 # Save original module symvers
-cp -f "$BUILDDIR/Module.symvers" "$TEMPDIR/Module.symvers" || die
+cp -f "$MODULE_SYMVERS" "$TEMPDIR/Module.symvers" || die
 
 echo "Building patched source"
 apply_patches
@@ -1312,9 +1340,20 @@
 export KPATCH_GCC_TEMPDIR="$TEMPDIR"
 export KPATCH_GCC_SRCDIR="$BUILDDIR"
 save_env
-# $TARGETS used as list, no quotes.
-# shellcheck disable=SC2086
-KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+
+if [[ $DISTRO = ubuntu ]]; then
+	rm -f debian/stamps/stamp-build-generic
+	# shellcheck disable=SC1117
+	MAKEFLAGS="--no-print-directory" fakeroot \
+		debian/rules "${MAKEVARS[@]}" "-j$CPUS" \
+		build-generic build_image=vmlinux builddir="$TEMPDIR" \
+		enable_zfs=false  2>&1 | logger \
+		|| die
+else
+	# $TARGETS used as list, no quotes.
+	# shellcheck disable=SC2086
+	KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+fi
 
 # source.c:(.section+0xFF): undefined reference to `symbol'
 grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\\1/" \
@@ -1327,7 +1366,7 @@
 	die "no changed objects found"
 fi
 
-grep -q vmlinux "$KERNEL_SRCDIR/Module.symvers" || die "truncated $KERNEL_SRCDIR/Module.symvers file"
+grep -q vmlinux "$MODULE_SYMVERS" || die "truncated $MODULE_SYMVERS file"
 
 if [[ -n "$CONFIG_MODVERSIONS" ]]; then
 	trace_off "reading Module.symvers"
@@ -1478,13 +1517,6 @@
 
 echo "Building patch module: $MODNAME.ko"
 
-if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then
-	# UBUNTU: add UTS_UBUNTU_RELEASE_ABI to utsrelease.h after regenerating it
-	UBUNTU_ABI="${ARCHVERSION#*-}"
-	UBUNTU_ABI="${UBUNTU_ABI%-*}"
-	echo "#define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI" >> "$KERNEL_SRCDIR"/include/generated/utsrelease.h
-fi
-
 cd "$TEMPDIR/output" || die
 # $KPATCH_LDFLAGS and result of find used as list, no quotes.
 # shellcheck disable=SC2086,SC2046
