Linux内核的许可证规则及其标注随着版本的升级越来越规范,也越来越要求方便工具进行检查。我列举了linux内核4.16之前的某一版、4.16版和最新的5.18版内核许可证信息,对Linux内核的许可证规则及其标注进行说明。
上篇请参见Linux内核开源可证信息及其标注(上)_yupengipr的博客-CSDN博客
三、最新的linux内核5.18开始的开源许可证
延续4.16版本后许可证的标注方式,根目录下有COPYING文件,licenses文件夹下分为了4个文件夹preferred、exceptions、dual、deprecated。
1、根目录下有COPYING文件
根目录下的COPYING文件从4.17开始发生改变,改变为:GPLv2许可证和系统调用例外均采用引用LICENSES文件夹文件的形式,并增加了license-rules.rst文件描述许可证规则。
2、Preferred文件夹中没有实质修改,进对如何标引描述稍有改进。
3、Exceptions文件夹增加了GCC-exception-2.0,允许非GPL兼容的代码链接GPL代码的编译版本。
4、在dual双许可证文件夹中有Apache-2.0、CC-BY-4.0、CDDL-1.0、MPL-1.1四个文件,例如MPL-1.1文件指出因为GPLv2兼容问题不能仅使用MPL-1.1许可证,但可以与GPLv2一起使用,构成双许可。
5、在deprecated文件夹列出个GPL-1.0、ISC、X11、Zlib、Linux-OpenIB、GFDL-1.2、GFDL-1.4共7个许可证文件,不建议在新的代码再采用这些许可证。
6、license-rules.rst文件
Documentation/process/license-rules.rst文件,全文可参考在目前的linux内核社区Linux kernel licensing rules文档(Linux kernel licensing rules — The Linux Kernel documentation,中文翻译:Linux内核许可规则 — The Linux Kernel documentation)
在该文件中指明了Linux内核项目许可证并描述如何在每个源代码文件标注许可证,建议大家直接阅读此文档。主要包括:
(1)用户空间API(UAPI)头文件描述了用户空间程序与内核的接口。根据Linux-syscall-note,可以理解syscall接口是一个明确的边界,它不会将GPL要求扩展到任何使用它与内核通信的软件。由于UAPI头文件必须包含在用于创建Linux内核上运行的可执行文件的任何源文件中,因此此例外必须记录在特别的许可证表述中。一般是在linux kernel UAPI文件中加入如下表达: // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note或// SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note
(2)如何使用软件包数据交换(SPDX)许可证标识符代替源代码文件中的许可证“样板”,以便工具可以自动解析许可证。
(3)在可加载模块还需要MODULE_LICENSE()标记。此标记以便表明该模块对于内核模块加载器和用户空间工具来说是自由软件还是专有软件。(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.)如果没有该标记,加载该模块时会出现警告:加载模块,出现警告:Warning: loading XXX.o will taint the kernel: no license。即发现了没有许可证的模块,不符合linux kernel的许可规则。