[PATCH 0/9] LP: #1912803 -- autogenerate Nvidia rules/control
Andy Whitcroft
apw at canonical.com
Fri Jan 22 16:23:01 UTC 2021
Changing the version of an Nvidia package is pretty straight forward. We
change the version in debian/dkms-versions in the *:linux (main) packages and
this propogates to each derivative main kernel and from there into the
dependant linux-restricted-modules* (lrm) package. However, when we wish to
add a new 'series' such as 460 or 460-server things are much more complex.
Firstly, we add a new dkms-versions entry for the series. We then add a pair
of new stanzas to to the kernel packaging in the *:linux main packages (not
overly onerous). Finally we must add new stanzas and package definitions to
every single linux-restricted-modules* package individually (very very
onerous). This email details some packaging improvements I am proposing for
the main and lrm packages.
For the main package we want to build signatures for all nvidia versions
specified. Here I am removing the per-series rules and version lookup and
replacing it with iterative make rules.
For the lrm packages the intent is that the entire contents of lrm package is
specified by the contents of two configurations; debian/dkms-versions which
comes to lrm via its main package from the appropriate *:linux main package,
and from debian/package.config which carries any per lrm configuration (mostly
the architectures and flavours supported by that lrm package). The lrm rules
and control are generated en-toto from these two configuration files at package
clean time.
With these in place we are able to add or remove (and transition) a version
via modifications to the dkms-versions file in the *:linux main package.
All other change propogates automatically into the generated rules.
In order to handle sign-only[1] nvidia builds and to allow control over
creation of appropriate transitional packags when deprecating series the
dkms-versions format is extended for nvidia entries. Taking the current
groovy:linux dkms-versions file as an example:
zfs-linux 0.8.4-1ubuntu11.1
nvidia-graphics-drivers-390 390.141-0ubuntu0.20.10.1
nvidia-graphics-drivers-435 435.21-0ubuntu8 signonly
nvidia-graphics-drivers-450 450.102.04-0ubuntu0.20.10.1 transition=nvidia-graphics-drivers-440
nvidia-graphics-drivers-455 455.45.01-0ubuntu0.20.10.1 signonly
nvidia-graphics-drivers-460 460.32.03-0ubuntu0.20.10.1 transition=nvidia-graphics-drivers-455 transition=nvidia-graphics-drivers-435
nvidia-graphics-drivers-418-server 418.181.07-0ubuntu0.20.10.1
nvidia-graphics-drivers-440-server 440.95.01-0ubuntu2 signonly
nvidia-graphics-drivers-450-server 450.102.04-0ubuntu0.20.10.1 transition=nvidia-graphics-drivers-440-server
The new directives are added in fields three onwards. Currently two
directives are supported:
- signonly -- which indicates that the main package should build and extract
a signature from that nvidia series, but that lrm should not build the
package, and
- transition=<series package> -- which indicates that the older series should
generate transitional packages pointing to this nvidia series.
Additionally each lrm package will be configured via debian/package.config
which contains (generally static) information such as the architectures and
flavours for which we wish to generate packages. For example for
focal:linux-hwe-5.8 we have:
build generic amd64
build lowlatency amd64
option desktop
option server
transitional 440-oem-20.04 450-generic amd64
transitional 450-oem-20.04 450-generic amd64
This indicates we build on amd64 for generic and lowlatency flavours, we build
both desktop (440, 450 etc) and server (450-server etc) series, and finally
indicates that there are some addhoc transitionals needed to handle upgrades
from the oem package.
Currently three directives are supported:
- build <flavour> <arch list> -- defines the architectures on which we should
generate packages for this flavour.
- option desktop|server -- defines whether this package generates desktop and
server series respectivly.
- transitional <from> <to> <arch list> -- defines the architectures on which
transitional packages are needed for an adhoc transition.
The changes for the main packages consist of two patches for each
series; a change to debian/rules* to implement the dynamic rules, and a
patch for debian/dkms-versions which adds the additional annotations. I
include the rules change for the groovy main package as an example, the
dkms-versions is as above (and will have to be regenerated at
application time).
The changes for the lrm packages are more complex as each lrm package must be
configured indicating the flavours and architecures, and pulling out any local
transitionals. I am including the patch kit[2] as applied to
grooy:linux-restricted-modules package. This conversion has been scripted to
simplify application. I am therefore including this as a sampler for review
and and, but proposed to apply the lrm changes programatically.
It should be noted that a pleasant outcome from this conversion is that once
converted to this form all of the core LRM content is generated by a single
common rules.gen script which can augmented and be updated via a cranky fix.
-apw
[1] signonly nvidia builds are used when transitioning from one series to
another, but we might wish to drop back if testing fails. There we can build a
signature in the old nvidia series, but not package or ship those in lrm.
[2]
Andy Whitcroft (9):
UBUNTU: [Packaging] generate nvidia version mappings at clean time
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- add transitionals
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- handle Build-Depends
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- use Build-Depends-Arch
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- add signonly
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- handle +21.04.1
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- add options
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- handle old dkms-build API
UBUNTU: [Packaging] generate nvidia version mappings at clean time -- add suppress support
debian/control.common | 6 +-
debian/control.d/meta-nvidia | 148 ---------------
debian/control.d/migrate-nvidia-435 | 13 --
debian/control.d/migrate-nvidia-440 | 13 --
debian/control.d/nvidia | 227 -----------------------
debian/control.d/transitionals-oem-20.04 | 13 --
debian/dkms-versions | 5 +-
debian/package.config | 4 +
debian/rules | 194 +------------------
debian/rules.in | 139 ++++++++++++++
debian/scripts/gen-rules | 173 +++++++++++++++++
debian/source/options | 3 +
12 files changed, 327 insertions(+), 611 deletions(-)
delete mode 100644 debian/control.d/meta-nvidia
delete mode 100644 debian/control.d/migrate-nvidia-435
delete mode 100644 debian/control.d/migrate-nvidia-440
delete mode 100644 debian/control.d/nvidia
delete mode 100644 debian/control.d/transitionals-oem-20.04
create mode 100644 debian/package.config
create mode 100755 debian/rules.in
create mode 100755 debian/scripts/gen-rules
More information about the kernel-team
mailing list