diff mbox series

[JAMMY/linux-restricted-modules-oem-5.17|intel-iotg] UBUNTU: [Packaging] LRMv6: add multi-architecture support

Message ID 20220617150957.75257-1-dimitri.ledkov@canonical.com
State New
Headers show
Series [JAMMY/linux-restricted-modules-oem-5.17|intel-iotg] UBUNTU: [Packaging] LRMv6: add multi-architecture support | expand

Commit Message

Dimitri John Ledkov June 17, 2022, 3:09 p.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1968774

Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
---

 This patch upgrades LRMv5.2 to LRMv6.0 in:
 - jammy/linux-restricted-modules-oem-5.17
 - jammy/linux-restricted-modules-intel-iotg

 To update packaging to feature parity with LRM jammy generic.

 debian/lrm-version           |  2 +-
 debian/scripts/gen-rules     |  1 +
 debian/scripts/gen-rules.lrg | 43 ++++++++++++++++++++++++++---
 debian/scripts/gen-rules.lrm | 53 ++++++++++++++++++++++++++++++------
 debian/scripts/gen-rules.lrs | 12 ++++++++
 5 files changed, 97 insertions(+), 14 deletions(-)

Comments

Tim Gardner June 17, 2022, 3:25 p.m. UTC | #1
On 6/17/22 09:09, Dimitri John Ledkov wrote:
> BugLink: https://bugs.launchpad.net/bugs/1968774
> 
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
> ---
> 
>   This patch upgrades LRMv5.2 to LRMv6.0 in:
>   - jammy/linux-restricted-modules-oem-5.17
>   - jammy/linux-restricted-modules-intel-iotg
> 
>   To update packaging to feature parity with LRM jammy generic.
> 
>   debian/lrm-version           |  2 +-
>   debian/scripts/gen-rules     |  1 +
>   debian/scripts/gen-rules.lrg | 43 ++++++++++++++++++++++++++---
>   debian/scripts/gen-rules.lrm | 53 ++++++++++++++++++++++++++++++------
>   debian/scripts/gen-rules.lrs | 12 ++++++++
>   5 files changed, 97 insertions(+), 14 deletions(-)
> 
> diff --git a/debian/lrm-version b/debian/lrm-version
> index ef425ca982..e0ea36feef 100644
> --- a/debian/lrm-version
> +++ b/debian/lrm-version
> @@ -1 +1 @@
> -5.2
> +6.0
> diff --git a/debian/scripts/gen-rules b/debian/scripts/gen-rules
> index 48944818a8..c5c36a60e8 100755
> --- a/debian/scripts/gen-rules
> +++ b/debian/scripts/gen-rules
> @@ -1,4 +1,5 @@
>   #!/bin/bash
> +set -e
>   
>   src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
>   case "$src_package" in
> diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
> index 61ad057804..db613272ae 100755
> --- a/debian/scripts/gen-rules.lrg
> +++ b/debian/scripts/gen-rules.lrg
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -58,6 +69,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> +	validate_unique "archs" "$archs"
>   	for arch in $archs
>   	do
>   		case " $build_archs " in
> @@ -66,8 +78,6 @@ do
>   		esac
>   	done
>   
> -	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
>   	while read package version extra
>   	do
>   		case "$package" in
> @@ -87,14 +97,39 @@ do
>   		*\ signonly\ *)		continue ;;
>   		esac
>   
> +		# If package specifies arch= keys, only build it on
> +		# the intersection of kernel flavour arches & the
> +		# package arches, otherwise build for all kernel
> +		# flavour arches.
> +		pkg_archs=
> +		for cmd in $extra
> +		do
> +			case "$cmd" in
> +			arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +			esac
> +		done
> +		# No package arches set, build for everything
> +		if [ -z "$pkg_archs" ]; then
> +			pkg_archs=$archs
> +		else
> +			# Package arches set, build for intersection
> +			validate_unique "pkg_archs" "$pkg_archs"
> +			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +			# No intersection, skip
> +			if [ -z "$pkg_archs" ]; then
> +				continue
> +			fi
> +		fi
> +
> +		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>   		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>   		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>   		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>   
> -		echo "II: build $package for $flavour $archs"
> +		echo "II: build $package for $flavour $pkg_archs"
>   
>   		cat - >>"debian/control.interlock-up" <<EOL
> - linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${archs}],
> + linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
>   EOL
>   
>   		# debian/rules.gen
> diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
> index 574a00ec3a..223918f50a 100755
> --- a/debian/scripts/gen-rules.lrm
> +++ b/debian/scripts/gen-rules.lrm
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -70,8 +81,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> -	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
> +	validate_unique "archs" "$archs"
>   	cat - >>"debian/control.interlock-up" <<EOL
>    linux-headers-${src_abi}-${flavour} (>= @VERSION@) [${archs}],
>   EOL
> @@ -95,11 +105,36 @@ EOL
>   		*\ signonly\ *)		continue ;;
>   		esac
>   
> +		# If package specifies arch= keys, only build it on
> +		# the intersection of kernel flavour arches & the
> +		# package arches, otherwise build for all kernel
> +		# flavour arches.
> +		pkg_archs=
> +		for cmd in $extra
> +		do
> +			case "$cmd" in
> +			arch=*)		pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +			esac
> +		done
> +		# No package arches set, build for everything
> +		if [ -z "$pkg_archs" ]; then
> +			pkg_archs=$archs
> +		else
> +			# Package arches set, build for intersection
> +			validate_unique "pkg_archs" "$pkg_archs"
> +			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +			# No intersection, skip
> +			if [ -z "$pkg_archs" ]; then
> +				continue
> +			fi
> +		fi
> +
> +		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>   		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>   		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>   		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>   
> -		echo "II: build $package for $flavour $archs"
> +		echo "II: build $package for $flavour $pkg_archs"
>   
>   		# debian/rules.gen
>   		cat - >>"debian/rules.gen" <<EOL
> @@ -126,7 +161,7 @@ EOL
>   
>   Package: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Provides: \${dkms:nvidia-${suffix_minus}-modules}, nvidia-prebuilt-kernel
>   Depends:
> @@ -142,7 +177,7 @@ EOL
>   
>   Package: linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Priority: optional
>   Built-Using: \${linux:BuiltUsing}
> @@ -160,7 +195,7 @@ Description: Linux kernel nvidia modules for version ${src_abi} (objects)
>   
>   Package: linux-modules-nvidia-${suffix_minus}-${src_abi}-${flavour}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Priority: optional
>   Built-Using: \${linux:BuiltUsing}
> @@ -187,11 +222,11 @@ EOL
>   			transition=*)
>   				from="${cmd#transition=}"
>   				from_minus=$(echo "$from" | sed -e 's/nvidia-graphics-drivers-//')
> -				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus)"
> +				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus) $pkg_archs"
>   				cat - >>"debian/control.d/migrate-nvidia" <<EOL
>   
>   Package: linux-modules-nvidia-${from_minus}-${flavour}\${variant:suffix}
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: oldlibs
>   Depends: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>   Description: Extra drivers for nvidia-${from_minus} for the ${flavour} flavour (dummy transitional package)
> @@ -214,7 +249,7 @@ do
>   	esac
>   
>   	# debian/control.d/transitionals-local
> -	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to"
> +	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to $archs"
>   	cat - >>"debian/control.d/transitionals-local" <<EOL
>   
>   Package: linux-modules-nvidia-${from}
> diff --git a/debian/scripts/gen-rules.lrs b/debian/scripts/gen-rules.lrs
> index c28fc2f66b..e2ab3a1493 100755
> --- a/debian/scripts/gen-rules.lrs
> +++ b/debian/scripts/gen-rules.lrs
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux-restricted-generate -> linux-restricted-signatures -> linux-restricted-modules
> @@ -57,6 +68,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> +	validate_unique "archs" "$archs"
>   	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>   
>   	echo "II: build linux-signatures-nvidia-${src_abi}-${flavour} for ${archs}"
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Timo Aaltonen June 28, 2022, 11:05 a.m. UTC | #2
On 17.6.2022 18.09, Dimitri John Ledkov wrote:
> BugLink: https://bugs.launchpad.net/bugs/1968774
> 
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
> ---
> 
>   This patch upgrades LRMv5.2 to LRMv6.0 in:
>   - jammy/linux-restricted-modules-oem-5.17
>   - jammy/linux-restricted-modules-intel-iotg
> 
>   To update packaging to feature parity with LRM jammy generic.
> 
>   debian/lrm-version           |  2 +-
>   debian/scripts/gen-rules     |  1 +
>   debian/scripts/gen-rules.lrg | 43 ++++++++++++++++++++++++++---
>   debian/scripts/gen-rules.lrm | 53 ++++++++++++++++++++++++++++++------
>   debian/scripts/gen-rules.lrs | 12 ++++++++
>   5 files changed, 97 insertions(+), 14 deletions(-)
> 
> diff --git a/debian/lrm-version b/debian/lrm-version
> index ef425ca982..e0ea36feef 100644
> --- a/debian/lrm-version
> +++ b/debian/lrm-version
> @@ -1 +1 @@
> -5.2
> +6.0
> diff --git a/debian/scripts/gen-rules b/debian/scripts/gen-rules
> index 48944818a8..c5c36a60e8 100755
> --- a/debian/scripts/gen-rules
> +++ b/debian/scripts/gen-rules
> @@ -1,4 +1,5 @@
>   #!/bin/bash
> +set -e
>   
>   src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
>   case "$src_package" in
> diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
> index 61ad057804..db613272ae 100755
> --- a/debian/scripts/gen-rules.lrg
> +++ b/debian/scripts/gen-rules.lrg
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -58,6 +69,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> +	validate_unique "archs" "$archs"
>   	for arch in $archs
>   	do
>   		case " $build_archs " in
> @@ -66,8 +78,6 @@ do
>   		esac
>   	done
>   
> -	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
>   	while read package version extra
>   	do
>   		case "$package" in
> @@ -87,14 +97,39 @@ do
>   		*\ signonly\ *)		continue ;;
>   		esac
>   
> +		# If package specifies arch= keys, only build it on
> +		# the intersection of kernel flavour arches & the
> +		# package arches, otherwise build for all kernel
> +		# flavour arches.
> +		pkg_archs=
> +		for cmd in $extra
> +		do
> +			case "$cmd" in
> +			arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +			esac
> +		done
> +		# No package arches set, build for everything
> +		if [ -z "$pkg_archs" ]; then
> +			pkg_archs=$archs
> +		else
> +			# Package arches set, build for intersection
> +			validate_unique "pkg_archs" "$pkg_archs"
> +			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +			# No intersection, skip
> +			if [ -z "$pkg_archs" ]; then
> +				continue
> +			fi
> +		fi
> +
> +		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>   		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>   		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>   		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>   
> -		echo "II: build $package for $flavour $archs"
> +		echo "II: build $package for $flavour $pkg_archs"
>   
>   		cat - >>"debian/control.interlock-up" <<EOL
> - linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${archs}],
> + linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
>   EOL
>   
>   		# debian/rules.gen
> diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
> index 574a00ec3a..223918f50a 100755
> --- a/debian/scripts/gen-rules.lrm
> +++ b/debian/scripts/gen-rules.lrm
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -70,8 +81,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> -	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
> +	validate_unique "archs" "$archs"
>   	cat - >>"debian/control.interlock-up" <<EOL
>    linux-headers-${src_abi}-${flavour} (>= @VERSION@) [${archs}],
>   EOL
> @@ -95,11 +105,36 @@ EOL
>   		*\ signonly\ *)		continue ;;
>   		esac
>   
> +		# If package specifies arch= keys, only build it on
> +		# the intersection of kernel flavour arches & the
> +		# package arches, otherwise build for all kernel
> +		# flavour arches.
> +		pkg_archs=
> +		for cmd in $extra
> +		do
> +			case "$cmd" in
> +			arch=*)		pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +			esac
> +		done
> +		# No package arches set, build for everything
> +		if [ -z "$pkg_archs" ]; then
> +			pkg_archs=$archs
> +		else
> +			# Package arches set, build for intersection
> +			validate_unique "pkg_archs" "$pkg_archs"
> +			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +			# No intersection, skip
> +			if [ -z "$pkg_archs" ]; then
> +				continue
> +			fi
> +		fi
> +
> +		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>   		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>   		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>   		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>   
> -		echo "II: build $package for $flavour $archs"
> +		echo "II: build $package for $flavour $pkg_archs"
>   
>   		# debian/rules.gen
>   		cat - >>"debian/rules.gen" <<EOL
> @@ -126,7 +161,7 @@ EOL
>   
>   Package: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Provides: \${dkms:nvidia-${suffix_minus}-modules}, nvidia-prebuilt-kernel
>   Depends:
> @@ -142,7 +177,7 @@ EOL
>   
>   Package: linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Priority: optional
>   Built-Using: \${linux:BuiltUsing}
> @@ -160,7 +195,7 @@ Description: Linux kernel nvidia modules for version ${src_abi} (objects)
>   
>   Package: linux-modules-nvidia-${suffix_minus}-${src_abi}-${flavour}
>   Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: kernel
>   Priority: optional
>   Built-Using: \${linux:BuiltUsing}
> @@ -187,11 +222,11 @@ EOL
>   			transition=*)
>   				from="${cmd#transition=}"
>   				from_minus=$(echo "$from" | sed -e 's/nvidia-graphics-drivers-//')
> -				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus)"
> +				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus) $pkg_archs"
>   				cat - >>"debian/control.d/migrate-nvidia" <<EOL
>   
>   Package: linux-modules-nvidia-${from_minus}-${flavour}\${variant:suffix}
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>   Section: oldlibs
>   Depends: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>   Description: Extra drivers for nvidia-${from_minus} for the ${flavour} flavour (dummy transitional package)
> @@ -214,7 +249,7 @@ do
>   	esac
>   
>   	# debian/control.d/transitionals-local
> -	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to"
> +	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to $archs"
>   	cat - >>"debian/control.d/transitionals-local" <<EOL
>   
>   Package: linux-modules-nvidia-${from}
> diff --git a/debian/scripts/gen-rules.lrs b/debian/scripts/gen-rules.lrs
> index c28fc2f66b..e2ab3a1493 100755
> --- a/debian/scripts/gen-rules.lrs
> +++ b/debian/scripts/gen-rules.lrs
> @@ -1,4 +1,15 @@
>   #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +	[ "$#" = "2" ]
> +	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +	if [ "$duplicates" ]; then
> +		echo "EE: duplicate values in $1" 1>&2
> +		exit 1
> +	fi
> +}
>   
>   # Pick out relevant version and package information including our predecessor
>   # packages: linux-restricted-generate -> linux-restricted-signatures -> linux-restricted-modules
> @@ -57,6 +68,7 @@ do
>   	*)		continue ;;
>   	esac
>   
> +	validate_unique "archs" "$archs"
>   	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>   
>   	echo "II: build linux-signatures-nvidia-${src_abi}-${flavour} for ${archs}"
Dimitri John Ledkov June 28, 2022, 4:20 p.m. UTC | #3
Applied to jammy/linux-restricted-modules-oem-5.17 &
jammy/linux-restricted-modules-intel-iotg

