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种可能:
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条有说)
,但别的大概都不行。
三、分析一下
首先要搞明白:
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六种开源协议
五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
开源许可证GPL,BSD,MIT,Mozilla,Apache和LGPL的区别