diff mbox series

[SRU,linux-meta,JAMMY,v5] UBUNTU: [Packaging] support standalone dkms module builds

Message ID 20220525113219.39928-1-dimitri.ledkov@canonical.com
State New
Headers show
Series [SRU,linux-meta,JAMMY,v5] UBUNTU: [Packaging] support standalone dkms module builds | expand

Commit Message

Dimitri John Ledkov May 25, 2022, 11:32 a.m. UTC
From: "You-Sheng Yang (vicamo)" <vicamo@gmail.com>

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

Signed-off-by: You-Sheng Yang (vicamo) <vicamo.yang@canonical.com>
Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
---

 * Changes since v4:
  - None, just a resend to match the v5 patches for the main package

 debian/control.d/generic |  2 +-
 debian/control.dkms      | 10 ++++++
 debian/rules             | 69 +++++++++++++++++++++++++++++++++++++---
 3 files changed, 75 insertions(+), 6 deletions(-)
 create mode 100644 debian/control.dkms

Comments

Stefan Bader May 25, 2022, 1:01 p.m. UTC | #1
On 25.05.22 13:32, Dimitri John Ledkov wrote:
> From: "You-Sheng Yang (vicamo)" <vicamo@gmail.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1969434
> 
> Signed-off-by: You-Sheng Yang (vicamo) <vicamo.yang@canonical.com>
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
> ---

With similar disclaimer as for the kernel part.

-Stefan

