Linux カーネルライセンス規則

Linux カーネルは GNU General Public License version 2 のみ (GPL-2.0) で配布されています。ライセンスの文言は LICENSES/preferred/GPL-2.0 にあります。ただし COPYING で説明されているように LICENSES/exceptions/Linux-syscall-note の記載があるシステムコールは例外です。

このドキュメントファイルではライセンスを明確にするために各ソースファイルに注釈を付ける方法を説明しています。カーネルのライセンスは置き換わりません。

COPYING ファイルで説明しているライセンスはカーネルソース全体に適用されますが、個別のソースコードでは GPL-2.0 と互換性のある他のライセンスが使われている場合があります:

GPL-1.0+  :  GNU General Public License v1.0 以上
GPL-2.0+  :  GNU General Public License v2.0 以上
LGPL-2.0  :  GNU Library General Public License v2 のみ
LGPL-2.0+ :  GNU Library General Public License v2 以上
LGPL-2.1  :  GNU Lesser General Public License v2.1 のみ
LGPL-2.1+ :  GNU Lesser General Public License v2.1 以上

さらに、個々のファイルはデュアルライセンスで配布することができます。例えば、GPL と互換性のあるライセンスと BSD や MIT などの許容的ライセンスのデュアルライセンスなど。

ユーザースペースプログラムのカーネルインターフェイスを記述する User-space API (UAPI) ヘッダーファイルは特殊です。カーネルの COPYING ファイルにあるように、システムコールインターフェイスには明確な境界があり、システムコールを使用してカーネルと対話するソフトウェアまで GPL の要件が拡大されることはありません。UAPI ヘッダーは Linux カーネルで動作する実行ファイルを作成する全てのソースファイルに含める必要があるため、特別なライセンス表記で例外が設けられています。

ソースファイルのライセンスを宣言するときはファイルの一番上に適当な定型文のコメントを挿入するのが一般的です。書式や typo などのため、こういった「定型文」をライセンス管理のために使用するツールで確認することは容易ではありません。

定型文の代わりになるものとして各ソースファイルで Software Package Data Exchange (SPDX) ライセンス識別子を使用するという方法があります。SPDX ライセンス識別子はプログラムで簡単にパースすることができ、ファイルがどのライセンスで配布されているのか正確・簡潔に記述できます。SPDX ライセンス識別子は Linux Foundation の SPDX Workgroup で管理されており業界・ツールベンダー・法務チームなどパートナーの承認を得ています。詳しい情報は https://spdx.org/ を見てください。

Linux カーネルは全てのソースファイルに対して正確な SPDX 識別子を必要とします。カーネル内で使われている有効な識別子については ライセンス識別子 セクションで説明しています。また、公式 SPDX ライセンスリスト https://spdx.org/licenses/ とライセンス文章を載せています。

