firmware-nonfree
================

Upstream
--------

firmware-nonfree is based on the linux-firmware.git repository, which
now does make tarball (or tagged) releases in the form 'CCYYMMDD'.
Also, some of its contents are not clearly redistributable, and some are
obsolete for Debian's purposes.
https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

We set the upstream version to the last tag and use uscan to generate
a tarball from upstream git.  The Files-Excluded field in 'debian/copyright'
lists file patterns that should be excluded from the tarball.

We also pull module information from Linux binary packages.  To update
this information, run:

    debian/bin/update-modinfo

You can optionally pass a specific kernel release string or directory
in which to look for modules.

We copy the debian_linux Python package from src:linux.  To update it,
run:

    debian/bin/update-python-lib <linux-package-dir>

Licences
--------

The upstream source includes the file 'WHENCE' which lists the licence
and any source code for each file.  The script
'debian/bin/check_upstream.py' will warn about any files that aren't
recognised to be distributable based on the information in 'WHENCE'
and that haven't been excluded.

Each binary package is assumed to have a different licence(s).  The
installed 'copyright' file is taken from the 'LICENSE' file in its
subdirectory.

Some firmware redistribution licences require us to prompt the user to
accept an EULA.  In this case, put the EULA text in 'LICENSE.install'
and set the [base] license_accept field to 'required'.  There is no
upstream provision for EULAs.

Binary package definition
-------------------------

The binary package definitions are placed under 'debian/config' and
written in a format similar to INI files, parsed using the Python
ConfigParser module
<https://docs.python.org/3/library/configparser.html>,

The [base] packages field in the top-level 'defines' file lists all
the binary package names, without the fixed prefix 'firmware-'.

For each binary package, there is a subdirectory with matching name
(again without the prefix) containing another 'defines' file with
metadata.  Any non-upstream firmware files are also included in
these subdirectories.

The script 'debian/bin/check_upstream.py' will list the upstream
firmware files that are non-free but not assigned to any binary
package.

Required metadata:

[base] desc: Short description of related hardware, used in Description
[base] files: List of files to be included, one per line
[base] longdesc: Longer description of related hardware and drivers, used in
                 Description.

Optional metadata:

[base] uri: Upstream URL, used as Homepage and in copyright file.  Not
            needed if the contents come from linux-firmware.git.
[base] license_accept: Set to 'required' if we must prompt the user to
                       accept a EULA on installation
[base] license_title: Title of the EULA
[base] support: Set to 'initramfs-tools' if update-initramfs should be
                invoked after installation
[base] replaces: Used as Replaces field
[base] conflicts: Used as Conflicts field
[base] provides: Used as Provides field
[base] usrmergemitigation: List of firmware files that require protective
                           diversions

Optional per-file metadata:

[<filename>_base] desc: One-line description for this file, used in
                        package description
[<filename>_base] version: Verson number for this file, used in package
                           description

To re-generate debian/control (and other files) based on these
definitions:

1. If the 'orig.tar' archive is not yet available, retrieve it as follows:

   uscan --download-version <upstream-version>

   Where '<upstream-version>' is f.e. '20230210'.
   To retrieve <upstream-version> programmatically, use f.e. this:

   $(head -n1 debian/changelog | sed 's/.*\([[:digit:]]\{8\}\).*/\1/')

   Combined that results in:

   uscan --download-version $(head -n1 debian/changelog | sed 's/.*\([[:digit:]]\{8\}\).*/\1/')

2. Run: debian/rules orig
3. Run: debian/rules debian/control

To update the current package's changelog with the new upstream version:

1. Run: debian/bin/release-update /path/to/linux-firmware-repository

   This will update debian/changelog with the changes added between
   the commit of the current package version and the HEAD commit found in the
   linux firmware repository, passed as argument.

2. Remove entries regarding firmwares files not packaged

 -- Ben Hutchings <benh@debian.org>, Mon, 24 Mar 2025 17:52:46 +0100
