Openembedded Core Discussions
 help / color / mirror / Atom feed
From: "Mathieu Dubois-Briand" <mathieu.dubois-briand@bootlin.com>
To: <JPEWhacker@gmail.com>, <openembedded-core@lists.openembedded.org>
Subject: Re: [OE-core][PATCH 00/22] Rework LICENSE to be SPDX License Expressions
Date: Wed, 15 Jul 2026 15:58:46 +0200	[thread overview]
Message-ID: <DJZ75D2F3LYF.38E5Q51FTY2G3@bootlin.com> (raw)
In-Reply-To: <20260714190405.3328796-1-JPEWhacker@gmail.com>

On Tue Jul 14, 2026 at 8:31 PM CEST, Joshua Watt via lists.openembedded.org wrote:
> Reworks the way that the LICENSE variable is used so that it uses valid
> SPDX License Expressions instead of the custom expressions that were
> used previously (which are based on Python syntax). This includes
> support for the SPDX "WITH" operator which allows a license exception to
> be attached to a license identifier.
>
> The old licenses expressions are still allowed, and will still be
> correctly parsed, however a warning will be issued that indicates the
> new license string that should be used.
>
> Most layers should be able to use the newly-revised
> scripts/contrib/convert-spdx-licenses.py script to do the majority of
> the conversion work, although some manual work may still be required if
> conditional or complex LICENSE expressions are encountered.
>
> SPDX License Expressions require that all licenses listed are either a
> known identifier (e.g. "GPL-2.0-or-later") or start with the prefix
> "LicenseRef-" which indicates a custom license. When converting from old
> expressions to new one this will need to be followed (the suggested new
> license in the warning and the conversion script will automatically add
> this prefix for any unrecognized license identifiers). This will most
> commonly be the case for NO_GENERIC_LICENSE files; for a good example of
> what needs to be done here see the changes to the linux-firmware recipe.
> When adding new LicenseRef- licenses to a recipe, the actual license
> name should be prefixed with the name of the recipe (e.g.
> "LicenseRef-myrecipe-mylicense") to prevent conflicts when merging
> multiple license documents together (e.g. in an image).
>
> SPDX also introduces the "WITH" operator to add an exception to a
> license instead of using a bespoke identifier to combine the two, as was
> done with the legacy license expressions. Because of this, the logic for
> dealing with the INCOMPATIBLE_LICENSE family of variables has changed
> slightly. The main difference is that INCOMPATIBLE_LICENSE will now
> match the LHS of a "WITH" expression (where as previously this was
> "ignored" since it was a bespoke license ID). In order to allow a
> license that would normally be rejected, but can be allowed with an
> exception, specifically allowed exceptions can be added to the
> INCOMPATIBLE_LICENSE_EXCEPTIONS variable (keep in mind, EXCEPTIONS here
> means "exceptions to INCOMPATIBLE_LICENSES", not specifically SPDX
> License Exceptions). If an SPDX exception is present here, any license
> that has that exception will be allowed, even if it would normally match
> INCOMPATIBLE_LICENSE. For example, to disallow all GPLv3 except for
> those with the GCC exception, use:
>
>     INCOMPATIBLE_LICENSE = "GPL-3.0* LGPL-3.0*"
>     INCOMPATIBLE_LICENSE_EXCEPTIONS = "GCC-exception-3.1" # This new line is required
>
>
> Additionally, "PD" ("Public Domain") is not allowed as a generic license
> identifier. Aside from "PD" not being a valid SPDX License Identifier,
> most "Public Domain" licenses do have some sort of text associated with
> them (see the HPND family of SPDX Licenses, or use the [1](SPDX License
> Match Website) ). In addition, the meaning of "Public Domain" can vary
> by jurisdiction, so the actual text with a LicenseRef- or a SPDX License
> Identifier needs to be used instead.
>
> Finally, "CLOSED" is also no longer allowed as a license expression
> (since it is not a valid SPDX License Identifier). Instead use a
> LicenseRef- to point to a file that contains the actual license text
> (usually something like "Copyright <name>, all rights reserved")
>
> [1]: https://tools.spdx.org/app/check_license/
>

Hi Joshua,

So We have some warnings as expected, but we also have two errors:

First, on the bbtests.BitbakeTests.test_non_gplv3 selftest:

2026-07-15 13:29:46,060 - oe-selftest - INFO - FAIL: bbtests.BitbakeTests.test_non_gplv3 (subunit.RemotedTestCase)
...
ERROR: Nothing PROVIDES 'virtual/compilerlibs' (but /srv/pokybuild/yocto-worker/oe-selftest-debian/build/build-st-207485/meta-selftest/recipes-test/selftest-ed/selftest-ed_1.20.2.bb DEPENDS on or otherwise requires it)
gcc-runtime PROVIDES virtual/compilerlibs but was skipped: it has incompatible license(s): GPL-3.0-or-later GPL-3.0-or-later WITH GCC-exception-3.1
ERROR: Required build target 'selftest-ed' has no buildable providers.
Missing or unbuildable dependency chain was: ['selftest-ed', 'virtual/compilerlibs']


But also on layerappend.LayerAppendTests.test_layer_appends:

ERROR: layerappendtest-1.0-r0 do_create_spdx: Error executing a python function in exec_func_python() autogenerated:

The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
     0001:
 *** 0002:do_create_spdx(d)
     0003:
File: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/classes/create-spdx-3.0.bbclass', lineno: 213, function: do_create_spdx
     0209:addtask do_create_recipe_spdx_setscene
     0210:
     0211:python do_create_spdx() {
     0212:    import oe.spdx30_tasks
 *** 0213:    oe.spdx30_tasks.create_spdx(d)
     0214:}
     0215:addtask do_create_spdx after \
     0216:    do_unpack \
     0217:    do_patch \