NB! neither of these kernels appear to have kinetic tress.

NB!  @tjaalton despite
https://lists.ubuntu.com/archives/kernel-team/2022-June/131379.html I
didn't see this commit pushed to the git tree for oem-5.17 packaging
of lrm.

On Fri, 17 Jun 2022 at 16:09, Dimitri John Ledkov
<dimitri.ledkov@canonical.com> wrote:
>
> BugLink: https://bugs.launchpad.net/bugs/1968774
>
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
> ---
>
>  This patch upgrades LRMv5.2 to LRMv6.0 in:
>  - jammy/linux-restricted-modules-oem-5.17
>  - jammy/linux-restricted-modules-intel-iotg
>
>  To update packaging to feature parity with LRM jammy generic.
>
>  debian/lrm-version           |  2 +-
>  debian/scripts/gen-rules     |  1 +
>  debian/scripts/gen-rules.lrg | 43 ++++++++++++++++++++++++++---
>  debian/scripts/gen-rules.lrm | 53 ++++++++++++++++++++++++++++++------
>  debian/scripts/gen-rules.lrs | 12 ++++++++
>  5 files changed, 97 insertions(+), 14 deletions(-)
>
> diff --git a/debian/lrm-version b/debian/lrm-version
> index ef425ca982..e0ea36feef 100644
> --- a/debian/lrm-version
> +++ b/debian/lrm-version
> @@ -1 +1 @@
> -5.2
> +6.0
> diff --git a/debian/scripts/gen-rules b/debian/scripts/gen-rules
> index 48944818a8..c5c36a60e8 100755
> --- a/debian/scripts/gen-rules
> +++ b/debian/scripts/gen-rules
> @@ -1,4 +1,5 @@
>  #!/bin/bash
> +set -e
>
>  src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
>  case "$src_package" in
> diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
> index 61ad057804..db613272ae 100755
> --- a/debian/scripts/gen-rules.lrg
> +++ b/debian/scripts/gen-rules.lrg
> @@ -1,4 +1,15 @@
>  #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +       [ "$#" = "2" ]
> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +       if [ "$duplicates" ]; then
> +               echo "EE: duplicate values in $1" 1>&2
> +               exit 1
> +       fi
> +}
>
>  # Pick out relevant version and package information including our predecessor
>  # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -58,6 +69,7 @@ do
>         *)              continue ;;
>         esac
>
> +       validate_unique "archs" "$archs"
>         for arch in $archs
>         do
>                 case " $build_archs " in
> @@ -66,8 +78,6 @@ do
>                 esac
>         done
>
> -       targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
>         while read package version extra
>         do
>                 case "$package" in
> @@ -87,14 +97,39 @@ do
>                 *\ signonly\ *)         continue ;;
>                 esac
>
> +               # If package specifies arch= keys, only build it on
> +               # the intersection of kernel flavour arches & the
> +               # package arches, otherwise build for all kernel
> +               # flavour arches.
> +               pkg_archs=
> +               for cmd in $extra
> +               do
> +                       case "$cmd" in
> +                       arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +                       esac
> +               done
> +               # No package arches set, build for everything
> +               if [ -z "$pkg_archs" ]; then
> +                       pkg_archs=$archs
> +               else
> +                       # Package arches set, build for intersection
> +                       validate_unique "pkg_archs" "$pkg_archs"
> +                       pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +                       # No intersection, skip
> +                       if [ -z "$pkg_archs" ]; then
> +                               continue
> +                       fi
> +               fi
> +
> +               targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>                 suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>                 suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>                 suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>
> -               echo "II: build $package for $flavour $archs"
> +               echo "II: build $package for $flavour $pkg_archs"
>
>                 cat - >>"debian/control.interlock-up" <<EOL
> - linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${archs}],
> + linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
>  EOL
>
>                 # debian/rules.gen
> diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
> index 574a00ec3a..223918f50a 100755
> --- a/debian/scripts/gen-rules.lrm
> +++ b/debian/scripts/gen-rules.lrm
> @@ -1,4 +1,15 @@
>  #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +       [ "$#" = "2" ]
> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +       if [ "$duplicates" ]; then
> +               echo "EE: duplicate values in $1" 1>&2
> +               exit 1
> +       fi
> +}
>
>  # Pick out relevant version and package information including our predecessor
>  # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
> @@ -70,8 +81,7 @@ do
>         *)              continue ;;
>         esac
>
> -       targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
> -
> +       validate_unique "archs" "$archs"
>         cat - >>"debian/control.interlock-up" <<EOL
>   linux-headers-${src_abi}-${flavour} (>= @VERSION@) [${archs}],
>  EOL
> @@ -95,11 +105,36 @@ EOL
>                 *\ signonly\ *)         continue ;;
>                 esac
>
> +               # If package specifies arch= keys, only build it on
> +               # the intersection of kernel flavour arches & the
> +               # package arches, otherwise build for all kernel
> +               # flavour arches.
> +               pkg_archs=
> +               for cmd in $extra
> +               do
> +                       case "$cmd" in
> +                       arch=*)         pkg_archs="$pkg_archs ${cmd#arch=}" ;;
> +                       esac
> +               done
> +               # No package arches set, build for everything
> +               if [ -z "$pkg_archs" ]; then
> +                       pkg_archs=$archs
> +               else
> +                       # Package arches set, build for intersection
> +                       validate_unique "pkg_archs" "$pkg_archs"
> +                       pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
> +                       # No intersection, skip
> +                       if [ -z "$pkg_archs" ]; then
> +                               continue
> +                       fi
> +               fi
> +
> +               targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>                 suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>                 suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>                 suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>
> -               echo "II: build $package for $flavour $archs"
> +               echo "II: build $package for $flavour $pkg_archs"
>
>                 # debian/rules.gen
>                 cat - >>"debian/rules.gen" <<EOL
> @@ -126,7 +161,7 @@ EOL
>
>  Package: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>  Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>  Section: kernel
>  Provides: \${dkms:nvidia-${suffix_minus}-modules}, nvidia-prebuilt-kernel
>  Depends:
> @@ -142,7 +177,7 @@ EOL
>
>  Package: linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour}
>  Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>  Section: kernel
>  Priority: optional
>  Built-Using: \${linux:BuiltUsing}
> @@ -160,7 +195,7 @@ Description: Linux kernel nvidia modules for version ${src_abi} (objects)
>
>  Package: linux-modules-nvidia-${suffix_minus}-${src_abi}-${flavour}
>  Build-Profiles: <!stage1>
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>  Section: kernel
>  Priority: optional
>  Built-Using: \${linux:BuiltUsing}
> @@ -187,11 +222,11 @@ EOL
>                         transition=*)
>                                 from="${cmd#transition=}"
>                                 from_minus=$(echo "$from" | sed -e 's/nvidia-graphics-drivers-//')
> -                               echo "II: general transition $from -> $package ($from_minus -> $suffix_minus)"
> +                               echo "II: general transition $from -> $package ($from_minus -> $suffix_minus) $pkg_archs"
>                                 cat - >>"debian/control.d/migrate-nvidia" <<EOL
>
>  Package: linux-modules-nvidia-${from_minus}-${flavour}\${variant:suffix}
> -Architecture: ${archs}
> +Architecture: ${pkg_archs}
>  Section: oldlibs
>  Depends: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>  Description: Extra drivers for nvidia-${from_minus} for the ${flavour} flavour (dummy transitional package)
> @@ -214,7 +249,7 @@ do
>         esac
>
>         # debian/control.d/transitionals-local
> -       echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to"
> +       echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to $archs"
>         cat - >>"debian/control.d/transitionals-local" <<EOL
>
>  Package: linux-modules-nvidia-${from}
> diff --git a/debian/scripts/gen-rules.lrs b/debian/scripts/gen-rules.lrs
> index c28fc2f66b..e2ab3a1493 100755
> --- a/debian/scripts/gen-rules.lrs
> +++ b/debian/scripts/gen-rules.lrs
> @@ -1,4 +1,15 @@
>  #!/bin/bash
> +set -e
> +
> +validate_unique()
> +{
> +       [ "$#" = "2" ]
> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
> +       if [ "$duplicates" ]; then
> +               echo "EE: duplicate values in $1" 1>&2
> +               exit 1
> +       fi
> +}
>
>  # Pick out relevant version and package information including our predecessor
>  # packages: linux-restricted-generate -> linux-restricted-signatures -> linux-restricted-modules
> @@ -57,6 +68,7 @@ do
>         *)              continue ;;
>         esac
>
> +       validate_unique "archs" "$archs"
>         targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>
>         echo "II: build linux-signatures-nvidia-${src_abi}-${flavour} for ${archs}"
> --
> 2.32.0
>
Timo Aaltonen June 28, 2022, 9:02 p.m. UTC | #4
On 28.6.2022 19.20, Dimitri John Ledkov 🏳 🌈 wrote:
> Applied to jammy/linux-restricted-modules-oem-5.17 &
> jammy/linux-restricted-modules-intel-iotg
> 
> NB! neither of these kernels appear to have kinetic tress.
> 
> NB!  @tjaalton despite
> https://lists.ubuntu.com/archives/kernel-team/2022-June/131379.html I
> didn't see this commit pushed to the git tree for oem-5.17 packaging
> of lrm.

