| .. SPDX-License-Identifier: GPL-2.0 | |
| .. _kernel_licensing: | |
| Linux kernel licensing rules | |
| ============================ | |
| The Linux Kernel is provided under the terms of the GNU General Public | |
| License version 2 only (GPL-2.0), as provided in LICENSES/preferred/GPL-2.0, | |
| with an explicit syscall exception described in | |
| LICENSES/exceptions/Linux-syscall-note, as described in the COPYING file. | |
| This documentation file provides a description of how each source file | |
| should be annotated to make its license clear and unambiguous. | |
| It doesn't replace the Kernel's license. | |
| The license described in the COPYING file applies to the kernel source | |
| as a whole, though individual source files can have a different license | |
| which is required to be compatible with the GPL-2.0:: | |
| GPL-1.0+ : GNU General Public License v1.0 or later | |
| GPL-2.0+ : GNU General Public License v2.0 or later | |
| LGPL-2.0 : GNU Library General Public License v2 only | |
| LGPL-2.0+ : GNU Library General Public License v2 or later | |
| LGPL-2.1 : GNU Lesser General Public License v2.1 only | |
| LGPL-2.1+ : GNU Lesser General Public License v2.1 or later | |
| Aside from that, individual files can be provided under a dual license, | |
| e.g. one of the compatible GPL variants and alternatively under a | |
| permissive license like BSD, MIT etc. | |
| The User-space API (UAPI) header files, which describe the interface of | |
| user-space programs to the kernel are a special case. According to the | |
| note in the kernel COPYING file, the syscall interface is a clear boundary, | |
| which does not extend the GPL requirements to any software which uses it to | |
| communicate with the kernel. Because the UAPI headers must be includable | |
| into any source files which create an executable running on the Linux | |
| kernel, the exception must be documented by a special license expression. | |
| The common way of expressing the license of a source file is to add the | |
| matching boilerplate text into the top comment of the file. Due to | |
| formatting, typos etc. these "boilerplates" are hard to validate for | |
| tools which are used in the context of license compliance. | |
| An alternative to boilerplate text is the use of Software Package Data | |
| Exchange (SPDX) license identifiers in each source file. SPDX license | |
| identifiers are machine parsable and precise shorthands for the license | |
| under which the content of the file is contributed. SPDX license | |
| identifiers are managed by the SPDX Workgroup at the Linux Foundation and | |
| have been agreed on by partners throughout the industry, tool vendors, and | |
| legal teams. For further information see https://spdx.org/ | |
| The Linux kernel requires the precise SPDX identifier in all source files. | |
| The valid identifiers used in the kernel are explained in the section | |
| `License identifiers`_ and have been retrieved from the official SPDX | |
| license list at https://spdx.org/licenses/ along with the license texts. | |
| License identifier syntax | |
| ------------------------- | |
| 1. Placement: | |
| The SPDX license identifier in kernel files shall be added at the first | |
| possible line in a file which can contain a comment. For the majority | |
| of files this is the first line, except for scripts which require the | |
| '#!PATH_TO_INTERPRETER' in the first line. For those scripts the SPDX | |
| identifier goes into the second line. | |
| | | |
| 2. Style: | |
| The SPDX license identifier is added in form of a comment. The comment | |
| style depends on the file type:: | |
| C source: // SPDX-License-Identifier: <SPDX License Expression> | |
| C header: /* SPDX-License-Identifier: <SPDX License Expression> */ | |
| ASM: /* SPDX-License-Identifier: <SPDX License Expression> */ | |
| scripts: # SPDX-License-Identifier: <SPDX License Expression> | |
| .rst: .. SPDX-License-Identifier: <SPDX License Expression> | |
| .dts{i}: // SPDX-License-Identifier: <SPDX License Expression> | |
| If a specific tool cannot handle the standard comment style, then the | |
| appropriate comment mechanism which the tool accepts shall be used. This | |
| is the reason for having the "/\* \*/" style comment in C header | |
| files. There was build breakage observed with generated .lds files where | |
| 'ld' failed to parse the C++ comment. This has been fixed by now, but | |
| there are still older assembler tools which cannot handle C++ style | |
| comments. | |
| | | |
| 3. Syntax: | |
| A <SPDX License Expression> is either an SPDX short form license | |
| identifier found on the SPDX License List, or the combination of two | |
| SPDX short form license identifiers separated by "WITH" when a license | |
| exception applies. When multiple licenses apply, an expression consists | |
| of keywords "AND", "OR" separating sub-expressions and surrounded by | |
| "(", ")" . | |
| License identifiers for licenses like [L]GPL with the 'or later' option | |
| are constructed by using a "+" for indicating the 'or later' option.:: | |
| // SPDX-License-Identifier: GPL-2.0+ | |
| // SPDX-License-Identifier: LGPL-2.1+ | |
| WITH should be used when there is a modifier to a license needed. | |
| For example, the linux kernel UAPI files use the expression:: | |
| // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note | |
| // SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note | |
| Other examples using WITH exceptions found in the kernel are:: | |
| // SPDX-License-Identifier: GPL-2.0 WITH mif-exception | |
| // SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 | |
| Exceptions can only be used with particular License identifiers. The | |
| valid License identifiers are listed in the tags of the exception text | |
| file. For details see the point `Exceptions`_ in the chapter `License | |
| identifiers`_. | |
| OR should be used if the file is dual licensed and only one license is | |
| to be selected. For example, some dtsi files are available under dual | |
| licenses:: | |
| // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause | |
| Examples from the kernel for license expressions in dual licensed files:: | |
| // 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 should be used if the file has multiple licenses whose terms all | |
| apply to use the file. For example, if code is inherited from another | |
| project and permission has been given to put it in the kernel, but the | |
| original license terms need to remain in effect:: | |
| // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT | |
| Another other example where both sets of license terms need to be | |
| adhered to is:: | |
| // SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+ | |
| License identifiers | |
| ------------------- | |
| The licenses currently used, as well as the licenses for code added to the | |
| kernel, can be broken down into: | |
| 1. _`Preferred licenses`: | |
| Whenever possible these licenses should be used as they are known to be | |
| fully compatible and widely used. These licenses are available from the | |
| directory:: | |
| LICENSES/preferred/ | |
| in the kernel source tree. | |
| The files in this directory contain the full license text and | |
| `Metatags`_. The file names are identical to the SPDX license | |
| identifier which shall be used for the license in source files. | |
| Examples:: | |
| LICENSES/preferred/GPL-2.0 | |
| Contains the GPL version 2 license text and the required metatags:: | |
| LICENSES/preferred/MIT | |
| Contains the MIT license text and the required metatags | |
| _`Metatags`: | |
| The following meta tags must be available in a license file: | |
| - Valid-License-Identifier: | |
| One or more lines which declare which License Identifiers are valid | |
| inside the project to reference this particular license text. Usually | |
| this is a single valid identifier, but e.g. for licenses with the 'or | |
| later' options two identifiers are valid. | |
| - SPDX-URL: | |
| The URL of the SPDX page which contains additional information related | |
| to the license. | |
| - Usage-Guidance: | |
| Freeform text for usage advice. The text must include correct examples | |
| for the SPDX license identifiers as they should be put into source | |
| files according to the `License identifier syntax`_ guidelines. | |
| - License-Text: | |
| All text after this tag is treated as the original license text | |
| File format examples:: | |
| 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 | |
| | | |
| 2. Deprecated 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/deprecated/ | |
| in the kernel source tree. | |
| The files in this directory contain the full license text and | |
| `Metatags`_. The file names are identical to the SPDX license | |
| identifier which shall be used for the license in source files. | |
| Examples:: | |
| LICENSES/deprecated/ISC | |
| Contains the Internet Systems Consortium license text and the required | |
| metatags:: | |
| LICENSES/deprecated/GPL-1.0 | |
| Contains the GPL version 1 license text and the required metatags. | |
| Metatags: | |
| The metatag requirements for 'other' licenses are identical to the | |
| requirements of the `Preferred licenses`_. | |
| File format example:: | |
| 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 | |
| | | |
| 3. Dual Licensing Only | |
| These licenses should only be used to dual license code with another | |
| license in addition to a preferred license. These licenses are available | |
| from the directory:: | |
| LICENSES/dual/ | |
| in the kernel source tree. | |
| The files in this directory contain the full license text and | |
| `Metatags`_. The file names are identical to the SPDX license | |
| identifier which shall be used for the license in source files. | |
| Examples:: | |
| LICENSES/dual/MPL-1.1 | |
| Contains the Mozilla Public License version 1.1 license text and the | |
| required metatags:: | |
| LICENSES/dual/Apache-2.0 | |
| Contains the Apache License version 2.0 license text and the required | |
| metatags. | |
| Metatags: | |
| The metatag requirements for 'other' licenses are identical to the | |
| requirements of the `Preferred licenses`_. | |
| File format example:: | |
| Valid-License-Identifier: MPL-1.1 | |
| SPDX-URL: https://spdx.org/licenses/MPL-1.1.html | |
| Usage-Guide: | |
| Do NOT use. The MPL-1.1 is not GPL2 compatible. It may only be used for | |
| dual-licensed files where the other license is GPL2 compatible. | |
| If you end up using this it MUST be used together with a GPL2 compatible | |
| license using "OR". | |
| To use the Mozilla Public License version 1.1 put the following SPDX | |
| tag/value pair into a comment according to the placement guidelines in | |
| the licensing rules documentation: | |
| SPDX-License-Identifier: MPL-1.1 | |
| License-Text: | |
| Full license text | |
| | | |
| 4. _`Exceptions`: | |
| Some licenses can be amended with exceptions which grant certain rights | |
| which the original license does not. These exceptions are available | |
| from the directory:: | |
| LICENSES/exceptions/ | |
| in the kernel source tree. The files in this directory contain the full | |
| exception text and the required `Exception Metatags`_. | |
| Examples:: | |
| LICENSES/exceptions/Linux-syscall-note | |
| Contains the Linux syscall exception as documented in the COPYING | |
| file of the Linux kernel, which is used for UAPI header files. | |
| e.g. /\* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note \*/:: | |
| LICENSES/exceptions/GCC-exception-2.0 | |
| Contains the GCC 'linking exception' which allows to link any binary | |
| independent of its license against the compiled version of a file marked | |
| with this exception. This is required for creating runnable executables | |
| from source code which is not compatible with the GPL. | |
| _`Exception Metatags`: | |
| The following meta tags must be available in an exception file: | |
| - SPDX-Exception-Identifier: | |
| One exception identifier which can be used with SPDX license | |
| identifiers. | |
| - SPDX-URL: | |
| The URL of the SPDX page which contains additional information related | |
| to the exception. | |
| - SPDX-Licenses: | |
| A comma separated list of SPDX license identifiers for which the | |
| exception can be used. | |
| - Usage-Guidance: | |
| Freeform text for usage advice. The text must be followed by correct | |
| examples for the SPDX license identifiers as they should be put into | |
| source files according to the `License identifier syntax`_ guidelines. | |
| - Exception-Text: | |
| All text after this tag is treated as the original exception text | |
| File format examples:: | |
| 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 | |
| All SPDX license identifiers and exceptions must have a corresponding file | |
| in the LICENSES subdirectories. This is required to allow tool | |
| verification (e.g. checkpatch.pl) and to have the licenses ready to read | |
| and extract right from the source, which is recommended by various FOSS | |
| organizations, e.g. the `FSFE REUSE initiative <https://reuse.software/>`_. | |
| _`MODULE_LICENSE` | |
| ----------------- | |
| Loadable kernel modules also require a MODULE_LICENSE() tag. This tag is | |
| neither a replacement for proper source code license information | |
| (SPDX-License-Identifier) nor in any way relevant for expressing or | |
| determining the exact license under which the source code of the module | |
| is provided. | |
| The sole purpose of this tag is to provide sufficient information | |
| whether the module is free software or proprietary for the kernel | |
| module loader and for user space tools. | |
| The valid license strings for MODULE_LICENSE() are: | |
| ============================= ============================================= | |
| "GPL" Module is licensed under GPL version 2. This | |
| does not express any distinction between | |
| GPL-2.0-only or GPL-2.0-or-later. The exact | |
| license information can only be determined | |
| via the license information in the | |
| corresponding source files. | |
| "GPL v2" Same as "GPL". It exists for historic | |
| reasons. | |
| "GPL and additional rights" Historical variant of expressing that the | |
| module source is dual licensed under a | |
| GPL v2 variant and MIT license. Please do | |
| not use in new code. | |
| "Dual MIT/GPL" The correct way of expressing that the | |
| module is dual licensed under a GPL v2 | |
| variant or MIT license choice. | |
| "Dual BSD/GPL" The module is dual licensed under a GPL v2 | |
| variant or BSD license choice. The exact | |
| variant of the BSD license can only be | |
| determined via the license information | |
| in the corresponding source files. | |
| "Dual MPL/GPL" The module is dual licensed under a GPL v2 | |
| variant or Mozilla Public License (MPL) | |
| choice. The exact variant of the MPL | |
| license can only be determined via the | |
| license information in the corresponding | |
| source files. | |
| "Proprietary" The module is under a proprietary license. | |
| This string is solely for proprietary third | |
| party modules and cannot be used for modules | |
| which have their source code in the kernel | |
| tree. Modules tagged that way are tainting | |
| the kernel with the 'P' flag when loaded and | |
| the kernel module loader refuses to link such | |
| modules against symbols which are exported | |
| with EXPORT_SYMBOL_GPL(). | |
| ============================= ============================================= | |