开源软件非常多(举例),而且功能功能强大,许多开源软件都是牛人编写的,对于一名程序员,通过采用别人的开源软件,再构建自己的项目,就像站在巨人的肩膀上,能达到事半功N倍的效果。但是开源软件不是说无视任何协议地随意使用,因为正规的开源软件,都会携带一份License许可证,使用开源代码的任何人都必须遵循该许可,否则可能给自己带来一些麻烦。

在了解开源协议(License)之前必须先了解一下当前的主流开源组织。

一、开源组织

目前,业界有两大开源阵营名声比较显赫,地位比较权威,它们分别是FSF与OSI。

1.1、FSF(Free Software Foundation,自由软件基金会)

如何选择开源协议(这些开源组织与开源协议)(1)

自由软件基金会是在1985年10月由理查德·斯托曼建立的美国民间非营利组织,并提出“自由软件”的概念,即要尊重用户自由,为了该自由提出了Copyleft(自由)概念,就是Copyright(版权)的反义词,该自由包含如下几点要求:

如何选择开源协议(这些开源组织与开源协议)(2)

因此,自由软件是必须100%提供源码,但是“自由软件”并不是完全免费,发布“自由软件”的作者可以选择适当的收费(收费价格需合理),也可以免费。

如何选择开源协议(这些开源组织与开源协议)(3)

Free是自由

FSF发布的License许可证协议被广泛使用的就是GPL协议与LGPL协议,目前最新版本是3.0,GPL协议对使用自由软件源码再开发的人基本要求是:如果再发布新软件,必须公开源代码;而LGPL会宽松一些,不需要完全公开源代码。

如何选择开源协议(这些开源组织与开源协议)(4)

备注:理查德·马修·斯托曼(Richard Matthew Stallman, RMS),于1953年出生,自由软件运动的精神领袖、GNU计划以及自由软件基金会(Free Software Foundation)的创立者、著名黑客。

1.2、OSI(Open Source Initiative,开源计划组织)

如何选择开源协议(这些开源组织与开源协议)(5)

在1998年OSI正式成立,因为FSF提出的“自由软件”很容易给人带来免费自由的误解,同时“自由软件”对于个人开发者来说很喜欢,但是对于企业来说想继承发展“自由软件”会有一些顾忌,因为使用了“自由软件”的源码,新的项目的源码也需要公开,许多商业公司是不愿意的。基于此机会,在资深黑客Eric Raymond和Bruce Perens发起下,聚集了业界大牛进行“头脑风暴”,Christine Peterson想到了“开源(Open Source)”一词,得到大家的认可,并且“开源软件”这个词还得到Linus Torvalds(Linux之父)和Richard Stallman(自由软件fsf之父)的认可。

如何选择开源协议(这些开源组织与开源协议)(6)

图:Tim O’Reilly与自由软件之父Richard Stallman

经过Tim O’Reilly的推动, OSI成为一个权威的开源标准组织,开源协议如果要获得OSI组织的认可,需要首先满足该组织的10项OSD要求(即Open Source Definition,开源定义),如下表10条:

如何选择开源协议(这些开源组织与开源协议)(7)

目前被OSI组织批准的开源协议有BSD协议、MIT协议、Apache协议等接近上百种协议,许多协议的内容差别并不大,因此常用主流的协议如下几种:

如何选择开源协议(这些开源组织与开源协议)(8)

FSF自由软件基金会发布的GPL协议也得到OSI组织的认可,进入OSI组织的大名单中,通过官方网站可以查看各个协议的英文原版:

https://opensource.org/licenses/category

1.3、Apache软件基金会(Apache Software Foundation,简称为ASF)

ASF是专门为运作一个开源软件项目的 Apache 的团体提供支持的非盈利性组织,这个开源软件项目就是 Apache 项目。它所发行的软件产品都遵循 Apache许可证(Apache License),目前最新的许可证版本为Apache-2.0。

二、主流开源协议许可

开源协议许可证很多,甚至许多开源协议(如BSD、GPL)比OSI组织成立的时间还早,OSI的出现有利于对所有协议进行规范管理,将重复或过时的协议,可以决定不再使用。

在了解开源许可协议前,需要先了解一下什么是开源许可证。

2.1、什么是开源许可证

如何选择开源协议(这些开源组织与开源协议)(9)

开源许可证是一种法律许可,源码拥有者可以在开源许可证上指明其它用户的权利,比如用户可以免费地使用、修改、共享该软件。

如果没有开源许可证,用户使用的源码,就会侵犯的原作者的版权。因此软件开源时,必须明确地授予用户开源许可证;用户使用开源代码开发新的软件,必须按开源许可证的约定执行。

如何选择开源协议(这些开源组织与开源协议)(10)

如果开源许可证要求新的软件也需要免费开源时(如GPL协议),则必须开放新软件源码;如果开源许可证没有明确要求,则用户可以选择性的开放(如BSD)。

如何选择开源协议(这些开源组织与开源协议)(11)

国际公认的开源许可证中,共同的特性都是允许用户使用、修改、共享源码,但是使用的限制条件会有些不一样,根据限制条件严格程度,可分为宽松式(permissive)许可证和Copyleft许可证。

宽松式(permissive)许可证:用户限制比较少,用户修改代码后可以闭源,常见的宽松许可证如BSD、MIT、Apache2等。

如何选择开源协议(这些开源组织与开源协议)(12)

Copyleft许可证:允许随意复制、修改代码,但是修改后的代码需要开源,不得闭源,常见的Copyleft许可证如GPL,LGPL等。