that's because I had it committed locally, waiting for the cranking of 
the kernel

> On Fri, 17 Jun 2022 at 16:09, Dimitri John Ledkov
> <dimitri.ledkov@canonical.com> wrote:
>>
>> BugLink: https://bugs.launchpad.net/bugs/1968774
>>
>> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
>> ---
>>
>>   This patch upgrades LRMv5.2 to LRMv6.0 in:
>>   - jammy/linux-restricted-modules-oem-5.17
>>   - jammy/linux-restricted-modules-intel-iotg
>>
>>   To update packaging to feature parity with LRM jammy generic.
>>
>>   debian/lrm-version           |  2 +-
>>   debian/scripts/gen-rules     |  1 +
>>   debian/scripts/gen-rules.lrg | 43 ++++++++++++++++++++++++++---
>>   debian/scripts/gen-rules.lrm | 53 ++++++++++++++++++++++++++++++------
>>   debian/scripts/gen-rules.lrs | 12 ++++++++
>>   5 files changed, 97 insertions(+), 14 deletions(-)
>>
>> diff --git a/debian/lrm-version b/debian/lrm-version
>> index ef425ca982..e0ea36feef 100644
>> --- a/debian/lrm-version
>> +++ b/debian/lrm-version
>> @@ -1 +1 @@
>> -5.2
>> +6.0
>> diff --git a/debian/scripts/gen-rules b/debian/scripts/gen-rules
>> index 48944818a8..c5c36a60e8 100755
>> --- a/debian/scripts/gen-rules
>> +++ b/debian/scripts/gen-rules
>> @@ -1,4 +1,5 @@
>>   #!/bin/bash
>> +set -e
>>
>>   src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
>>   case "$src_package" in
>> diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
>> index 61ad057804..db613272ae 100755
>> --- a/debian/scripts/gen-rules.lrg
>> +++ b/debian/scripts/gen-rules.lrg
>> @@ -1,4 +1,15 @@
>>   #!/bin/bash
>> +set -e
>> +
>> +validate_unique()
>> +{
>> +       [ "$#" = "2" ]
>> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
>> +       if [ "$duplicates" ]; then
>> +               echo "EE: duplicate values in $1" 1>&2
>> +               exit 1
>> +       fi
>> +}
>>
>>   # Pick out relevant version and package information including our predecessor
>>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
>> @@ -58,6 +69,7 @@ do
>>          *)              continue ;;
>>          esac
>>
>> +       validate_unique "archs" "$archs"
>>          for arch in $archs
>>          do
>>                  case " $build_archs " in
>> @@ -66,8 +78,6 @@ do
>>                  esac
>>          done
>>
>> -       targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>> -
>>          while read package version extra
>>          do
>>                  case "$package" in
>> @@ -87,14 +97,39 @@ do
>>                  *\ signonly\ *)         continue ;;
>>                  esac
>>
>> +               # If package specifies arch= keys, only build it on
>> +               # the intersection of kernel flavour arches & the
>> +               # package arches, otherwise build for all kernel
>> +               # flavour arches.
>> +               pkg_archs=
>> +               for cmd in $extra
>> +               do
>> +                       case "$cmd" in
>> +                       arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
>> +                       esac
>> +               done
>> +               # No package arches set, build for everything
>> +               if [ -z "$pkg_archs" ]; then
>> +                       pkg_archs=$archs
>> +               else
>> +                       # Package arches set, build for intersection
>> +                       validate_unique "pkg_archs" "$pkg_archs"
>> +                       pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
>> +                       # No intersection, skip
>> +                       if [ -z "$pkg_archs" ]; then
>> +                               continue
>> +                       fi
>> +               fi
>> +
>> +               targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>>                  suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>>                  suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>>                  suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>>
>> -               echo "II: build $package for $flavour $archs"
>> +               echo "II: build $package for $flavour $pkg_archs"
>>
>>                  cat - >>"debian/control.interlock-up" <<EOL
>> - linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${archs}],
>> + linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
>>   EOL
>>
>>                  # debian/rules.gen
>> diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
>> index 574a00ec3a..223918f50a 100755
>> --- a/debian/scripts/gen-rules.lrm
>> +++ b/debian/scripts/gen-rules.lrm
>> @@ -1,4 +1,15 @@
>>   #!/bin/bash
>> +set -e
>> +
>> +validate_unique()
>> +{
>> +       [ "$#" = "2" ]
>> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
>> +       if [ "$duplicates" ]; then
>> +               echo "EE: duplicate values in $1" 1>&2
>> +               exit 1
>> +       fi
>> +}
>>
>>   # Pick out relevant version and package information including our predecessor
>>   # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
>> @@ -70,8 +81,7 @@ do
>>          *)              continue ;;
>>          esac
>>
>> -       targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>> -
>> +       validate_unique "archs" "$archs"
>>          cat - >>"debian/control.interlock-up" <<EOL
>>    linux-headers-${src_abi}-${flavour} (>= @VERSION@) [${archs}],
>>   EOL
>> @@ -95,11 +105,36 @@ EOL
>>                  *\ signonly\ *)         continue ;;
>>                  esac
>>
>> +               # If package specifies arch= keys, only build it on
>> +               # the intersection of kernel flavour arches & the
>> +               # package arches, otherwise build for all kernel
>> +               # flavour arches.
>> +               pkg_archs=
>> +               for cmd in $extra
>> +               do
>> +                       case "$cmd" in
>> +                       arch=*)         pkg_archs="$pkg_archs ${cmd#arch=}" ;;
>> +                       esac
>> +               done
>> +               # No package arches set, build for everything
>> +               if [ -z "$pkg_archs" ]; then
>> +                       pkg_archs=$archs
>> +               else
>> +                       # Package arches set, build for intersection
>> +                       validate_unique "pkg_archs" "$pkg_archs"
>> +                       pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
>> +                       # No intersection, skip
>> +                       if [ -z "$pkg_archs" ]; then
>> +                               continue
>> +                       fi
>> +               fi
>> +
>> +               targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
>>                  suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
>>                  suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
>>                  suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
>>
>> -               echo "II: build $package for $flavour $archs"
>> +               echo "II: build $package for $flavour $pkg_archs"
>>
>>                  # debian/rules.gen
>>                  cat - >>"debian/rules.gen" <<EOL
>> @@ -126,7 +161,7 @@ EOL
>>
>>   Package: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>>   Build-Profiles: <!stage1>
>> -Architecture: ${archs}
>> +Architecture: ${pkg_archs}
>>   Section: kernel
>>   Provides: \${dkms:nvidia-${suffix_minus}-modules}, nvidia-prebuilt-kernel
>>   Depends:
>> @@ -142,7 +177,7 @@ EOL
>>
>>   Package: linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour}
>>   Build-Profiles: <!stage1>
>> -Architecture: ${archs}
>> +Architecture: ${pkg_archs}
>>   Section: kernel
>>   Priority: optional
>>   Built-Using: \${linux:BuiltUsing}
>> @@ -160,7 +195,7 @@ Description: Linux kernel nvidia modules for version ${src_abi} (objects)
>>
>>   Package: linux-modules-nvidia-${suffix_minus}-${src_abi}-${flavour}
>>   Build-Profiles: <!stage1>
>> -Architecture: ${archs}
>> +Architecture: ${pkg_archs}
>>   Section: kernel
>>   Priority: optional
>>   Built-Using: \${linux:BuiltUsing}
>> @@ -187,11 +222,11 @@ EOL
>>                          transition=*)
>>                                  from="${cmd#transition=}"
>>                                  from_minus=$(echo "$from" | sed -e 's/nvidia-graphics-drivers-//')
>> -                               echo "II: general transition $from -> $package ($from_minus -> $suffix_minus)"
>> +                               echo "II: general transition $from -> $package ($from_minus -> $suffix_minus) $pkg_archs"
>>                                  cat - >>"debian/control.d/migrate-nvidia" <<EOL
>>
>>   Package: linux-modules-nvidia-${from_minus}-${flavour}\${variant:suffix}
>> -Architecture: ${archs}
>> +Architecture: ${pkg_archs}
>>   Section: oldlibs
>>   Depends: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
>>   Description: Extra drivers for nvidia-${from_minus} for the ${flavour} flavour (dummy transitional package)
>> @@ -214,7 +249,7 @@ do
>>          esac
>>
>>          # debian/control.d/transitionals-local
>> -       echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to"
>> +       echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to $archs"
>>          cat - >>"debian/control.d/transitionals-local" <<EOL
>>
>>   Package: linux-modules-nvidia-${from}
>> diff --git a/debian/scripts/gen-rules.lrs b/debian/scripts/gen-rules.lrs
>> index c28fc2f66b..e2ab3a1493 100755
>> --- a/debian/scripts/gen-rules.lrs
>> +++ b/debian/scripts/gen-rules.lrs
>> @@ -1,4 +1,15 @@
>>   #!/bin/bash
>> +set -e
>> +
>> +validate_unique()
>> +{
>> +       [ "$#" = "2" ]
>> +       local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
>> +       if [ "$duplicates" ]; then
>> +               echo "EE: duplicate values in $1" 1>&2
>> +               exit 1
>> +       fi
>> +}
>>
>>   # Pick out relevant version and package information including our predecessor
>>   # packages: linux-restricted-generate -> linux-restricted-signatures -> linux-restricted-modules
>> @@ -57,6 +68,7 @@ do
>>          *)              continue ;;
>>          esac
>>
>> +       validate_unique "archs" "$archs"
>>          targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
>>
>>          echo "II: build linux-signatures-nvidia-${src_abi}-${flavour} for ${archs}"
>> --
>> 2.32.0
>>
> 
>
diff mbox series

Patch

diff --git a/debian/lrm-version b/debian/lrm-version
index ef425ca982..e0ea36feef 100644
--- a/debian/lrm-version
+++ b/debian/lrm-version
@@ -1 +1 @@ 
-5.2
+6.0
diff --git a/debian/scripts/gen-rules b/debian/scripts/gen-rules
index 48944818a8..c5c36a60e8 100755
--- a/debian/scripts/gen-rules
+++ b/debian/scripts/gen-rules
@@ -1,4 +1,5 @@ 
 #!/bin/bash
+set -e
 
 src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
 case "$src_package" in
diff --git a/debian/scripts/gen-rules.lrg b/debian/scripts/gen-rules.lrg
index 61ad057804..db613272ae 100755
--- a/debian/scripts/gen-rules.lrg
+++ b/debian/scripts/gen-rules.lrg
@@ -1,4 +1,15 @@ 
 #!/bin/bash
+set -e
+
+validate_unique()
+{
+	[ "$#" = "2" ]
+	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
+	if [ "$duplicates" ]; then
+		echo "EE: duplicate values in $1" 1>&2
+		exit 1
+	fi
+}
 
 # Pick out relevant version and package information including our predecessor
 # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
@@ -58,6 +69,7 @@  do
 	*)		continue ;;
 	esac
 
