关键的一句话
GNU 许可证建议的声明中包含以下一句话。
either version 3 of the License, or (at your option) any later version.
有了这句话,接收者就可以选择遵守指定版本或 FSF 此后发布的任何版本的条件。这就是「or later」(SPDX GPL-3.0-or-later)。如果删掉其中的「or later」部分、只写特定版本,就成为「only」(GPL-3.0-only)。
GPL-3.0 第 14 条和 GPL-2.0 第 9 条规定了这一结构。尤其是 GPL-2.0 第 9 条规定,如果程序完全没有写明版本号,就可以选择 FSF 发布的任何版本。因此,如果只放 LICENSE 文件而不说明版本条款,可能会被解释为与本意不同的含义。
为什么要加「or later」
FSF 推荐「or later」,理由是面向未来的兼容性。当法律和技术环境变化、新版 GPL 发布时,「or later」代码可以自然地与新版本结合。事实上,GPL-2.0-or-later 代码可以直接放进 GPL-3.0 项目,而 GPL-2.0-only 代码则不行。
GPL-3.0 第 14 条更进一步,允许指定「代理人(proxy)」。版权所有者指定的人公开决定是否接受以后的版本时,该决定即具有效力。
为什么选择「only」
「or later」也意味着预先同意尚未写出的许可证。如果 FSF 以后发布了包含与我意愿不同条件的新版本,接收者就可以选择该版本来使用我的代码。
Linux 内核是代表性案例。内核采用 GPL-2.0-only。林纳斯·托瓦兹公开表示反对 GPL-3.0 的安装信息条款(即所谓防 Tivo 化),而且内核中混杂着数千名贡献者的版权,实际上也无法更换许可证。
对兼容性的影响
GNU 许可证常见问题中的兼容性矩阵概括如下。
| 引入的代码 → 我的项目 | GPL-2.0-only | GPL-2.0-or-later | GPL-3.0 |
|---|---|---|---|
| GPL-2.0-only | 可以 | 可以(组合作品为 2.0-only) | 不可以 |
| GPL-2.0-or-later | 可以 | 可以 | 可以 |
| GPL-3.0 | 不可以 | 可以(组合作品为 3.0) | 可以 |
| LGPL-3.0 | 不可以 | 可以(组合作品为 3.0) | 可以 |
关键在于 GPL-2.0-only 与 GPL-3.0 无法相互接纳。两个许可证各自要求「不得附加额外限制」,而对方的附加条件(3.0 的专利和安装信息条款等)在另一方看来就是额外限制。更多组合可以在兼容性检查器中查看。
选择标准
- 遵循生态:如果代码要进入 Linux 内核,就必须是 GPL-2.0-only(或与之兼容的 GPL-2.0-or-later、宽松型许可证)。
- 重视未来兼容性:如果很可能与多个 GPL 项目交换代码,or-later 更灵活。
- 重视控制权:如果不想交给 FSF 未来的决定,可以使用 only,或者通过 GPL-3.0 第 14 条的代理人指定决策者。
标注方法
- 在
LICENSE(或COPYING)中原样放入相应版本的原文。原文本身并不区分 only 和 or-later。 - 通过每个文件的声明和 SPDX 标识符说明版本条款。在生成器的文件头标签页中选择「only」或「or-later」,即可同时生成 GNU 官方声明和 SPDX 行。
- 在 README 中也用一句话写明(例如「Licensed under GPL-3.0-or-later」)。
本文为一般信息,不构成法律意见。重要决定请咨询专业人士。
参考来源
- GNU 许可证常见问题,VersionThreeOrLater · AllCompatibility — https://www.gnu.org/licenses/gpl-faq.html
- GNU, How to Use GNU Licenses for Your Own Software — https://www.gnu.org/licenses/gpl-howto.html
- Linux 内核许可规则 — https://www.kernel.org/doc/html/latest/process/license-rules.html
- SPDX License List — https://spdx.org/licenses/