开源3 - 主流开源协议
本文讲述主流开源协议(GNU Public,BSD,MIT,Apache,Lesser GNU Public,Mozilla Public)的内容以及异同。
关于GNU和BSD的起源,在之前的文章 开源1 - 操作系统历史 中以及陈述过,本文不再赘述。
GNU Public License
GNU可以说是开源世界的奠基者,虽然在之前也有很多公开源代码的软件,但是GNU Public License真正将开源变为一种精神。
虽然本文在谈开源,但是本文讨论的开源并不仅仅是开放源代码这个狭小的概念,正如GPL所说,GPL是一个自由(Free)的协议。所谓自由软件,强调自由,而非免费。
GPL的引言已经把GNU的理念说的非常清楚:
引言
GNU通用公共许可协议是一份面向软件及其他类型作品的,自由的版权共产协议。
就多数软件而言,许可协议被设计用于剥夺你分享和修改软件的自由。相反,GNU通用公共许可协议力图保障你分享和修改某程序全部版本的权利——确保自由软件对其用户来说是自由的。我们自由软件基金会将GNU通用公共许可协议用于我们的大多数软件,并为一些其他作品的作者效仿。你也可以将本协议用于你的程序。
所谓自由软件,强调自由,而非免费。本GNU通用公共许可协议设计用于确保你享有分发自由软件的自由(你可以为此服务收费),确保你可以在需要的时候获得这些软件的源码,确保你可以修改这些软件或者在新的自由软件中复用其中某些片段,并且确保你在这方面享有知情权。
为保障你的权益,我们需要作一些限定:禁止任何人否认你的上述权利,或者要求你放弃它们。因此,当你分发或修改这些软件时,你有一定的责任——尊重他人的自由。如果你分发这种程序的副本,无论收费还是免费,你必须给予与你同等的权利。你还要确保他们也能收到源码并了解他们的权利。
采用GNU通用公共许可协议的开发者通过两步保障你的权益:其一,申明软件的版权;其二,通过本协议使你可以合法地复制、分发和修改该软件。
为了保护每一位作者和开发者,GNU通用公共许可协议指明一点:自由软件并没有品质担保。为用户和作者双方着想,GNU通用公共许可协议要求修改版必须有标记,以免其问题被错误地归到先前版本的作者身上。
某些设备设计成拒绝用户安装运行修改过的软件,但厂商不受限。这和我们保护用户享有修改软件的自由的宗旨存在根本性矛盾。该滥用协议的模式出现于个人用品领域,这恰是最不可接受的。因此,我们设计了这版GNU通用公共许可协议来禁止这类产品。如果此类问题在其他领域涌现,我们时刻准备着在将来的版本中把规定扩展到相应领域,以保护用户的自由。
最后,每个程序都持续受到软件专利的威胁。政府不应该允许专利限制通用计算机软件的开发和应用,在做不到这点时,我们希望避免专利应用有效地使自由软件私有化的危险。就此,GNU通用公共许可协议保证专利不能使程序非自由化。
关于复制、分发和修改的术语和条件
由于原文过于长以及难懂,所以本文仅仅概况GPL的常见情况:
GPL同时保证开发者和使用者的权利,如下:
内容
Copyright (C) <year> <name of author>
- 可自由复制
你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。 - 可自由分发
在你的网站提供下载,复制到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。 - 可以用来盈利
你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的GNU GPL许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。 - 可自由修改
如果你自由添加或删除某个功能,或者在别的项目中使用部分代码,唯一的要求是,使用了这段代码的项目也必须使用GPL协议。
解释
此处为上面每条权利的解释:
- GPL诞生于软件商依靠售卖软件的时代,软件商按份售卖软件
- 同1.
- GPL强制要求开放源代码,但仅限于源代码,如果你没有能力自己编译一份可以用的程序,那么你可以选择从开发者处购买,但是,GPL同时保证你可以再继续分发更多份可用程序而不用继续向开发者购买
- GPL对可自由修改还有附加限制,你需要将你修改后的源代码也公开出来。
评价
GPL中的条款几乎涉及了所有方面并且做出了详细的解释,GPL也就成为了所有后来的开源协议的模板和法律依据。
GPL是一种Copyleft,即反Copyright,无版权。
GPL具有传染性,GPL协议的软件衍生的软件依然是GPL,所以GPL鼓励以社区的形式完善软件,而不是将软件占为己有,这也是GNU/Linux社区在无盈利的情况下也能繁荣的原因。
GPL规定的公开源代码仅仅是在分发时的强制行为,如果你只是自己用,或者有限范围用,比如说公司内部,那么你就不用开源。一旦你把软件公开作为一个产品,此时必须开源,
GPL有一个缺陷,是GPL不限制通过网络进行的服务。例如你使用GPL的软件给客户提供网络服务,由于客户没有运行软件,所以此时也无需开源,这个问题在AGPL中得到了解决。
GPL v2仅仅限制了软件,GPL v3还对硬件做出了限制,即硬件也可以以GPL发布。
软件开发中关联性
在GNU/Linux软件开发中,软件之间的关联主要体现在4方面:
- 将软件作为自己的子模块
- 软件调用系统的函数以驱动软件功能
- 软件使用了其他库来完成自己的功能
- 软件被内核加载成为内核的一部分
对于第一条,毫无疑问的需要遵守GPL
对于第二条,Linux的作者明确表示不需要GPL
第三条存在一定的争议,但是GNU/Linux认为需要,因为软件的一部分功能是由这些库实现的
这条是最大的争议,也是Linux在商业中使用的最大问题
由于操作系统需要直接操作硬件,负责和硬件硬件的又是内核,所以内核必须能够认识硬件指令(通过驱动的方式),这些包括一些独有的和公开的指令。对于公开的指令,Linux本身就已经进行了收录,硬件厂商不必对此花费精力。但是对于独有的指令,Linux并没有收录,那么就需要硬件厂商去对Linux进行修改,以便使用这些硬件。硬件必须有软件才能使用,并一起分发给用户,就代表着硬件厂家必须将硬件的细节公开,但是这显然不能满足硬件厂家的利益,所以许多硬件厂家选择违反GPL协议。
Lesser GNU Public License
内容
LGPL与GPL类似,主要区别是不再对引用软件加以限制,只有在你修改了软件的时候,才需要把修改的部分以LGPL开源。
BSD License
BSD协议比较简单,仅有3句或者4句:
内容
Copyright (c) <year>, <copyright holder> All rights reserved.
本许可在用户满足以下三条件的情况下,授予用户使用及再散播本软件源代码及二进制程序的权利,无论是否经过修改。
- 如果你将程序的源代码二次发布,则必须包含本文档。
- 如果你将程序以二进制程序发布,则必须包含本文档,和下面的免责声明
- 未经许可不得使用本产品的信息进行推广或者担保。
- 宣传时必须说明作者[1]
解释
BSD在最初的版本包含4条,这存在一个问题就是所有贡献者都想把自己的名字写进去。所以在后来BSD删除了这条。
此外BSD协议只要求二次发布时附带本文档,并且不对本程序提供任何担保。
由于BSD协议前两条的存在,如果作者在版权信息中添加了进行了署名,那么你也必须将其保留。相对的,GPL仅仅规定需要继承GPL,没有规定保留文档或者,并且是Copyleft。
MIT License
MIT协议非常类似于新的BSD协议,唯一区别是MIT协议允许使用产品名字进行宣传。
内容
Copyright (C) <year> <copyright holders>
你可以自由复制,分发出版,修改使用或者出售软件副本,仅需满足以下条件:
你需要在软件内保留版权通知和许可。
本软件无任何担保。
Apache License
内容
Copyright [yyyy] [name of copyright owner]
- 需要给代码的用户一份Apache Lience。
- 如果你修改了代码,需要在被修改的文件中说明。
- 在延伸的代码中需要带有原来代码中的协议、商标、专利声明和其他原来作者规定需要包含的说明。
- 如果再发布的产品中包含了说明文件,则需要在说明文件中带有Apache Lience。你可以在说明中增加自己的许可,但不可以违反或者删除Apache Lience。
解释
Apache License允许商业使用,但是需要让使用产品的人知道该产品使用了Apache License的代码并且保留版权声明和署名。
Mozilla Public License
解释
MPL类似于LGPL,但是MPL是Copyright。MPL强调对软件的进行修改后,软件的版权依然完全属于原作者。
参考:维基百科相关词条,各License网站。