File: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oe/spdx30_tasks.py', lineno: 825, function: create_spdx
     0821:            oe.spdx30.RelationshipType.hasDeclaredLicense,
     0822:            [oe.sbom30.get_element_link_id(recipe_spdx_license)],
     0823:        )
     0824:    else:
 *** 0825:        build_objset.new_relationship(
     0826:            source_files,
     0827:            oe.spdx30.RelationshipType.hasDeclaredLicense,
     0828:            None,
     0829:        )
File: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oe/sbom30.py', lineno: 560, function: new_relationship
     0556:
     0557:        return ret
     0558:
     0559:    def new_relationship(self, from_, typ, to):
 *** 0560:        return self._new_relationship(oe.spdx30.Relationship, from_, typ, to)
     0561:
     0562:    def new_scoped_relationship(self, from_, typ, scope, to):
     0563:        return self._new_relationship(
     0564:            oe.spdx30.LifecycleScopedRelationship,
File: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oe/sbom30.py', lineno: 529, function: _new_relationship
     0525:        spdxid_name="relationship",
     0526:        **props,
     0527:    ):
     0528:        from_ = to_list(from_)
 *** 0529:        to = to_list(to)
     0530:
     0531:        if not from_:
     0532:            return []
     0533:
File: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oe/sbom30.py', lineno: 187, function: to_list
     0183:    if isinstance(l, set):
     0184:        l = sorted(list(l))
     0185:
     0186:    if not isinstance(l, (list, tuple)):
 *** 0187:        raise TypeError("Must be a list or tuple. Got %s" % type(l))
     0188:
     0189:    return l
     0190:
     0191:
Exception: TypeError: Must be a list or tuple. Got <class 'NoneType'>

https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/4285

Thanks,
Mathieu

-- 
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



  parent reply	other threads:[~2026-07-15 13:58 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 18:31 [OE-core][PATCH 00/22] Rework LICENSE to be SPDX License Expressions Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 01/22] scripts/pull-spdx-licenses.py: Add exceptions Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 02/22] Add SPDX License Exceptions Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 03/22] Add SPDX license library Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 04/22] Parse LICENSE as SPDX Expression Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 05/22] linux-firmware: Convert to SPDX license strings Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 06/22] meta-selftest: Add NO_GENERIC_LICENSE Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 07/22] convert-spdx-licenses: Convert to valid SPDX expressions Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 08/22] gcc-common.inc: Remove LICENSE Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 09/22] gcc: Update license Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 10/22] xz: Replace deprecated SPDX identifier Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 11/22] autoconf-archive: " Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 12/22] gnu-config: " Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 13/22] libglvnd: " Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 14/22] flac: " Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 15/22] libgit2: " Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 16/22] Fix up licenses Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 17/22] lib: oe: license: Rework package licenses matching Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 18/22] classes/go-mod-update-modules: Switch to SPDX license Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 19/22] license: Remove tidy_licenses() Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 20/22] meta-selftest: Change license on test recipes Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 21/22] Convert licenses to SPDX expressions Joshua Watt
2026-07-14 18:31 ` [OE-core][PATCH 22/22] meta-selftest: libxpm: Fix license Joshua Watt
2026-07-15 13:58 ` Mathieu Dubois-Briand [this message]
2026-07-15 16:44 ` [OE-core][PATCH v2 00/25] Rework LICENSE to be SPDX License Expressions Joshua Watt
2026-07-15 16:44   ` [OE-core][PATCH v2 01/25] scripts/pull-spdx-licenses.py: Add exceptions Joshua Watt
2026-07-15 16:44   ` [OE-core][PATCH v2 02/25] Add SPDX License Exceptions Joshua Watt
2026-07-15 16:44   ` [OE-core][PATCH v2 03/25] Add SPDX license library Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 04/25] Parse LICENSE as SPDX Expression Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 05/25] linux-firmware: Convert to SPDX license strings Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 06/25] meta-selftest: Add NO_GENERIC_LICENSE Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 07/25] convert-spdx-licenses: Convert to valid SPDX expressions Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 08/25] gcc-common.inc: Remove LICENSE Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 09/25] gcc: Update license Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 10/25] xz: Replace deprecated SPDX identifier Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 11/25] autoconf-archive: " Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 12/25] gnu-config: " Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 13/25] libglvnd: " Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 14/25] flac: " Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 15/25] libgit2: " Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 16/25] Fix up licenses Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 17/25] lib: oe: license: Rework package licenses matching Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 18/25] classes/go-mod-update-modules: Switch to SPDX license Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 19/25] license: Remove tidy_licenses() Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 20/25] meta-selftest: Change license on test recipes Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 21/25] Convert licenses to SPDX expressions Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 22/25] meta-selftest: libxpm: Fix license Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 23/25] lib: oe: sbom30: Handle None in Relationship Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 24/25] oeqa: selftest: bbtest: Fix license exception Joshua Watt
2026-07-15 16:45   ` [OE-core][PATCH v2 25/25] scripts/contrib: Add reuse-get-license.py Joshua Watt
2026-07-15 17:11   ` [OE-core][PATCH v2 00/25] Rework LICENSE to be SPDX License Expressions Paul Barker
2026-07-15 17:56     ` Joshua Watt
2026-07-15 18:51       ` Joshua Watt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DJZ75D2F3LYF.38E5Q51FTY2G3@bootlin.com \
    --to=mathieu.dubois-briand@bootlin.com \
    --cc=JPEWhacker@gmail.com \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox