[PATCH 7/7][RFC][LRM][Unstable] debian: build backport-iwlwifi-dkms

You-Sheng Yang vicamo.yang at canonical.com
Thu Apr 14 21:21:23 UTC 2022


From: "You-Sheng Yang (vicamo)" <vicamo.yang at canonical.com>

BugLink: https://bugs.launchpad.net/bugs/1962515

backport-iwlwifi-dkms builds follows almost exactly the same process
with nvidia graphic drivers, except that it carries unsigned kernel
module binaries directly in linux-objects-iwlwifi package. The carried
modules are renamed to have a ".unsigned" suffix, so that they will be
ineffective ubiquity live sessions. There is no latelink either.

Signed-off-by: You-Sheng Yang (vicamo) <vicamo.yang at canonical.com>
---
 debian/dkms-versions                 |  1 +
 debian/package.config                |  1 +
 debian/rules.in.iwlwifi              | 15 +++++
 debian/scripts/dkms-build--iwlwifi-N | 83 ++++++++++++++++++++++++++++
 debian/scripts/gen-rules.lrg         | 12 ++++
 debian/scripts/gen-rules.lrm         | 14 ++++-
 debian/templates/iwlwifi.postinst.in | 44 +++++++++++++++
 debian/templates/iwlwifi.postrm.in   | 12 ++++
 debian/templates/iwlwifi.prerm.in    | 19 +++++++
 update-version                       |  1 +
 10 files changed, 201 insertions(+), 1 deletion(-)
 create mode 100644 debian/rules.in.iwlwifi
 create mode 100755 debian/scripts/dkms-build--iwlwifi-N
 create mode 100755 debian/templates/iwlwifi.postinst.in
 create mode 100755 debian/templates/iwlwifi.postrm.in
 create mode 100755 debian/templates/iwlwifi.prerm.in

diff --git a/debian/dkms-versions b/debian/dkms-versions
index f2fef23..d02c56a 100644
--- a/debian/dkms-versions
+++ b/debian/dkms-versions
@@ -5,3 +5,4 @@ nvidia-graphics-drivers-418-server 418.226.00-0ubuntu4 arch=amd64
 nvidia-graphics-drivers-450-server 450.172.01-0ubuntu3 arch=amd64 transition=nvidia-graphics-drivers-440-server
 nvidia-graphics-drivers-470-server 470.103.01-0ubuntu2 arch=amd64 transition=nvidia-graphics-drivers-460-server
 nvidia-graphics-drivers-510-server 510.47.03-0ubuntu1 arch=amd64
+backport-iwlwifi-dkms 9858-0ubuntu2 arch=amd64
diff --git a/debian/package.config b/debian/package.config
index d2b2dd0..a7c4624 100644
--- a/debian/package.config
+++ b/debian/package.config
@@ -2,6 +2,7 @@ build generic amd64 arm64
 build generic-64k arm64
 option desktop
 option server
+option iwlwifi
 transitional nvidia 440-oem-20.04 450-generic amd64
 transitional nvidia 450-oem-20.04 450-generic amd64
 suppress nvidia-graphics-drivers-390
