qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/3] scripts: validate SPDX license choices


From: Daniel P . Berrangé
Subject: [PATCH 2/3] scripts: validate SPDX license choices
Date: Mon, 7 Oct 2024 16:45:47 +0100

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]