We expect all new code to be contributed with the "GPL-2.0-or-later"
license tag. Divergance is permitted if the new file is derived from
pre-existing code under a different license, whether from elsewhere
in QEMU codebase, or outside.
Issue a warning if the declared license is not "GPL-2.0-or-later",
and an error if the license is not one of the handful of the
expected licenses to prevent unintended proliferation.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
scripts/checkpatch.pl | 66 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index cc266abdcd..cd1ed90f4c 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -1353,6 +1353,67 @@ sub checkfilename {
}
}
+sub checkspdx {
+ my ($file, $expr) = @_;
+
+ # Imported Linux headers probably have SPDX tags, but if they
+ # don't we're not requiring contributors to fix this
+ if ($file =~ m,include/standard-headers, ||
+ $file =~ m,linux-headers,) {
+ return;
+ }
+
+ my $origexpr = $expr;
+
+ # Flatten sub-expressions
+ $expr =~ s/\(|\)/ /g;
+ $expr =~ s/OR|AND/ /g;
+
+ # Merge WITH exceptions to the license
+ $expr =~ s/\s+WITH\s+/-WITH-/g;
+
+ # Cull more leading/trailing whitespace
+ $expr =~ s/^\s*//g;
+ $expr =~ s/\s*$//g;
+
+ my @bits = split / +/, $expr;
+
+ my $prefer = "GPL-2.0-or-later";
+ my @valid = qw(
+ LGPL-2.0-or-later
+ LGPL-2.1-or-later
+ GPL-2.0-only
+ LGPL-2.0-only
+ LGPL-2.0-only
+ BSD-2-Clause
+ BSD-3-Clause
+ MIT
+ );
+
+ my $nonpreferred = 0;
+ my @unknown = ();
+ foreach my $bit (@bits) {
+ if ($bit eq $prefer) {
+ next;
+ }
+ if (grep /^$bit$/, @valid) {
+ $nonpreferred = 1;
+ } else {
+ push @unknown, $bit;
+ }
+ }
+ if (@unknown) {
+ ERROR("Saw unacceptable licenses '" . join(',', @unknown) .
+ "', valid choices for QEMU are:\n" . join("\n", $prefer, @valid));
+ }
+
+ if ($nonpreferred) {
+ WARN("Saw acceptable license '$origexpr' but note '$prefer' is preferred " .
+ "for new files unless the code is derived from a source with an" .
+ "existed declared license that must be followed.");
+ }
+}
+
sub process {
my $filename = shift;
@@ -1641,6 +1702,11 @@ sub process {
}
}
+# Check SPDX-License-Identifier references a permitted license
+ if ($rawline =~ m,SPDX-License-Identifier: (.*?)(\*/)?\s*$,) {
+ &checkspdx($realfile, $1);
+ }
+
# Check for wrappage within a valid hunk of the file
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
ERROR("patch seems to be corrupt (line wrapped?)\n" .
--
2.46.0
On 10/7/2024 10:45 AM, Daniel P. Berrangé wrote:
> We expect all new code to be contributed with the "GPL-2.0-or-later"
> license tag. Divergance is permitted if the new file is derived from
> pre-existing code under a different license, whether from elsewhere
> in QEMU codebase, or outside.
>
> Issue a warning if the declared license is not "GPL-2.0-or-later",
> and an error if the license is not one of the handful of the
> expected licenses to prevent unintended proliferation.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> scripts/checkpatch.pl | 66 +++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index cc266abdcd..cd1ed90f4c 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -1353,6 +1353,67 @@ sub checkfilename {
> }
> }
>
> +sub checkspdx {
> + my ($file, $expr) = @_;
> +
> + # Imported Linux headers probably have SPDX tags, but if they
> + # don't we're not requiring contributors to fix this
> + if ($file =~ m,include/standard-headers, ||
> + $file =~ m,linux-headers,) {
> + return;
> + }
> +
> + my $origexpr = $expr;
> +
> + # Flatten sub-expressions
> + $expr =~ s/\(|\)/ /g;
> + $expr =~ s/OR|AND/ /g;
> +
> + # Merge WITH exceptions to the license
> + $expr =~ s/\s+WITH\s+/-WITH-/g;
> +
> + # Cull more leading/trailing whitespace
> + $expr =~ s/^\s*//g;
> + $expr =~ s/\s*$//g;
> +
> + my @bits = split / +/, $expr;
> +
> + my $prefer = "GPL-2.0-or-later";
> + my @valid = qw(
> + LGPL-2.0-or-later
> + LGPL-2.1-or-later
> + GPL-2.0-only
> + LGPL-2.0-only
> + LGPL-2.0-only
> + BSD-2-Clause
> + BSD-3-Clause
> + MIT
> + );
> +
> + my $nonpreferred = 0;
> + my @unknown = ();
> + foreach my $bit (@bits) {
> + if ($bit eq $prefer) {
> + next;
> + }
> + if (grep /^$bit$/, @valid) {
> + $nonpreferred = 1;
> + } else {
> + push @unknown, $bit;
> + }
> + }
> + if (@unknown) {
> + ERROR("Saw unacceptable licenses '" . join(',', @unknown) .
> + "', valid choices for QEMU are:\n" . join("\n", $prefer, @valid));
> + }
> +
> + if ($nonpreferred) {
> + WARN("Saw acceptable license '$origexpr' but note '$prefer' is preferred " .
> + "for new files unless the code is derived from a source with an" .
> + "existed declared license that must be followed.");
Is it not preferred to contribute code under the BSD-3-clause? Based on
other items in the project, I was expecting we could make contributions
for hexagon w/BSD. But those are exceptional cases and not to be
followed in the general case?
> + }
> +}
> +
> sub process {
> my $filename = shift;
>
> @@ -1641,6 +1702,11 @@ sub process {
> }
> }
>
> +# Check SPDX-License-Identifier references a permitted license
> + if ($rawline =~ m,SPDX-License-Identifier: (.*?)(\*/)?\s*$,) {
> + &checkspdx($realfile, $1);
> + }
> +
> # Check for wrappage within a valid hunk of the file
> if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
> ERROR("patch seems to be corrupt (line wrapped?)\n" .
On Mon, Oct 07, 2024 at 11:19:15AM -0500, Brian Cain wrote:
>
> On 10/7/2024 10:45 AM, Daniel P. Berrangé wrote:
> > We expect all new code to be contributed with the "GPL-2.0-or-later"
> > license tag. Divergance is permitted if the new file is derived from
> > pre-existing code under a different license, whether from elsewhere
> > in QEMU codebase, or outside.
> >
> > Issue a warning if the declared license is not "GPL-2.0-or-later",
> > and an error if the license is not one of the handful of the
> > expected licenses to prevent unintended proliferation.
> >
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> > scripts/checkpatch.pl | 66 +++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 66 insertions(+)
> >
> > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> > index cc266abdcd..cd1ed90f4c 100755
> > --- a/scripts/checkpatch.pl
> > +++ b/scripts/checkpatch.pl
> > @@ -1353,6 +1353,67 @@ sub checkfilename {
> > }
> > }
> > +sub checkspdx {
> > + my ($file, $expr) = @_;
> > +
> > + # Imported Linux headers probably have SPDX tags, but if they
> > + # don't we're not requiring contributors to fix this
> > + if ($file =~ m,include/standard-headers, ||
> > + $file =~ m,linux-headers,) {
> > + return;
> > + }
> > +
> > + my $origexpr = $expr;
> > +
> > + # Flatten sub-expressions
> > + $expr =~ s/\(|\)/ /g;
> > + $expr =~ s/OR|AND/ /g;
> > +
> > + # Merge WITH exceptions to the license
> > + $expr =~ s/\s+WITH\s+/-WITH-/g;
> > +
> > + # Cull more leading/trailing whitespace
> > + $expr =~ s/^\s*//g;
> > + $expr =~ s/\s*$//g;
> > +
> > + my @bits = split / +/, $expr;
> > +
> > + my $prefer = "GPL-2.0-or-later";
> > + my @valid = qw(
> > + LGPL-2.0-or-later
> > + LGPL-2.1-or-later
> > + GPL-2.0-only
> > + LGPL-2.0-only
> > + LGPL-2.0-only
> > + BSD-2-Clause
> > + BSD-3-Clause
> > + MIT
> > + );
> > +
> > + my $nonpreferred = 0;
> > + my @unknown = ();
> > + foreach my $bit (@bits) {
> > + if ($bit eq $prefer) {
> > + next;
> > + }
> > + if (grep /^$bit$/, @valid) {
> > + $nonpreferred = 1;
> > + } else {
> > + push @unknown, $bit;
> > + }
> > + }
> > + if (@unknown) {
> > + ERROR("Saw unacceptable licenses '" . join(',', @unknown) .
> > + "', valid choices for QEMU are:\n" . join("\n", $prefer, @valid));
> > + }
> > +
> > + if ($nonpreferred) {
> > + WARN("Saw acceptable license '$origexpr' but note '$prefer' is preferred " .
> > + "for new files unless the code is derived from a source with an" .
> > + "existed declared license that must be followed.");
>
> Is it not preferred to contribute code under the BSD-3-clause? Based on
> other items in the project, I was expecting we could make contributions for
> hexagon w/BSD. But those are exceptional cases and not to be followed in
> the general case?
I'm not saying people can't contribute under BSD, but if that is required,
a explanation of why is desired.
IMHO we don't want contributors choosing an non-GPL-2.0-or-later license
merely out of personal (or corporate) preferences.
We want GPL-2.0-or-later to be used for everything, unless there is a
compelling reason to diverge. The need to remain compliant with existing
code that has been incorporated is the most common & obvious reason for
this.
Other reasons likely exist - which could be explained in the commit
message, to aid reviewers who are likely to see the checkpatch warnings
about the unusal license choices.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
© 2016 - 2026 Red Hat, Inc.