+	validate_unique "archs" "$archs"
 	for arch in $archs
 	do
 		case " $build_archs " in
@@ -66,8 +78,6 @@  do
 		esac
 	done
 
-	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
-
 	while read package version extra
 	do
 		case "$package" in
@@ -87,14 +97,39 @@  do
 		*\ signonly\ *)		continue ;;
 		esac
 
+		# If package specifies arch= keys, only build it on
+		# the intersection of kernel flavour arches & the
+		# package arches, otherwise build for all kernel
+		# flavour arches.
+		pkg_archs=
+		for cmd in $extra
+		do
+			case "$cmd" in
+			arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
+			esac
+		done
+		# No package arches set, build for everything
+		if [ -z "$pkg_archs" ]; then
+			pkg_archs=$archs
+		else
+			# Package arches set, build for intersection
+			validate_unique "pkg_archs" "$pkg_archs"
+			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
+			# No intersection, skip
+			if [ -z "$pkg_archs" ]; then
+				continue
+			fi
+		fi
+
+		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
 		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
 		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
 		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
 
-		echo "II: build $package for $flavour $archs"
+		echo "II: build $package for $flavour $pkg_archs"
 
 		cat - >>"debian/control.interlock-up" <<EOL
- linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${archs}],
+ linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
 EOL
 
 		# debian/rules.gen
diff --git a/debian/scripts/gen-rules.lrm b/debian/scripts/gen-rules.lrm
index 574a00ec3a..223918f50a 100755
--- a/debian/scripts/gen-rules.lrm
+++ b/debian/scripts/gen-rules.lrm
@@ -1,4 +1,15 @@ 
 #!/bin/bash
+set -e
+
+validate_unique()
+{
+	[ "$#" = "2" ]
+	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
+	if [ "$duplicates" ]; then
+		echo "EE: duplicate values in $1" 1>&2
+		exit 1
+	fi
+}
 
 # Pick out relevant version and package information including our predecessor
 # packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
@@ -70,8 +81,7 @@  do
 	*)		continue ;;
 	esac
 
-	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
-
+	validate_unique "archs" "$archs"
 	cat - >>"debian/control.interlock-up" <<EOL
  linux-headers-${src_abi}-${flavour} (>= @VERSION@) [${archs}],
 EOL
@@ -95,11 +105,36 @@  EOL
 		*\ signonly\ *)		continue ;;
 		esac
 
+		# If package specifies arch= keys, only build it on
+		# the intersection of kernel flavour arches & the
+		# package arches, otherwise build for all kernel
+		# flavour arches.
+		pkg_archs=
+		for cmd in $extra
+		do
+			case "$cmd" in
+			arch=*)		pkg_archs="$pkg_archs ${cmd#arch=}" ;;
+			esac
+		done
+		# No package arches set, build for everything
+		if [ -z "$pkg_archs" ]; then
+			pkg_archs=$archs
+		else
+			# Package arches set, build for intersection
+			validate_unique "pkg_archs" "$pkg_archs"
+			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
+			# No intersection, skip
+			if [ -z "$pkg_archs" ]; then
+				continue
+			fi
+		fi
+
+		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
 		suffix_minus=$(echo "$package" | sed -e 's/nvidia-graphics-drivers-//')
 		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
 		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')
 