> 
>   * Changes since v4:
>    - None, just a resend to match the v5 patches for the main package
> 
>   debian/control.d/generic |  2 +-
>   debian/control.dkms      | 10 ++++++
>   debian/rules             | 69 +++++++++++++++++++++++++++++++++++++---
>   3 files changed, 75 insertions(+), 6 deletions(-)
>   create mode 100644 debian/control.dkms
> 
> diff --git a/debian/control.d/generic b/debian/control.d/generic
> index 016f763a55..8d6db34def 100644
> --- a/debian/control.d/generic
> +++ b/debian/control.d/generic
> @@ -9,7 +9,7 @@ Description: Generic Linux kernel headers
>   Package: linux-image-generic${variant:suffix}
>   Architecture: amd64 armhf arm64 powerpc ppc64el s390x
>   Section: kernel
> -Provides: ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
> +Provides: ${dkms:v4l2loopback-modules} ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
>   Depends: ${misc:Depends}, linux-image-${kernel-abi-version}-generic, linux-modules-extra-${kernel-abi-version}-generic [amd64 arm64 powerpc ppc64el s390x], linux-firmware [amd64 armhf arm64 ppc64el], intel-microcode [amd64], amd64-microcode [amd64]
>   Recommends: thermald [amd64]
>   Description: Generic Linux kernel image
> diff --git a/debian/control.dkms b/debian/control.dkms
> new file mode 100644
> index 0000000000..304af7b995
> --- /dev/null
> +++ b/debian/control.dkms
> @@ -0,0 +1,10 @@
> +
> +Package: linux-modules-MODULE-FLAVOUR${variant:suffix}
> +Architecture: ARCH
> +Section: kernel
> +Provides: ${dkms:MODULE-modules}
> +Depends:
> + ${misc:Depends},
> + linux-modules-MODULE-${kernel-abi-version}-FLAVOUR,
> +Description: Extra drivers for MODULE for the FLAVOUR flavour
> + Install extra signed MODULE modules compatible with the FLAVOUR flavour.
> diff --git a/debian/rules b/debian/rules
> index 789df4c083..5b1fd42120 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -7,6 +7,11 @@
>   # Copyright (c) 2004 Jens Schmalzing <jensen@debian.org>
>   #
>   
> +include /usr/share/dpkg/architecture.mk
> +
> +# Used when you need to 'escape' a comma.
> +comma = ,
> +
>   SERIES=$(shell dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$$//')
>   SOURCE=$(shell dpkg-parsechangelog -SSource)
>   KERNEL_SOURCE=$(shell echo "$(SOURCE)" | sed -e 's/-meta//')
> @@ -26,10 +31,11 @@ endif
>   control_files := debian/control.common
>   # control files only wanted for the primary variant
>   primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/primary debian/control.d/transitionals-* 2>/dev/null)
> +dkms_control_files :=
>   ifneq ($(filter --,$(variants)),)
>   	control_files += $(primary_control_files)
>   endif
> -control_files += $(filter-out $(primary_control_files),$(shell LC_ALL=C ls -d debian/control.d/*))
> +control_files += $(filter-out $(primary_control_files) $(wildcard debian/control.d/dkms-*),$(shell LC_ALL=C ls -d debian/control.d/*))
>   
>   SHELL := sh -e
>   
> @@ -38,13 +44,57 @@ clean: debian/control
>   	dh_testroot
>   	dh_clean
>   
> -# Versions of dkms packages.
> -dkms_zfs_linux_version=$(shell gawk '/^zfs-linux/ { print $$2; }' debian/dkms-versions)
> +# DKMS
> +all_dkms_modules =
> +$(foreach _line,$(shell gawk '{ OFS = "!"; $$1 = $$1; print }' debian/dkms-versions), \
> +  $(eval _params = $(subst !, ,$(_line))) \
> +  $(eval _deb_pkgname = $(firstword $(_params))) \
> +  $(eval _deb_version = $(word 2,$(_params))) \
> +  $(if $(filter modulename=%,$(_params)), \
> +    $(eval _m = $(word 2,$(subst =, ,$(filter modulename=%,$(_params))))) \
> +    , \
> +    $(info modulename for $(_deb_pkgname) not specified in dkms-versions. Assume $(_deb_pkgname).) \
> +    $(eval _m = $(_deb_pkgname)) \
> +  ) \
> +  $(eval all_dkms_modules += $(_m)) \
> +  $(eval dkms_$(_m)_version = $(_deb_version)) \
> +  $(if $(filter arch=%,$(_params)), \
> +    $(eval dkms_$(_m)_archs = $(patsubst arch=%,%,$(filter arch=%,$(_params)))) \
> +    , \
> +    $(eval dkms_$(_m)_archs = any) \
> +  ) \
> +  $(eval dkms_$(_m)_rprovides = $(patsubst rprovides=%,%,$(filter rprovides=%,$(_params)))) \
> +  $(eval dkms_$(_m)_type = $(word 1,$(patsubst type=%,%,$(filter type=%,$(_params))) built-in)) \
> +  $(eval all_$(dkms_$(_m)_type)_dkms_modules += $(_m)) \
> +  $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +    $(eval dkms_$(_m)_rprovides += $(_m)-prebuilt-kernel) \
> +    $(eval dkms_control_files += debian/control.d/dkms-$(_m)) \
> +  ) \
> +)
>   dkms_virtualbox_version=$(KERNEL_ABI_VERSION)
>   dkms_wireguard_version=$(shell /sbin/modinfo -F version /lib/modules/$(KERNEL_ABI_VERSION)-generic/kernel/drivers/net/wireguard/wireguard.ko)
>   
> +debian/control.d/dkms-%: module = $(patsubst debian/control.d/dkms-%,%,$@)
> +debian/control.d/dkms-%: module_archs = $(dkms_$(patsubst debian/control.d/dkms-%,%,$@)_archs)
> +debian/control.d/dkms-%: debian/control.dkms
> +	for cf in $(filter-out debian/control.common $(primary_control_files),$(control_files)); do \
> +	    flavour=$$(basename $$cf); \
> +	    flavour_archs=$$(gawk "/^Package: linux-image-$${flavour}\\\$$/ { getline; \$$1=\"\"; print; }" $$cf); \
> +	    available_archs=$${flavour_archs}; \
> +	    if ! test "$(module_archs)" = "any"; then \
> +	        available_archs=$$(echo "$${flavour_archs} $(module_archs)" | tr " " "\n" | sort | uniq -d); \
> +	        test -n "$${available_archs}" || continue; \
> +	    fi; \
> +	    cat debian/control.dkms | sed \
> +	            -e "s/MODULE/$(module)/g" \
> +	            -e "s/ARCH/$${available_archs}/g" \
> +	            -e "s/FLAVOUR/$${flavour}/g"; \
> +	done >$@.tmp
> +	rm -f $@
> +	mv $@.tmp $@
> +
>   debian/control: tp_key=test:provides\(-full\|-image\|-headers\|-modules-extra\)
> -debian/control: $(control_files)
> +debian/control: $(control_files) $(dkms_control_files)
>   	for i in $^; do \
>   		if grep -q "{variant:" $$i; then \
>   			variant_first='yes'; \
> @@ -75,7 +125,16 @@ debian/control: $(control_files)
>   
>   gencontrol_flags = -Vkernel-version=$(KERNEL_VERSION)
>   gencontrol_flags += -Vkernel-abi-version=$(KERNEL_ABI_VERSION)
> -gencontrol_flags += -Vdkms:zfs-modules="zfs-modules (= $(dkms_zfs_linux_version)),"
> +gencontrol_flags += \
> +  $(foreach _m,$(all_dkms_modules), \
> +    $(if $(filter $(DEB_HOST_ARCH),$(subst any,$(DEB_HOST_ARCH),$(dkms_$(_m)_archs))), \
> +      $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(dkms_$(_m)_rprovides),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +        , \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(filter %-modules,$(dkms_$(_m)_rprovides)),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +      ) \
> +    ) \
> +  )
>   gencontrol_flags += -Vdkms:virtualbox-guest-modules="virtualbox-guest-modules (= $(dkms_virtualbox_version)),"
>   gencontrol_flags += -Vdkms:wireguard-linux-compat-modules="wireguard-modules (= $(dkms_wireguard_version)),"
>
Kleber Souza May 26, 2022, 3:30 p.m. UTC | #2
On 25.05.22 13:32, Dimitri John Ledkov wrote:
> From: "You-Sheng Yang (vicamo)" <vicamo@gmail.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1969434
> 
> Signed-off-by: You-Sheng Yang (vicamo) <vicamo.yang@canonical.com>
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>

Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>

Thanks

> ---
> 
>   * Changes since v4:
>    - None, just a resend to match the v5 patches for the main package
> 
>   debian/control.d/generic |  2 +-
>   debian/control.dkms      | 10 ++++++
>   debian/rules             | 69 +++++++++++++++++++++++++++++++++++++---
>   3 files changed, 75 insertions(+), 6 deletions(-)
>   create mode 100644 debian/control.dkms
> 
> diff --git a/debian/control.d/generic b/debian/control.d/generic
> index 016f763a55..8d6db34def 100644
> --- a/debian/control.d/generic
> +++ b/debian/control.d/generic
> @@ -9,7 +9,7 @@ Description: Generic Linux kernel headers
>   Package: linux-image-generic${variant:suffix}
>   Architecture: amd64 armhf arm64 powerpc ppc64el s390x
>   Section: kernel
> -Provides: ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
> +Provides: ${dkms:v4l2loopback-modules} ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
>   Depends: ${misc:Depends}, linux-image-${kernel-abi-version}-generic, linux-modules-extra-${kernel-abi-version}-generic [amd64 arm64 powerpc ppc64el s390x], linux-firmware [amd64 armhf arm64 ppc64el], intel-microcode [amd64], amd64-microcode [amd64]
>   Recommends: thermald [amd64]
>   Description: Generic Linux kernel image
> diff --git a/debian/control.dkms b/debian/control.dkms
> new file mode 100644
> index 0000000000..304af7b995
> --- /dev/null
> +++ b/debian/control.dkms
> @@ -0,0 +1,10 @@
> +
> +Package: linux-modules-MODULE-FLAVOUR${variant:suffix}
> +Architecture: ARCH
> +Section: kernel
> +Provides: ${dkms:MODULE-modules}
> +Depends:
> + ${misc:Depends},
> + linux-modules-MODULE-${kernel-abi-version}-FLAVOUR,
> +Description: Extra drivers for MODULE for the FLAVOUR flavour
> + Install extra signed MODULE modules compatible with the FLAVOUR flavour.
> diff --git a/debian/rules b/debian/rules
> index 789df4c083..5b1fd42120 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -7,6 +7,11 @@
>   # Copyright (c) 2004 Jens Schmalzing <jensen@debian.org>
>   #
>   
> +include /usr/share/dpkg/architecture.mk
> +
> +# Used when you need to 'escape' a comma.
> +comma = ,
> +
>   SERIES=$(shell dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$$//')
>   SOURCE=$(shell dpkg-parsechangelog -SSource)
>   KERNEL_SOURCE=$(shell echo "$(SOURCE)" | sed -e 's/-meta//')
> @@ -26,10 +31,11 @@ endif
>   control_files := debian/control.common
>   # control files only wanted for the primary variant
>   primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/primary debian/control.d/transitionals-* 2>/dev/null)
> +dkms_control_files :=
>   ifneq ($(filter --,$(variants)),)
>   	control_files += $(primary_control_files)
>   endif
> -control_files += $(filter-out $(primary_control_files),$(shell LC_ALL=C ls -d debian/control.d/*))
> +control_files += $(filter-out $(primary_control_files) $(wildcard debian/control.d/dkms-*),$(shell LC_ALL=C ls -d debian/control.d/*))
>   
>   SHELL := sh -e
>   
> @@ -38,13 +44,57 @@ clean: debian/control
>   	dh_testroot
>   	dh_clean
>   
> -# Versions of dkms packages.
> -dkms_zfs_linux_version=$(shell gawk '/^zfs-linux/ { print $$2; }' debian/dkms-versions)
> +# DKMS
> +all_dkms_modules =
> +$(foreach _line,$(shell gawk '{ OFS = "!"; $$1 = $$1; print }' debian/dkms-versions), \
> +  $(eval _params = $(subst !, ,$(_line))) \
> +  $(eval _deb_pkgname = $(firstword $(_params))) \
> +  $(eval _deb_version = $(word 2,$(_params))) \
> +  $(if $(filter modulename=%,$(_params)), \
> +    $(eval _m = $(word 2,$(subst =, ,$(filter modulename=%,$(_params))))) \
> +    , \
> +    $(info modulename for $(_deb_pkgname) not specified in dkms-versions. Assume $(_deb_pkgname).) \
> +    $(eval _m = $(_deb_pkgname)) \
> +  ) \
> +  $(eval all_dkms_modules += $(_m)) \
> +  $(eval dkms_$(_m)_version = $(_deb_version)) \
> +  $(if $(filter arch=%,$(_params)), \
> +    $(eval dkms_$(_m)_archs = $(patsubst arch=%,%,$(filter arch=%,$(_params)))) \
> +    , \
> +    $(eval dkms_$(_m)_archs = any) \
> +  ) \
> +  $(eval dkms_$(_m)_rprovides = $(patsubst rprovides=%,%,$(filter rprovides=%,$(_params)))) \
> +  $(eval dkms_$(_m)_type = $(word 1,$(patsubst type=%,%,$(filter type=%,$(_params))) built-in)) \
> +  $(eval all_$(dkms_$(_m)_type)_dkms_modules += $(_m)) \
> +  $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +    $(eval dkms_$(_m)_rprovides += $(_m)-prebuilt-kernel) \
> +    $(eval dkms_control_files += debian/control.d/dkms-$(_m)) \
> +  ) \
> +)
>   dkms_virtualbox_version=$(KERNEL_ABI_VERSION)
>   dkms_wireguard_version=$(shell /sbin/modinfo -F version /lib/modules/$(KERNEL_ABI_VERSION)-generic/kernel/drivers/net/wireguard/wireguard.ko)
>   
> +debian/control.d/dkms-%: module = $(patsubst debian/control.d/dkms-%,%,$@)
> +debian/control.d/dkms-%: module_archs = $(dkms_$(patsubst debian/control.d/dkms-%,%,$@)_archs)
> +debian/control.d/dkms-%: debian/control.dkms
> +	for cf in $(filter-out debian/control.common $(primary_control_files),$(control_files)); do \
> +	    flavour=$$(basename $$cf); \
> +	    flavour_archs=$$(gawk "/^Package: linux-image-$${flavour}\\\$$/ { getline; \$$1=\"\"; print; }" $$cf); \
> +	    available_archs=$${flavour_archs}; \
> +	    if ! test "$(module_archs)" = "any"; then \
> +	        available_archs=$$(echo "$${flavour_archs} $(module_archs)" | tr " " "\n" | sort | uniq -d); \
> +	        test -n "$${available_archs}" || continue; \
> +	    fi; \
> +	    cat debian/control.dkms | sed \
> +	            -e "s/MODULE/$(module)/g" \
> +	            -e "s/ARCH/$${available_archs}/g" \
> +	            -e "s/FLAVOUR/$${flavour}/g"; \
> +	done >$@.tmp
> +	rm -f $@
> +	mv $@.tmp $@
> +
>   debian/control: tp_key=test:provides\(-full\|-image\|-headers\|-modules-extra\)
> -debian/control: $(control_files)
> +debian/control: $(control_files) $(dkms_control_files)
>   	for i in $^; do \
>   		if grep -q "{variant:" $$i; then \
>   			variant_first='yes'; \
> @@ -75,7 +125,16 @@ debian/control: $(control_files)
>   
>   gencontrol_flags = -Vkernel-version=$(KERNEL_VERSION)
>   gencontrol_flags += -Vkernel-abi-version=$(KERNEL_ABI_VERSION)
> -gencontrol_flags += -Vdkms:zfs-modules="zfs-modules (= $(dkms_zfs_linux_version)),"
> +gencontrol_flags += \
> +  $(foreach _m,$(all_dkms_modules), \
> +    $(if $(filter $(DEB_HOST_ARCH),$(subst any,$(DEB_HOST_ARCH),$(dkms_$(_m)_archs))), \
> +      $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(dkms_$(_m)_rprovides),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +        , \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(filter %-modules,$(dkms_$(_m)_rprovides)),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +      ) \
> +    ) \
> +  )
>   gencontrol_flags += -Vdkms:virtualbox-guest-modules="virtualbox-guest-modules (= $(dkms_virtualbox_version)),"
>   gencontrol_flags += -Vdkms:wireguard-linux-compat-modules="wireguard-modules (= $(dkms_wireguard_version)),"
>
Kleber Souza May 26, 2022, 4:23 p.m. UTC | #3
On 25.05.22 13:32, Dimitri John Ledkov wrote:
> From: "You-Sheng Yang (vicamo)" <vicamo@gmail.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1969434
> 
> Signed-off-by: You-Sheng Yang (vicamo) <vicamo.yang@canonical.com>
> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>

Applied to jammy:linux-meta.

Thanks,
Kleber

> ---
> 
>   * Changes since v4:
>    - None, just a resend to match the v5 patches for the main package
> 
>   debian/control.d/generic |  2 +-
>   debian/control.dkms      | 10 ++++++
>   debian/rules             | 69 +++++++++++++++++++++++++++++++++++++---
>   3 files changed, 75 insertions(+), 6 deletions(-)
>   create mode 100644 debian/control.dkms
> 
> diff --git a/debian/control.d/generic b/debian/control.d/generic
> index 016f763a55..8d6db34def 100644
> --- a/debian/control.d/generic
> +++ b/debian/control.d/generic
> @@ -9,7 +9,7 @@ Description: Generic Linux kernel headers
>   Package: linux-image-generic${variant:suffix}
>   Architecture: amd64 armhf arm64 powerpc ppc64el s390x
>   Section: kernel
> -Provides: ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
> +Provides: ${dkms:v4l2loopback-modules} ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
>   Depends: ${misc:Depends}, linux-image-${kernel-abi-version}-generic, linux-modules-extra-${kernel-abi-version}-generic [amd64 arm64 powerpc ppc64el s390x], linux-firmware [amd64 armhf arm64 ppc64el], intel-microcode [amd64], amd64-microcode [amd64]
>   Recommends: thermald [amd64]
>   Description: Generic Linux kernel image
> diff --git a/debian/control.dkms b/debian/control.dkms
> new file mode 100644
> index 0000000000..304af7b995
> --- /dev/null
> +++ b/debian/control.dkms
> @@ -0,0 +1,10 @@
> +
> +Package: linux-modules-MODULE-FLAVOUR${variant:suffix}
> +Architecture: ARCH
> +Section: kernel
> +Provides: ${dkms:MODULE-modules}
> +Depends:
> + ${misc:Depends},
> + linux-modules-MODULE-${kernel-abi-version}-FLAVOUR,
> +Description: Extra drivers for MODULE for the FLAVOUR flavour
> + Install extra signed MODULE modules compatible with the FLAVOUR flavour.
> diff --git a/debian/rules b/debian/rules
> index 789df4c083..5b1fd42120 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -7,6 +7,11 @@
>   # Copyright (c) 2004 Jens Schmalzing <jensen@debian.org>
>   #
>   
> +include /usr/share/dpkg/architecture.mk
> +
> +# Used when you need to 'escape' a comma.
> +comma = ,
> +
>   SERIES=$(shell dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$$//')
>   SOURCE=$(shell dpkg-parsechangelog -SSource)
>   KERNEL_SOURCE=$(shell echo "$(SOURCE)" | sed -e 's/-meta//')
> @@ -26,10 +31,11 @@ endif
>   control_files := debian/control.common
>   # control files only wanted for the primary variant
>   primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/primary debian/control.d/transitionals-* 2>/dev/null)
> +dkms_control_files :=
>   ifneq ($(filter --,$(variants)),)
>   	control_files += $(primary_control_files)
>   endif
> -control_files += $(filter-out $(primary_control_files),$(shell LC_ALL=C ls -d debian/control.d/*))
> +control_files += $(filter-out $(primary_control_files) $(wildcard debian/control.d/dkms-*),$(shell LC_ALL=C ls -d debian/control.d/*))
>   
>   SHELL := sh -e
>   
> @@ -38,13 +44,57 @@ clean: debian/control
>   	dh_testroot
>   	dh_clean
>   
> -# Versions of dkms packages.
> -dkms_zfs_linux_version=$(shell gawk '/^zfs-linux/ { print $$2; }' debian/dkms-versions)
> +# DKMS
> +all_dkms_modules =
> +$(foreach _line,$(shell gawk '{ OFS = "!"; $$1 = $$1; print }' debian/dkms-versions), \
> +  $(eval _params = $(subst !, ,$(_line))) \
> +  $(eval _deb_pkgname = $(firstword $(_params))) \
> +  $(eval _deb_version = $(word 2,$(_params))) \
> +  $(if $(filter modulename=%,$(_params)), \
> +    $(eval _m = $(word 2,$(subst =, ,$(filter modulename=%,$(_params))))) \
> +    , \
> +    $(info modulename for $(_deb_pkgname) not specified in dkms-versions. Assume $(_deb_pkgname).) \
> +    $(eval _m = $(_deb_pkgname)) \
> +  ) \
> +  $(eval all_dkms_modules += $(_m)) \
> +  $(eval dkms_$(_m)_version = $(_deb_version)) \
> +  $(if $(filter arch=%,$(_params)), \
> +    $(eval dkms_$(_m)_archs = $(patsubst arch=%,%,$(filter arch=%,$(_params)))) \
> +    , \
> +    $(eval dkms_$(_m)_archs = any) \
> +  ) \
> +  $(eval dkms_$(_m)_rprovides = $(patsubst rprovides=%,%,$(filter rprovides=%,$(_params)))) \
> +  $(eval dkms_$(_m)_type = $(word 1,$(patsubst type=%,%,$(filter type=%,$(_params))) built-in)) \
> +  $(eval all_$(dkms_$(_m)_type)_dkms_modules += $(_m)) \
> +  $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +    $(eval dkms_$(_m)_rprovides += $(_m)-prebuilt-kernel) \
> +    $(eval dkms_control_files += debian/control.d/dkms-$(_m)) \
> +  ) \
> +)
>   dkms_virtualbox_version=$(KERNEL_ABI_VERSION)
>   dkms_wireguard_version=$(shell /sbin/modinfo -F version /lib/modules/$(KERNEL_ABI_VERSION)-generic/kernel/drivers/net/wireguard/wireguard.ko)
>   
> +debian/control.d/dkms-%: module = $(patsubst debian/control.d/dkms-%,%,$@)
> +debian/control.d/dkms-%: module_archs = $(dkms_$(patsubst debian/control.d/dkms-%,%,$@)_archs)
> +debian/control.d/dkms-%: debian/control.dkms
> +	for cf in $(filter-out debian/control.common $(primary_control_files),$(control_files)); do \
> +	    flavour=$$(basename $$cf); \
> +	    flavour_archs=$$(gawk "/^Package: linux-image-$${flavour}\\\$$/ { getline; \$$1=\"\"; print; }" $$cf); \
> +	    available_archs=$${flavour_archs}; \
> +	    if ! test "$(module_archs)" = "any"; then \
> +	        available_archs=$$(echo "$${flavour_archs} $(module_archs)" | tr " " "\n" | sort | uniq -d); \
> +	        test -n "$${available_archs}" || continue; \
> +	    fi; \
> +	    cat debian/control.dkms | sed \
> +	            -e "s/MODULE/$(module)/g" \
> +	            -e "s/ARCH/$${available_archs}/g" \
> +	            -e "s/FLAVOUR/$${flavour}/g"; \
> +	done >$@.tmp
> +	rm -f $@
> +	mv $@.tmp $@
> +
>   debian/control: tp_key=test:provides\(-full\|-image\|-headers\|-modules-extra\)
> -debian/control: $(control_files)
> +debian/control: $(control_files) $(dkms_control_files)
>   	for i in $^; do \
>   		if grep -q "{variant:" $$i; then \
>   			variant_first='yes'; \
> @@ -75,7 +125,16 @@ debian/control: $(control_files)
>   
>   gencontrol_flags = -Vkernel-version=$(KERNEL_VERSION)
>   gencontrol_flags += -Vkernel-abi-version=$(KERNEL_ABI_VERSION)
> -gencontrol_flags += -Vdkms:zfs-modules="zfs-modules (= $(dkms_zfs_linux_version)),"
> +gencontrol_flags += \
> +  $(foreach _m,$(all_dkms_modules), \
> +    $(if $(filter $(DEB_HOST_ARCH),$(subst any,$(DEB_HOST_ARCH),$(dkms_$(_m)_archs))), \
> +      $(if $(filter standalone,$(dkms_$(_m)_type)), \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(dkms_$(_m)_rprovides),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +        , \
> +        -Vdkms:$(_m)-modules="$(foreach _p,$(filter %-modules,$(dkms_$(_m)_rprovides)),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
> +      ) \
> +    ) \
> +  )
>   gencontrol_flags += -Vdkms:virtualbox-guest-modules="virtualbox-guest-modules (= $(dkms_virtualbox_version)),"
>   gencontrol_flags += -Vdkms:wireguard-linux-compat-modules="wireguard-modules (= $(dkms_wireguard_version)),"
>
diff mbox series

Patch

diff --git a/debian/control.d/generic b/debian/control.d/generic
index 016f763a55..8d6db34def 100644
--- a/debian/control.d/generic
+++ b/debian/control.d/generic
@@ -9,7 +9,7 @@  Description: Generic Linux kernel headers
 Package: linux-image-generic${variant:suffix}
 Architecture: amd64 armhf arm64 powerpc ppc64el s390x
 Section: kernel
-Provides: ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
+Provides: ${dkms:v4l2loopback-modules} ${dkms:zfs-modules} ${dkms:virtualbox-guest-modules} ${dkms:wireguard-linux-compat-modules}
 Depends: ${misc:Depends}, linux-image-${kernel-abi-version}-generic, linux-modules-extra-${kernel-abi-version}-generic [amd64 arm64 powerpc ppc64el s390x], linux-firmware [amd64 armhf arm64 ppc64el], intel-microcode [amd64], amd64-microcode [amd64]
 Recommends: thermald [amd64]
 Description: Generic Linux kernel image
diff --git a/debian/control.dkms b/debian/control.dkms
new file mode 100644
index 0000000000..304af7b995
--- /dev/null
+++ b/debian/control.dkms
@@ -0,0 +1,10 @@ 
+
+Package: linux-modules-MODULE-FLAVOUR${variant:suffix}
+Architecture: ARCH
+Section: kernel
+Provides: ${dkms:MODULE-modules}
+Depends:
+ ${misc:Depends},
+ linux-modules-MODULE-${kernel-abi-version}-FLAVOUR,
+Description: Extra drivers for MODULE for the FLAVOUR flavour
+ Install extra signed MODULE modules compatible with the FLAVOUR flavour.
diff --git a/debian/rules b/debian/rules
index 789df4c083..5b1fd42120 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,6 +7,11 @@ 
 # Copyright (c) 2004 Jens Schmalzing <jensen@debian.org>
 #
 
+include /usr/share/dpkg/architecture.mk
+
+# Used when you need to 'escape' a comma.
+comma = ,
+
 SERIES=$(shell dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$$//')
 SOURCE=$(shell dpkg-parsechangelog -SSource)
 KERNEL_SOURCE=$(shell echo "$(SOURCE)" | sed -e 's/-meta//')
@@ -26,10 +31,11 @@  endif
 control_files := debian/control.common
 # control files only wanted for the primary variant
 primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/primary debian/control.d/transitionals-* 2>/dev/null)
+dkms_control_files :=
 ifneq ($(filter --,$(variants)),)
 	control_files += $(primary_control_files)
 endif
-control_files += $(filter-out $(primary_control_files),$(shell LC_ALL=C ls -d debian/control.d/*))
+control_files += $(filter-out $(primary_control_files) $(wildcard debian/control.d/dkms-*),$(shell LC_ALL=C ls -d debian/control.d/*))
 
 SHELL := sh -e
 
@@ -38,13 +44,57 @@  clean: debian/control
 	dh_testroot
 	dh_clean
 
-# Versions of dkms packages.
-dkms_zfs_linux_version=$(shell gawk '/^zfs-linux/ { print $$2; }' debian/dkms-versions)
+# DKMS
+all_dkms_modules =
+$(foreach _line,$(shell gawk '{ OFS = "!"; $$1 = $$1; print }' debian/dkms-versions), \
+  $(eval _params = $(subst !, ,$(_line))) \
+  $(eval _deb_pkgname = $(firstword $(_params))) \
+  $(eval _deb_version = $(word 2,$(_params))) \
+  $(if $(filter modulename=%,$(_params)), \
+    $(eval _m = $(word 2,$(subst =, ,$(filter modulename=%,$(_params))))) \
+    , \
+    $(info modulename for $(_deb_pkgname) not specified in dkms-versions. Assume $(_deb_pkgname).) \
+    $(eval _m = $(_deb_pkgname)) \
+  ) \
+  $(eval all_dkms_modules += $(_m)) \
+  $(eval dkms_$(_m)_version = $(_deb_version)) \
+  $(if $(filter arch=%,$(_params)), \
+    $(eval dkms_$(_m)_archs = $(patsubst arch=%,%,$(filter arch=%,$(_params)))) \
+    , \
+    $(eval dkms_$(_m)_archs = any) \
+  ) \
+  $(eval dkms_$(_m)_rprovides = $(patsubst rprovides=%,%,$(filter rprovides=%,$(_params)))) \
+  $(eval dkms_$(_m)_type = $(word 1,$(patsubst type=%,%,$(filter type=%,$(_params))) built-in)) \
+  $(eval all_$(dkms_$(_m)_type)_dkms_modules += $(_m)) \
+  $(if $(filter standalone,$(dkms_$(_m)_type)), \
+    $(eval dkms_$(_m)_rprovides += $(_m)-prebuilt-kernel) \
+    $(eval dkms_control_files += debian/control.d/dkms-$(_m)) \
+  ) \
+)
 dkms_virtualbox_version=$(KERNEL_ABI_VERSION)
 dkms_wireguard_version=$(shell /sbin/modinfo -F version /lib/modules/$(KERNEL_ABI_VERSION)-generic/kernel/drivers/net/wireguard/wireguard.ko)
 
+debian/control.d/dkms-%: module = $(patsubst debian/control.d/dkms-%,%,$@)
+debian/control.d/dkms-%: module_archs = $(dkms_$(patsubst debian/control.d/dkms-%,%,$@)_archs)
+debian/control.d/dkms-%: debian/control.dkms
+	for cf in $(filter-out debian/control.common $(primary_control_files),$(control_files)); do \
+	    flavour=$$(basename $$cf); \
+	    flavour_archs=$$(gawk "/^Package: linux-image-$${flavour}\\\$$/ { getline; \$$1=\"\"; print; }" $$cf); \
+	    available_archs=$${flavour_archs}; \
+	    if ! test "$(module_archs)" = "any"; then \
+	        available_archs=$$(echo "$${flavour_archs} $(module_archs)" | tr " " "\n" | sort | uniq -d); \
+	        test -n "$${available_archs}" || continue; \
+	    fi; \
+	    cat debian/control.dkms | sed \
+	            -e "s/MODULE/$(module)/g" \
+	            -e "s/ARCH/$${available_archs}/g" \
+	            -e "s/FLAVOUR/$${flavour}/g"; \
+	done >$@.tmp
+	rm -f $@
+	mv $@.tmp $@
+
 debian/control: tp_key=test:provides\(-full\|-image\|-headers\|-modules-extra\)
-debian/control: $(control_files)
+debian/control: $(control_files) $(dkms_control_files)
 	for i in $^; do \
 		if grep -q "{variant:" $$i; then \
 			variant_first='yes'; \
@@ -75,7 +125,16 @@  debian/control: $(control_files)
 
 gencontrol_flags = -Vkernel-version=$(KERNEL_VERSION)
 gencontrol_flags += -Vkernel-abi-version=$(KERNEL_ABI_VERSION)
-gencontrol_flags += -Vdkms:zfs-modules="zfs-modules (= $(dkms_zfs_linux_version)),"
+gencontrol_flags += \
+  $(foreach _m,$(all_dkms_modules), \
+    $(if $(filter $(DEB_HOST_ARCH),$(subst any,$(DEB_HOST_ARCH),$(dkms_$(_m)_archs))), \
+      $(if $(filter standalone,$(dkms_$(_m)_type)), \
+        -Vdkms:$(_m)-modules="$(foreach _p,$(dkms_$(_m)_rprovides),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
+        , \
+        -Vdkms:$(_m)-modules="$(foreach _p,$(filter %-modules,$(dkms_$(_m)_rprovides)),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
+      ) \
+    ) \
+  )
 gencontrol_flags += -Vdkms:virtualbox-guest-modules="virtualbox-guest-modules (= $(dkms_virtualbox_version)),"
 gencontrol_flags += -Vdkms:wireguard-linux-compat-modules="wireguard-modules (= $(dkms_wireguard_version)),"