查看原文
其他

MIT 和 GPL 到底是怎么兼容的

开源雨林 2022-07-19

The following article is from 卫sir说 Author 卫sir

本文转自 卫sir说,作者 卫剑钒



开源许可证这事,说简单也简单,说复杂也复杂,有些细节问题,一不小心,就容易给绕进去。


前段时间我就遇到一个问题:两个许可证兼容,到底是在说什么?又如何评判?


比如两个最常见的许可证:MIT 和 GPL-3.0,一个宽松,一个严格,它俩兼容吗?


如果兼容,为什么说是兼容的?


想了半天,才给弄明白。



01什么是许可证兼容?


所谓兼容,就是两个东西放在一起会不会冲突,能不能放到一块。比如:

软件 A 的许可证要求是:你用我的软件,就得每天跑超过 3 公里

软件 B 的许可证要求是:你用我的软件,每天跑步不能超过 1 公里


这两个软件,就不能组合到一起发布,因为他们的许可证要求是冲突的。


如果 B 的许可证要求改为:

你用我的软件,每天必须跑步超过 5 公里

这就不冲突了,A 和 B 就可以组合在一起,按照 B 的许可证发布了。



02那么 MIT 和 GPL 兼容吗?


现在我们回到正题:比如 A 软件是 MIT 的,B 软件是 GPL-3.0 的(以下简称 GPL ),能不能把这两个软件放在一起形成 C,然后发布?


注意,A 和 B 存在调用关系,并不是毫无关系地放在一起。


我想了 3 种可能:

  • C 很大,主要成分是 B,仅仅把 A 当作一个模块用。

  • 作者写了一个很小的 B,调用了很大的 A。

  • 作者直接在 A 里面改了一点东西,这点东西叫 B。


这些情况虽然看上去很不一样,但从许可证的角度看,本质上是一样的,都是 A+B=C。


那么,C 用什么发布?也有 3 种可能:

  • C 用 GPL 发布

  • C 用 MIT 发布

  • C 用其他协议发布,甚至放到公共空间。


哪种可以,哪种不行?我的解答是:

  • C 可以用 GPL 发布,因为 MIT 允许这么干。

  • C 不能用 MIT 发布,因为 GPL 不允许自己的衍生品用 MIT 发布。

  • 想用其他许可证,要具体分析,用 AGPL 也许可以(这在 GPL-3.0 第 13 条有说),但别的大概都不行。



03分析一下


首先要搞明白:C 既是 A 的衍生品,也是 B 的衍生品。


因为从 A 看,是 A 加了 B 形成 C;从 B 看,则是 B 加上了 A 形成 C。


虽然有时会觉得不合常理,比如 B 有 1000 行,A 只有 10 行,把 C 说是 A 的衍生品会让人直觉上感觉不对。但从定义上讲,就是这样的,A 完全可以认为自己从 10 行被改成了 1010 行。


既然 C 是衍生品,我们看看两个许可证对衍生品的要求:

MIT对衍生品的要求是:把A的版权和MIT声明体现出来

GPL对衍生品的要求是:整个C要用GPL发布

这两个要求冲突吗?


不冲突。你可以把 C 按照 GPL 发布,同时把 A 的版权和 MIT 声明体现出来。



04涉及哪些具体条文?


请仔细看 MIT 协议,里面说了它的要求:


来自:https://opensource.org/licenses/MIT


如果不想看英文,可以看我写的中文版解读:从 MIT 协议谈契约精神


事实上,MIT 就是要求显示版权,显示 MIT 协议(显示 MIT 的链接也行)。


另外,注意 MIT 允许 sublicense(分许可),这样,C(包括里面的 A )按照 GPL 发布就有合理依据了。


再仔细看 GPL 协议,按照第 2 条,GPL 是不允许 sublicense 的,也即衍生品只能用 GPL:


来自:https://spdx.org/licenses/GPL-3.0-only.html


按照第 5 条,衍生品的整体要按照 GPL 发布,这样,C 需要按照 GPL 发布,作为 C 里面的 A,也是如此。



作为一种例外,第 13 条说,GPL 可以和 AGPL 兼容,也即 GPL-3.0 的软件和 AGPL-3.0 的软件结合起来,整体可以按 AGPL-3.0 发布


希望更深入了解的,可以看我写的:人话解读 GPLv3



05那么,我应该怎么做?

当你把 A(使用 MIT )和 B(使用 GPL )合并起来,形成 C 以后。


发布 C 时,你要显著地在文档或代码里面体现以下内容。

  • 说明 C 是用 GPL 授权的,比如用 LICENSE 或 COPYING 文件来声明。

  • 说明 C 用了 A,说明 A 的版权,以及 A 是用 MIT 协议的。一方面要在文档里面说,另一方面,在代码里面也要保留 A 的版权和 MIT 协议。


这样做,不违背 MIT,也不违背 GPL。别人看到了,如果想用 C,就遵循 GPL;如果只是想用 A,遵循 MIT 就可以了。



06实例


我在 GitHub 上找到一个叫 netdata 的软件,就符合本文讨论的情况。


该软件的位置在:https://github.com/netdata/netdata


它是用 GPL 发布的,但里面使用的一些第三方软件是 MIT 的。


在该软件仓库的首页上,以及根目录的 LICENSE 文件中,说明了其许可证是 GPL3。但同时提到该软件用了一些第三方软件。



打开上面写的第三方许可(third party licenses),可以看到里面清晰注明了这些第三方软件的出处、版权和许可信息:



上面是部分截图,事实上一共有 30 多个软件,大多数都是 MIT 的。


在代码里面,netdata 的作者也不敢马虎,比如对 d3pie 这个软件的引用,代码头部是这样的:



这就不会有什么问题。


致谢:我的朋友孙振华对此文形成提供了很多帮助。


另:本文只是说明了 MIT 和 GPL-3.0 的兼容性,如果想了解更多许可证之间的兼容关系,回复 “兼容” ,获取信通院牵头编写的“开源许可证兼容性指南”


END




 什么是开源雨林?


开源雨林围绕开源通识、开源使用、开源贡献三大方面构建知识体系,愿把长期积累的经验系统化分享给企业,在团队、机制、项目三方面提供合作,推动各企业更高效地使用开源、贡献开源,提升全行业开源技术与应用水平。 


开源雨林的内容已开源,并托管在 https://github.com/opensource-rainforest ,欢迎通过 Pull Request 的形式贡献内容,通过 Issue 的形式展开讨论,共同维护开源雨林的内容。


往期精彩回顾



刘雪宁:企业如何进行开源合规体系建设红薯有话说 - Gitee 审核规则变化的缘由中国信通院郭雪:企业如何进行合规风险治理姜宁:如何参与开源社区贡献

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~
点分享点收藏点点赞点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存