MIT和GPL到底是怎么兼容的

Posted vigor2323

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MIT和GPL到底是怎么兼容的相关的知识,希望对你有一定的参考价值。

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

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

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

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

想了半天,才给弄明白。

一、什么是许可证兼容?

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

比如:

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

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

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

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

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

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

二、那么MIT和GPL兼容吗?

现在我们回到正题:

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

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

我想了3种可能:

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

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

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

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

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

  1. C用GPL发布

  2. C用MIT发布

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

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

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

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

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

三、分析一下

首先要搞明白:

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声明体现出来。

四、涉及哪些具体条文?

请仔细看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

五、那么,我应该怎么做?

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

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

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

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

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

六、实例

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

该软件的位置在:

https://github.com/netdata/netdata

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

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

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

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

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

这就不会有什么问题。

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

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

文|卫剑钒

以上是关于MIT和GPL到底是怎么兼容的的主要内容,如果未能解决你的问题,请参考以下文章

GPL,LGPL,BSD,MIT,Apache,Mozilla六种开源协议

jqGrid 历史和现状

五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍

开源许可证GPL,BSD,MIT,Mozilla,Apache和LGPL的区别

五种开源协议(GPL,LGPL,BSD,MIT,Apache)

五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)