ライセンス識別子の書式

  1. 配置:

    SPDX ライセンス識別子はカーネルファイルのできるかぎり上部に追加します。大部分のファイルでは1行目が使われますが、最初の行に '#!PATH_TO_INTERPRETER' と記述する必要があるスクリプトでは SPDX 識別子は2行目に配置します。


  1. 形式:

    SPDX ライセンス識別子はコメントの形で追加します。コメントの形式はファイルのタイプによって変わります:

    C ソース:    // SPDX-License-Identifier: <SPDX License Expression>
    C ヘッダー:   /* SPDX-License-Identifier: <SPDX License Expression> */
    ASM:      /* SPDX-License-Identifier: <SPDX License Expression> */
    スクリプト:    # SPDX-License-Identifier: <SPDX License Expression>
    .rst:     .. SPDX-License-Identifier: <SPDX License Expression>
    .dts{i}:  // SPDX-License-Identifier: <SPDX License Expression>
    

    標準のコメントスタイルを特定のツールが処理できないときは、ツールが認識できる適切なコメント方式を使用します。C ヘッダーファイルで "/* */" 形式のコメントが使われているのはそのためです。.lds ファイルが生成されるときに 'ld' が C++ コメントをパースできずにビルドが失敗するという現象が以前は存在していました。今ではもう解決されている問題ですが、いまでも古いアセンブラツールでは C++ スタイルコメントを扱えない場合があります。


  1. 構文:

    <SPDX License Expression> は SPDX License List にあるライセンス識別子の SPDX 省略形、あるいは複数のライセンス識別子の SPDX 省略形の組み合わせで、組み合わせるときはライセンスの例外が適用される場合を "WITH" で区切ります。複数のライセンスが適用されるときは、副表現を "AND" と "OR" キーワードで分割したり "(" と ")" で囲ったりします。

    [L]GPL のような 'or later' オプションが存在するライセンスでは "+" を使って 'or later' オプションを示します:

    // SPDX-License-Identifier: GPL-2.0+
    // SPDX-License-Identifier: LGPL-2.1+
    

    ライセンスに修正が必要なときは WITH を使います。例えば、Linux カーネルの UAPI ファイルは以下のように例外を使っています:

    // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
    // SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note
    

    カーネルには他にも以下のように WITH 例外を使っている箇所があります:

    // SPDX-License-Identifier: GPL-2.0 WITH mif-exception
    // SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
    

    例外は特定のライセンス識別子と組み合わせて使う必要があります。有効なライセンス識別子は exception テキストファイルのタグに記載されています。詳しくは ライセンス識別子 チャプターの 例外 セクションを見てください。

    OR はファイルがデュアルライセンスでどちらか片方のライセンスが選択される場合に使用します。例えば、一部の dtsi ファイルはデュアルライセンスで配布されています:

    // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
    

    デュアルライセンスのファイルのライセンス表現の例:

    // SPDX-License-Identifier: GPL-2.0 OR MIT
    // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
    // SPDX-License-Identifier: GPL-2.0 OR Apache-2.0
    // SPDX-License-Identifier: GPL-2.0 OR MPL-1.1
    // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT
    // SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause OR OpenSSL
    

    AND はファイルに複数のライセンスが存在し、ファイルを使うときは全てのライセンスが適用されるときに使用します。例えば、他のプロジェクトから継承されたコードでカーネルに含める許可が得られているが、元々のライセンスの効果は失われていない場合:

    // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT
    

    複数のライセンスが適用される他の例:

    // SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+
    

ライセンス識別子