diff --git a/debian/rules.in.iwlwifi b/debian/rules.in.iwlwifi
new file mode 100644
index 0000000..c93619c
--- /dev/null
+++ b/debian/rules.in.iwlwifi
@@ -0,0 +1,15 @@
+
+# @package@ @version@ @suffix_minus@ @suffix_under@
+dkms_ at module@_ at suffix_under@_version=$(shell gawk '/^@package@ / { print $$2; }' debian/dkms-versions)
+ at module@_ at suffix_under@_upstream_version=$(shell echo "$(dkms_ at module@_ at suffix_under@_version)" | cut -d '-' -f 1)
+gencontrol_flags += -Vdkms:@module at -@suffix_minus at -modules="@module at -dkms-@suffix_minus@ (= $(dkms_ at module@_ at suffix_under@_version))"
+test::
+	@echo @package@ @version@ @suffix_minus@ @suffix_under@ @suffix_short@ @targets@
+ at targets@::
+	rm -rf $(dkms_dir)/build $(dkms_dir)/source
+	mkdir -p $(dkms_dir)/build $(dkms_dir)/source
+	install -d debian/linux-modules- at module@- at suffix_minus@-$(src_abi)- at flavour@
+	install -d debian/linux-modules- at module@- at suffix_minus@-$(src_abi)- at flavour@/usr/lib/linux/triggers
+	$(call install_control,linux-modules- at module@- at suffix_minus@-$(src_abi)- at flavour@, at flavour@, at module@, at suffix_short@,postinst postrm prerm)
+	install -d debian/linux-objects- at module@- at suffix_minus@-$(src_abi)- at flavour@
+	$(call build_dkms, $(src_abi)- at flavour@, linux-objects- at module@- at suffix_minus@-$(src_abi)- at flavour@, $(CURDIR)/debian/linux-objects- at module@- at suffix_minus@-$(src_abi)- at flavour@/lib/modules/$(src_abi)- at flavour@/kernel, "", @module at -@suffix_short@, pool/restricted/b/backport-iwlwifi-dkms/backport-iwlwifi-dkms_$(dkms_ at module@_ at suffix_under@_version)_all.deb)
diff --git a/debian/scripts/dkms-build--iwlwifi-N b/debian/scripts/dkms-build--iwlwifi-N
new file mode 100755
index 0000000..caa1ba3
--- /dev/null
+++ b/debian/scripts/dkms-build--iwlwifi-N
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+srcdir="$1"
+objects="$2"
+log="$3"
+shift 3
+
+dkms_dir="$1"
+abi_flavour="$2"
+sign="$3"
+pkgname="$4"
+pkgdir="$5"
+dbgpkgdir="$6"
+package="$7"
+shift 7
+
+unsigned_ko_suffix=.unsigned
+
+mkdir -p "$pkgdir/bits"
+(
+	gcc_variant1=$(gcc --version | head -1 | sed -e 's/^gcc/GCC:/')
+	gcc_variant2=$(gcc --version | head -1 | sed -e 's/^\(gcc\) \((.*)\) \(.*\)$/\1 version \3 \2/')
+	for ko in "$pkgdir"/*.ko
+	do
+		ko=$(basename "$ko")
+		mv "$pkgdir/$ko" "$pkgdir/bits/$ko$unsigned_ko_suffix"
+		"$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$ko$unsigned_ko_suffix" "$gcc_variant1"
+		"$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$ko$unsigned_ko_suffix" "$gcc_variant2"
+	done
+)
+
+# Build helper scripts.
+cat - <<'EOL' >"$pkgdir/bits/BUILD"
+[ "$1" = "unsigned" ] && { signed_only=:; shift; }
+[ "$1" = "nocheck" ] && { check_only=:; shift; }
+EOL
+
+(
+	cd "$pkgdir/bits" || exit 1
+
+	# Add checksum check.
+	echo "\$check_only sha256sum -c SHA256SUMS || exit 1" >>"$pkgdir/bits/BUILD"
+
+	# Add .ko handling to the CLEAN/BUILD dance.
+	for unsigned_ko in "$pkgdir"/bits/*.ko$unsigned_ko_suffix
+	do
+		unsigned_ko=$(basename "$unsigned_ko")
+		ko=${unsigned_ko%$unsigned_ko_suffix}
+		echo "\$signed_only cat '$unsigned_ko' '$ko.sig' >'../$ko'" >>"$pkgdir/bits/BUILD"
+		echo "rm -f '../$ko'" >>"$pkgdir/bits/CLEAN"
+	done
+
+	if [ "$sign" = "--custom" ]; then
+		# We are building for and archive custom signing upload.  Keep everything.
+		:
+	elif [ "$sign" = "--lrm" ]; then
+		# We are in the LRM build; grab sha256 checksums and clean up.
+		sha256sum -b *.ko$unsigned_ko_suffix >"SHA256SUMS"
+	else
+		# We are in the main kernel, put the .kos together as we will
+		# on the users machine, sign them, and keep just the signature.
+		: >"SHA256SUMS"
+		for unsigned_ko in *.ko$unsigned_ko_suffix
+		do
+			ko=${unsigned_ko%$unsigned_ko_suffix}
+			echo "detached-signature $ko"
+			$sign "$unsigned_ko" "$ko"
+			length=$( stat --format %s "$unsigned_ko" )
+			dd if="$ko" of="$ko.sig" bs=1 skip="$length" 2>/dev/null
+
+			rm -f "$ko"
+			# Keep a checksum of the pre-signed object so we can check it is
+			# built correctly in LRM.
+			sha256sum -b "$unsigned_ko" >>"SHA256SUMS"
+		done
+
+		# Clean out anything which not a signature.
+		mv "$pkgdir/bits/"*.sig "$pkgdir"
+		mv "$pkgdir/bits/SHA256SUMS" "$pkgdir"
+		find "$pkgdir" -name \*.sig -prune -o -name SHA256SUMS -prune -o -type f -print | xargs rm -f
+		find "$pkgdir" -depth -type d -print | xargs rmdir --ignore-fail-on-non-empty
+	fi
+) || exit "$?"
diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
index fd16fa5..ef25d1e 100755
--- a/debian/scripts/gen-rules.lrg
+++ b/debian/scripts/gen-rules.lrg
@@ -46,6 +46,7 @@ EOL
 
 nvidia_desktop=
 nvidia_server=
+build_iwlwifi=
 suppress=
 while read command arg
 do
@@ -58,6 +59,7 @@ do
 	case "$arg" in
 	desktop)	nvidia_desktop=y ;;
 	server)		nvidia_server=y ;;
+	iwlwifi)	build_iwlwifi=y ;;
 	esac
 done <"debian/package.config"
 
@@ -87,6 +89,9 @@ do
 		nvidia-graphics-drivers-*)
 			[ -z "$nvidia_desktop" ] && continue
 			;;
+		backport-iwlwifi-dkms)
+			[ -z "$build_iwlwifi" ] && continue
+			;;
 		*) continue ;;
 		esac
 		case " $suppress " in
@@ -129,6 +134,13 @@ do
 			suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
 			suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
 			;;
+		backport-iwlwifi-dkms)
+			module=iwlwifi
+			suffix_minus=${version%%-*}
+			suffix_minus=${suffix_minus#*:}
+			suffix_under=${suffix_minus}
+			suffix_short=${suffix_minus}
+			;;
 		*) continue ;;
 		esac
 
diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
index 165dfbe..4b64336 100755
--- a/debian/scripts/gen-rules.lrm
+++ b/debian/scripts/gen-rules.lrm
@@ -32,7 +32,7 @@ src_sigs_version=${src_version}
 
 mkdir -p "debian/control.d"
 : >"debian/control.interlock-up"
-for module in nvidia; do
+for module in iwlwifi nvidia; do
 	: >"debian/control.d/meta-${module}"
 	: >"debian/control.d/${module}"
 	: >"debian/control.d/migrate-${module}"
@@ -61,6 +61,7 @@ fi
 
 nvidia_desktop=
 nvidia_server=
+build_iwlwifi=
 suppress=
 while read command arg
 do
@@ -73,6 +74,7 @@ do
 	case "$arg" in
 	desktop)	nvidia_desktop=y ;;
 	server)		nvidia_server=y ;;
+	iwlwifi)	build_iwlwifi=y ;;
 	esac
 done <"debian/package.config"
 
@@ -97,6 +99,9 @@ EOL
 		nvidia-graphics-drivers-*)
 			[ -z "$nvidia_desktop" ] && continue
 			;;
+		backport-iwlwifi-dkms)
+			[ -z "$build_iwlwifi" ] && continue
+			;;
 		*) continue ;;
 		esac
 		case " $suppress " in
@@ -139,6 +144,13 @@ EOL
 			suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
 			suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
 			;;
+		backport-iwlwifi-dkms)
+			module=iwlwifi
+			suffix_minus=${version%%-*}
+			suffix_minus=${suffix_minus#*:}
+			suffix_under=${suffix_minus}
+			suffix_short=${suffix_minus}
+			;;
 		*) continue ;;
 		esac
 
diff --git a/debian/templates/iwlwifi.postinst.in b/debian/templates/iwlwifi.postinst.in
new file mode 100755
index 0000000..ad5abec
--- /dev/null
+++ b/debian/templates/iwlwifi.postinst.in
@@ -0,0 +1,44 @@
+#!/bin/sh
+set -e
+
+version=@abiname@@localversion@
+image_path=/boot/@image-stem at -$version
+
+bits=/lib/modules/$version/kernel/@module at -@suffix-short@/bits
+
+if [ "$1" != configure ]; then
+    exit 0
+fi
+
+ubiquity_live() {
+    if [ -n "${UBIQUITY_FRONTEND}" ] && ! systemd-detect-virt --chroot; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+if ! ubiquity_live; then
+	(
+		cd "$bits" || exit 1
+		echo "linux-image- at module@-$version: constructing .ko files"
+		/bin/sh ./BUILD
+	)
+else
+	(
+		cd "$bits" || exit 1
+		echo "linux-image- at module@-$version: removing .ko files"
+		/bin/sh ./CLEAN
+	)
+fi
+
+depmod -a -F /boot/System.map-$version $version || true
+if [ -d /etc/kernel/postinst.d ]; then
+    cat - >/usr/lib/linux/triggers/$version <<EOF
+DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \
+	    --arg="$image_path" /etc/kernel/postinst.d
+EOF
+    dpkg-trigger --no-await linux-update-$version
+fi
+
+exit 0
diff --git a/debian/templates/iwlwifi.postrm.in b/debian/templates/iwlwifi.postrm.in
new file mode 100755
index 0000000..8622e26
--- /dev/null
+++ b/debian/templates/iwlwifi.postrm.in
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -e
+
+version=@abiname@@localversion@
+
+if [ "$1" != remove ]; then
+    exit 0
+fi
+
+depmod -a -F /boot/System.map-$version $version 2>/dev/null || true
+
+exit 0
diff --git a/debian/templates/iwlwifi.prerm.in b/debian/templates/iwlwifi.prerm.in
new file mode 100755
index 0000000..38cafaa
--- /dev/null
+++ b/debian/templates/iwlwifi.prerm.in
@@ -0,0 +1,19 @@
+#! /bin/sh
+set -e
+
+version=@abiname@@localversion@
+
+bits=/lib/modules/$version/kernel/@module at -@suffix-short@/bits
+
+if [ "$1" != remove ]; then
+    exit 0
+fi
+
+# Clear out the build image before we lose the ability to do so.
+(
+	cd "$bits" || exit 1
+	echo "linux-image- at module@-$version: removing .ko files"
+	/bin/sh ./CLEAN
+)
+
+exit 0
diff --git a/update-version b/update-version
index d945eb3..8ed1bd8 100755
--- a/update-version
+++ b/update-version
@@ -82,6 +82,7 @@ if [ "$no_update" = 'false' ]; then
 	for master_file in \
 		debian/scripts/misc/git-ubuntu-log \
 		debian/scripts/dkms-build \
+		debian/scripts/dkms-build--iwlwifi-N \
 		debian/scripts/dkms-build--nvidia-N \
 		debian/scripts/fix-filenames.c
 	do
-- 
2.34.1




More information about the kernel-team mailing list