-		echo "II: build $package for $flavour $archs"
+		echo "II: build $package for $flavour $pkg_archs"
 
 		# debian/rules.gen
 		cat - >>"debian/rules.gen" <<EOL
@@ -126,7 +161,7 @@  EOL
 
 Package: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
 Build-Profiles: <!stage1>
-Architecture: ${archs}
+Architecture: ${pkg_archs}
 Section: kernel
 Provides: \${dkms:nvidia-${suffix_minus}-modules}, nvidia-prebuilt-kernel
 Depends:
@@ -142,7 +177,7 @@  EOL
 
 Package: linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour}
 Build-Profiles: <!stage1>
-Architecture: ${archs}
+Architecture: ${pkg_archs}
 Section: kernel
 Priority: optional
 Built-Using: \${linux:BuiltUsing}
@@ -160,7 +195,7 @@  Description: Linux kernel nvidia modules for version ${src_abi} (objects)
 
 Package: linux-modules-nvidia-${suffix_minus}-${src_abi}-${flavour}
 Build-Profiles: <!stage1>
-Architecture: ${archs}
+Architecture: ${pkg_archs}
 Section: kernel
 Priority: optional
 Built-Using: \${linux:BuiltUsing}
@@ -187,11 +222,11 @@  EOL
 			transition=*)
 				from="${cmd#transition=}"
 				from_minus=$(echo "$from" | sed -e 's/nvidia-graphics-drivers-//')