現在使用しているライセンスと、カーネルに追加するコードのライセンスについては以下の通りです:

  1. 推奨ライセンス:

    可能な限り完全な互換性があり広く使われている推奨ライセンスを使うようにしてください。推奨ライセンスはカーネルソースツリーの以下のディレクトリから確認できます:

    LICENSES/preferred/
    

    上記のディレクトリのファイルには完全なライセンス文章と メタタグ が記述されています。ファイル名は SPDX ライセンス識別子と同じになっており、ソースファイルでライセンスを提示するときに使用します。

    例:

    LICENSES/preferred/GPL-2.0
    

    上記のファイルには GPL バージョン 2 のライセンス文章と必要なメタタグが含まれています。

    LICENSES/preferred/MIT

    上記のファイルには MIT ライセンス文章と必要なメタタグが含まれています。

    メタタグ:

    ライセンスファイルでは以下のメタタグが利用できます:

    • Valid-License-Identifier:

      プロジェクト内で有効なライセンス識別子を宣言するひとつまたは複数の行。通常は識別子はひとつだけですが、'or later' オプションが存在するライセンスの場合は有効な識別子が2つになります。

    • SPDX-URL:

      ライセンスに関する情報が書かれている SPDX ページの URL。

    • Usage-Guidance:

      使用アドバイスを表す自由なテキスト。テキストには ライセンス識別子の書式 ガイドラインにあわせてソースファイルにライセンスを記述する SPDX ライセンス識別子の例を含める必要があります。

    • License-Text:

      このタグ以降のテキストは全てオリジナルのライセンス文章として扱われます。

    ファイルフォーマットの例:

    Valid-License-Identifier: GPL-2.0
    Valid-License-Identifier: GPL-2.0+
    SPDX-URL: https://spdx.org/licenses/GPL-2.0.html
    Usage-Guide:
      To use this license in source code, put one of the following SPDX
      tag/value pairs into a comment according to the placement
      guidelines in the licensing rules documentation.
      For 'GNU General Public License (GPL) version 2 only' use:
        SPDX-License-Identifier: GPL-2.0
      For 'GNU General Public License (GPL) version 2 or any later version' use:
        SPDX-License-Identifier: GPL-2.0+
    License-Text:
      Full license text
    
    SPDX-License-Identifier: MIT
    SPDX-URL: https://spdx.org/licenses/MIT.html
    Usage-Guide:
      To use this license in source code, put the following SPDX
      tag/value pair into a comment according to the placement
      guidelines in the licensing rules documentation.
        SPDX-License-Identifier: MIT
    License-Text:
      Full license text
    

  1. Not recommended licenses:

    These licenses should only be used for existing code or for importing code from a different project. These licenses are available from the directory:

    LICENSES/other/
    

    上記のディレクトリのファイルには完全なライセンス文章と メタタグ が記述されています。ファイル名は SPDX ライセンス識別子と同じになっており、ソースファイルでライセンスを提示するときに使用します。

    例:

    LICENSES/other/ISC
    

    上記のファイルには Internet Systems Consortium ライセンスのテキストと必要なメタタグが含まれています。

    LICENSES/other/ZLib

    上記のファイルには ZLIB ライセンスの文章と必要なメタタグが含まれています。

    メタタグ:

    'other' ライセンスのメタタグは 推奨ライセンス のメタタグと同じです。

    ファイルフォーマットの例:

    Valid-License-Identifier: ISC
    SPDX-URL: https://spdx.org/licenses/ISC.html
    Usage-Guide:
      Usage of this license in the kernel for new code is discouraged
      and it should solely be used for importing code from an already
      existing project.
      To use this license in source code, put the following SPDX
      tag/value pair into a comment according to the placement
      guidelines in the licensing rules documentation.
        SPDX-License-Identifier: ISC
    License-Text:
      Full license text
    

  1. 例外:

    一部のライセンスではオリジナルのライセンスには存在しない権限を与える例外が追加されている場合があります。例外はカーネルソースツリーの以下のディレクトリに存在します:

    LICENSES/exceptions/
    

    上記のディレクトリのファイルには完全な例外文章と 例外メタタグ が記述されています。

    例:

    LICENSES/exceptions/Linux-syscall-note
    

    上記のファイルには Linux カーネルの COPYING ファイルに書かれている UAPI ヘッダーファイルで使用される Linux のシステムコールの例外について記載されています。例: /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */。

    LICENSES/exceptions/GCC-exception-2.0

    上記のファイルにはコンパイルされたファイルのライセンスとは無関係にあらゆるバイナリへのリンクを許可する GCC の 'linking exception' が含まれています。GPL と互換性のないソースコードから実行ファイルを作成するために必要な例外です。

    例外メタタグ:

    例外ファイルには以下のメタタグが必要です:

    • SPDX-Exception-Identifier:

      SPDX ライセンス識別子と一緒に使うことができる例外識別子。

    • SPDX-URL:

      例外に関する情報が書かれている SPDX ページの URL。

    • SPDX-Licenses:

      例外を使用できる SPDX ライセンス識別子のリスト (カンマ区切り)。

    • Usage-Guidance:

      使用アドバイスを表す自由なテキスト。テキストには ライセンス識別子の書式 ガイドラインにあわせてソースファイルにライセンスを記述する SPDX ライセンス識別子の例を含める必要があります。

    • Exception-Text:

      このタグ以降のテキストは全てオリジナルの例外テキストとして扱われます。

    ファイルフォーマットの例:

    SPDX-Exception-Identifier: Linux-syscall-note
    SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html
    SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+
    Usage-Guidance:
      This exception is used together with one of the above SPDX-Licenses
      to mark user-space API (uapi) header files so they can be included
      into non GPL compliant user-space application code.
      To use this exception add it with the keyword WITH to one of the
      identifiers in the SPDX-Licenses tag:
        SPDX-License-Identifier: <SPDX-License> WITH Linux-syscall-note
    Exception-Text:
      Full exception text
    
    SPDX-Exception-Identifier: GCC-exception-2.0
    SPDX-URL: https://spdx.org/licenses/GCC-exception-2.0.html
    SPDX-Licenses: GPL-2.0, GPL-2.0+
    Usage-Guidance:
      The "GCC Runtime Library exception 2.0" is used together with one
      of the above SPDX-Licenses for code imported from the GCC runtime
      library.
      To use this exception add it with the keyword WITH to one of the
      identifiers in the SPDX-Licenses tag:
        SPDX-License-Identifier: <SPDX-License> WITH GCC-exception-2.0
    Exception-Text:
      Full exception text
    

SPDX ライセンス識別子と例外は全て LICENSE サブディレクトリに対応するファイルが存在します。検証ツール (例: checkpatch.pl) でソースからライセンスを読み込んで展開できるようにするためです。これは様々な FOSS 組織で推奨されています。例: FSFE REUSE initiative