如何选择开源协议(这些开源组织与开源协议)(13)

2.2、BSD与GPL许可证

开源代码发布时,除了包含开源文件外(如.c文件等),还需要至少包含2个信息来说明该软件是开源软件。

其一、一份license文件(通常以COPYING做文件名),来说明基于哪个开源协议,如下图gcc-11.2.0版本源码目录所示(gcc基于GPL-3.0版本协议):

如何选择开源协议(这些开源组织与开源协议)(14)

如何选择开源协议(这些开源组织与开源协议)(15)

其二、在各个源代码文件头需要说明发布时间及用户权利与免责条款等。

如何选择开源协议(这些开源组织与开源协议)(16)

如何选择开源协议(这些开源组织与开源协议)(17)

有些开源协议可能需要包含更多的文件。开源许可证很多,分别从宽松式和Copyleft式许可证中各举一例来说明许可证的使用条件,比如BSD协议与GPL协议。

2.2.1、BSD许可证

BSD许可证是随着加州大学伯克利分校发布BSD UNIX发展起来的 “宽容自由软件许可证”,有4个版本被OSI批准收录(0BSD、BSD-1、BSD-2、BSD-3)。

如何选择开源协议(这些开源组织与开源协议)(18)

其中BSD-3是目前最新的一个协议,协议内容比较少,OSI官网上可下载:

https://opensource.org/licenses/BSD-3-Clause。

1、BSD-3协议内容

如何选择开源协议(这些开源组织与开源协议)(19)

如何选择开源协议(这些开源组织与开源协议)(20)

如何选择开源协议(这些开源组织与开源协议)(21)

其中3个使用条件大概的意思如下表描述:

如何选择开源协议(这些开源组织与开源协议)(22)

从以上条款可知,遵循BSD协议可以复制、修改源代码,也可以再次发布软件,并没有说再发布需要公开源码,因此是否需要公开由使用者决定。

2、BSD-3协议使用举例

假设有一个基于BSD-3协议的开源代码A.c,现在使用A.c进行开发新的软件B.c,则B.c可以开源发布,也可以作为闭源软件生成二进制文件进行发布。

如何选择开源协议(这些开源组织与开源协议)(23)

代码A.c

如何选择开源协议(这些开源组织与开源协议)(24)

软件B.c

因此宽松式开源协议,对于商业公司来说是很友好的,既可以使用成熟优秀的开源代码,又可以闭源自己公司的代码。

Apache 2.0、MIT协议在开源代码的使用限制方面与BSD-3差不多,只是在专利许可等部分条款略有区别。

2.2.2、GPL许可证

GPL是由FSF自由基金会发布的通用性公开许可证,主流使用的有两个版本GPL-2.0和GPL-3.0,其中3.0版本中增加了一部分条款,如专利授权方案、违规终止方案等等。

如何选择开源协议(这些开源组织与开源协议)(25)

对于使用GPL发布的开源代码,需要遵循其开源协议要求,以GPL-3.0为例,重点关注TERMS AND CONDITIONS的第4-6点要求。

条款链接:https://opensource.org/licenses/GPL-3.0

1、第4点,描述拷贝源代码再发布的条件

如何选择开源协议(这些开源组织与开源协议)(26)

大意是随意发布完整源码副本,源码文件头需要保留作者版权信息及免责声明信息;同时需要附上一份本协议的副本(即COPYING文件名的GPL-3.0协议文件)。  可以免费或收费转发,也可以选择提供技术支持或品质担保以换取收入(可以收取服务费)。

2、第5点,描述修改开源代码再发布的条件

如何选择开源协议(这些开源组织与开源协议)(27)

如何选择开源协议(这些开源组织与开源协议)(28)

如何选择开源协议(这些开源组织与开源协议)(29)

大意是修改的源码可以再发布,条件是必须注明修改了哪里和修改日期,按原有GPL协议发布授权,不允许私自增加授权条款,如果使用该软件的产品有界面或打印信息,需要显示这些授权信息等。

3、第6点,描述修改或使用开源代码,然后以二进制文件再发布的条件

如何选择开源协议(这些开源组织与开源协议)(30)

如何选择开源协议(这些开源组织与开源协议)(31)

如何选择开源协议(这些开源组织与开源协议)(32)

这点就是详细说明了如果不是以源码形式再发布,而是以目标码(可执行文件形式,如.exe文件),则需要以相应的方式提供开源代码,包括光盘、ftp服务器下载等等,总之,使用者需要有途径可以获取源代码。

从以上3点可知,GPL协议,无论如何都需要公开源代码的。

4、GPL-3.0协议使用举例

假设有一个基于GPL-3.0协议的开源代码A.c,现在使用A.c进行开发新的软件B.c,则B.c源码必须开源,如果生成二进制文件B.exe进行发布,必须通过各种渠道给用户下载B.c源码。

如何选择开源协议(这些开源组织与开源协议)(33)

代码A.c

如何选择开源协议(这些开源组织与开源协议)(34)

软件B.c

5、LGPL协议

因为GPL协议对商业公司来说是很矛盾的,想用又不敢用,因为使用了就要公开自己的源代码,对于商业公司来说是不太愿意的,因此LGPL协议诞生。

如何选择开源协议(这些开源组织与开源协议)(35)

LGPL协议代码使用举例:

如何选择开源协议(这些开源组织与开源协议)(36)

库文件A.h

如何选择开源协议(这些开源组织与开源协议)(37)

代码B.c

,