-				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus)"
+				echo "II: general transition $from -> $package ($from_minus -> $suffix_minus) $pkg_archs"
 				cat - >>"debian/control.d/migrate-nvidia" <<EOL
 
 Package: linux-modules-nvidia-${from_minus}-${flavour}\${variant:suffix}
-Architecture: ${archs}
+Architecture: ${pkg_archs}
 Section: oldlibs
 Depends: linux-modules-nvidia-${suffix_minus}-${flavour}\${variant:suffix}
 Description: Extra drivers for nvidia-${from_minus} for the ${flavour} flavour (dummy transitional package)
@@ -214,7 +249,7 @@  do
 	esac
 
 	# debian/control.d/transitionals-local
-	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to"
+	echo "II: manual transition linux-modules-nvidia-$from -> linux-modules-nvidia-$to $archs"
 	cat - >>"debian/control.d/transitionals-local" <<EOL
 
 Package: linux-modules-nvidia-${from}
diff --git a/debian/scripts/gen-rules.lrs b/debian/scripts/gen-rules.lrs
index c28fc2f66b..e2ab3a1493 100755
--- a/debian/scripts/gen-rules.lrs
+++ b/debian/scripts/gen-rules.lrs
@@ -1,4 +1,15 @@ 
 #!/bin/bash
+set -e
+
+validate_unique()
+{
+	[ "$#" = "2" ]
+	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
+	if [ "$duplicates" ]; then
+		echo "EE: duplicate values in $1" 1>&2
+		exit 1
+	fi
+}
 
 # Pick out relevant version and package information including our predecessor
 # packages: linux-restricted-generate -> linux-restricted-signatures -> linux-restricted-modules
@@ -57,6 +68,7 @@  do
 	*)		continue ;;
 	esac
 
+	validate_unique "archs" "$archs"
 	targets=$(echo "$archs" | sed -e 's/\</nvidia-/g')
 
 	echo "II: build linux-signatures-nvidia-${src_abi}-${flavour} for ${archs}"