linux内核开发学习手册-内核许可证
原文见:内核开发文档-Linux kernel licensing rules(Linux内核许可规则)
内核通用许可证
- linux内核虽然是开源的,但是为了避免开发者的心血被不良厂商赚取利益等和保护开源环境,因此是有基于GPL-2.0() 的通用公共许可证作为法律保护的,具体的描述见COPYING文件。
- 所有的内核源文件都需要标志许可证,而且这个许可证是可以与GPL-2.0兼容的,但是UAPI是作为例外的,因为是非内核的软件如果与内核通信,需要包含此头文件,但是我们不能要求该通信软件也受此许可证限制,因此此类特殊的例外许可描述也会被记录。
- 为了便于源文件的统一标识许可证,因此使用可解析的SPDX(Software Package Data Exchange),当我们使用
./scripts/checkpatch.pl
来检查文件时,同时也会检查SPDX
内核许可规则
内核许可列表是官方列表,描述了可用的SPDX条目和已经不再使用的。比如GPL-2.0-only
是比GPL-2.0
更加规范的,目前广泛使用的的许可证见LICENSES/preferred/
描述规则
不同类型的文件有不同的描述规则。更多见内核开发文档
1 | C source: // SPDX-License-Identifier: <SPDX License Expression> |
SPDX声明位置
应该放在第一行,虽然说有#!PATH_TO_INTERPRETER
的时候在第二行,但是目前内核没有使用#!PATH_TO_INTERPRETER
的脚本
语法
通用语法如下
1 | // SPDX-License-Identifier: GPL-2.0-only |
当UAPI需要使用例外许可时,使用 WITH
,例外许可证见LICENSES/exceptions</font>
`
1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
目前出了UAPI的例外,内核LICENSES/exceptions声明的例外还有GCC-exception-2.0,作为GCC链接例外,允许任意的二进制文件能够和该例外声明的文件编译的版本文件链接,使用基本都是arch/sh/lib/的汇编文件中
1 | /* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 |
双重许可证
文件有双重许可,但是只有一个会被使用,多见dts文件
1 | // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT |
多个许可证
文件使用多个许可证。当一个代码我们已经被授予放入内核的权限,我们也应该保留其原始的许可条款
1 | // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT |
模块许可规则
模块许可规则应用于可加载模块,其不能替代SPDX也不提供明确的许可,只是提供足够的信息说明。常用如下即可
1 | MODULE_LICENSE("GPL v2"); |
MODULE_LICENSE("GPL v2");
需要特殊说明,因为使用会污染内核,而且内核会拒绝将模块链接到使用EXPORT_SYMBOL_GPL()导出的符号