1. 什么是 GNU 通用公共许可证(GPL)?
GNU 通用公共许可证(GNU General Public License,简称 GPL) 是由 自由软件基金会(FSF, Free Software Foundation) 制定的一种开源许可证,最初由 理查德·斯托曼(Richard Stallman) 于 1989 年发布,主要用于 保护软件的自由性。它是 自由软件运动 的重要基石,确保软件代码可以被自由使用、修改和分发。

GNU通用公共许可协议(英语:GNU General Public License,缩写GNU GPL 或 GPL),是被广泛使用的自由软件许可协议,给予了终端用户运行、学习、共享和修改软件的自由。许可协议最初由自由软件基金会的理查德·斯托曼为GNU项目所撰写,并授予电脑程序的用户自由软件定义(The Free Software Definition)的权利。GPL是一个Copyleft许可协议,这意味着只要项目的某个部分(如动态链接库)以GPL发布,则整个项目以及派生作品只能以相同的许可条款分发。这与宽松自由软件许可证有所区别 ,如BSD许可协议和MIT许可协议就是其中被广泛使用的例子。GPL是第一个普遍使用的Copyleft许可协议。
历史上,GPL许可协议系列一直是自由和开源软件领域最受欢迎的软件许可之一。根据GPL许可的优异自由软件程序的例子有Linux内核和GNU编译器集合(GCC)。大卫·A·惠勒认为,GPL提供的Copyleft对于基于Linux的系统的成功至关重要,给予向内核贡献的程序员保证他们的工作将有益于整个世界并保持自由,而不至于被不提供反馈给社群的无良软件公司所剥削。
2007年,发布了第三版许可协议(GNU GPLv3),以解决在长期使用期间发现的第二版(GNU GPLv2)所发生的一些困扰。为了使许可协议保持最新状态,GPL许可协议包含一个可选的“并延伸到未来版本”条款,允许用户在FSF更新的原始条款或新版本之间进行选择。有些开发人员在软件许可使用时,选择省略它;例如,Linux内核已经在GPLv2下获得许可,就不需包括“并延伸到未来版本”的声明。
GPL授予程序接受人以下权利,或称“自由”,或称“copyleft”:
- 基于任何目的,按你的意愿运行软件的自由(自由之零)。
- 学习软件如何工作的自由,按你的意愿修改软件以符合你的计算的自由(自由之一)。可访问源代码是此项自由的先决条件。
- 分发软件副本的自由,因此你可以帮助你的好友(自由之二)。
- 将你修改过的软件版本再分发给其他人的自由(自由之三)。这样可以让整个社区有机会共享你对软件的改动。可访问源代码是此项自由的先决条件。
相反地,随著作权所有软件的最终用户许可协议几乎从不授予用户任何权利(除了使用的权利),甚至可能限制一些法律允许的行为,比如逆向工程。
GPL与其他一些更“许可的”自由软件许可协议条款(比如BSD许可协议)相比,主要区别就在于GPL寻求确保上述自由能在复制软件及派生作品中得到保障。它透过一种由斯托曼发明的叫Copyleft的法律机制实现,即要求GPL程序的派生作品也要在GPL之下。相反,BSD式的许可协议并不禁止演绎作品变成专有软件。
GPL是自由软件和开源软件的最流行许可协议。到2004年4月,GPL已占Freshmeat上所列的自由软件的约75%,SourceForge的约68%。类似的,2001年一项关于Red Hat Linux 7.1的调查显示一般的代码都以GPL发布。著名的GPL自由软件包括EMACS,Linux内核(并非所有Linux发行版的内核都是开源的)和GCC。
2. GPL 的核心理念
GPL 许可证的核心理念是 Copyleft(著佐权,或称反版权),即:
- 任何基于 GPL 许可证的软件都可以自由使用、修改和分发。
- 但如果你修改或基于 GPL 代码开发新软件,那么新软件必须遵循 GPL 许可证,并开放源代码。
- 这意味着软件不会被私有化,所有用户都能享受相同的自由。
3. GPL 的发展历史
GPL由理查德·斯托曼于1989年编写,提供给列入GNU项目的一些软件程序所使用。原始的GPL基于GNU Emacs(1985),GNU Debugger和GNU C编译器的早期版本中使用的类似许可协议的统一。这些许可协议包含与现代GPL类似的规定,但具体针对每个程序,使其不兼容,尽管是相同的许可协议。Stallman的目标是提供一个可用于任何项目的许可证,从而使许多项目得以共享代码。GPL版本1就这样,在1989年1月诞生。
到1990年时,某些因素使得代码库(Library),应该要有比GPL更宽松的许可许可的需求。所以当GPL版本2在1991年6月发布,另一许可协议——程序库通用许可协议(Library General Public License,简称 LGPL)也随之诞生,并记作“版本2”以示对GPL的补充。版本号在LGPL版本2.1发布时不再相同,而LGPL也被重命名为GNU宽通用公共许可证以体现GNU的哲学观。
许可协议的第二个版本,版本2,在1991年发布。在接下来的15年中,自由软件社群的成员很关心GPLv2许可协议中的问题,可能会让某些人钻漏洞而违反许可协议,而违背了原先GPL许可许可软件的原意。这些问题包括Tivo化(来自硬件的软件限制,意指将GPL许可软件安装在硬件上,又拒绝运行更动相关软件的修改版本),类似与Affero通用公共许可协议类似的兼容性问题,以及微软和自由开源软件,其中一些被认为试图将专利申请用作于对付自由软件社群的武器。
第3版旨在解决这些问题,并于2007年6月29日正式发布。
- GPLv1(1989 年):最早版本,定义了自由软件的基本权利。
- GPLv2(1991 年):增强了对专有软件兼容性的控制,是 Linux 内核当前使用的版本。
- GPLv3(2007 年):
- 解决了 DRM(数字版权管理)等问题。
- 增强了对专利问题的保护。
- 限制了 Tivoization(防止厂商封锁 GPL 设备,使用户无法修改软件)。
4. GPL 许可的主要条款
GPL的条款和条件必须提供给任何接受GPL应用的作品的副本(“被许可人”)的人员。任何遵守条款和条件的被授证人员都有权修改作品,以及复制和重新分发作品或任何派生版本。被许可人被允许为此服务收取费用,或无偿。后一点将GPL与禁止商业再分发的软件许可区分开来。FSF认为,自由软件不应该限制商业用途,GPL明确规定GPL作品可能以任何价格出售。
GPL还规定,经销商不得对GPL授予的权利施加“进一步限制”。禁止根据不披露协议或合同分发软件等活动。
许可协议版本2的第四部分和版本3的第七部分要求,作为预编译二进制文件分发的程序应附有源代码的副本,透过与前一版本相同的机制分发源代码的书面报价编译的二进制文件或书面报价,以获取用户在GPL下接收预编译二进制文件时获得的源代码。版本2的第二部分和版本3的第五部分还要求“所有收件人本程序附带的许可协议副本”。许可协议的版本3允许以其他方式提供源代码来实现第七部分。这些包括从相邻网络服务器下载源代码或透过点对点传输,只要编译代码是可用的,并且在哪里可以找到源代码的“清晰方向”。
除非作者明确赋予 FSF 著作权(除了作为GNU项目一部分的程序很少发生),否则FSF对GPL发布的作品不具有著作权。只有个人著作权持有人有权在发生许可协议时才起诉。
4.1. 允许的自由
GPL 许可的代码具有以下基本自由:
- 运行自由(自由运行软件,无任何限制)。
- 研究和修改自由(可以查看和修改源代码)。
- 再分发自由(可以自由共享软件)。
- 改进和发布自由(可以修改软件并发布新版本,但必须遵守 GPL)。
4.2. 关键限制
GPL下的软件可以用于所有目的,包括商业目的,甚至作为创建专有软件的工具,例如使用GPL许可的编译器时。分发GPL许可作品(如软件)的用户或公司可能会收取副本费用或无偿提供费用。这将GPL与共享软件许可协议区分开来,允许复制用于个人使用,但禁止商业发布,或著作权法禁止复制的专有许可。FSF认为自由软件不应该限制商业使用和发布(包括再发布)。GPL明确规定,GPL工作可能以任何价格出售。
在纯私人(或内部)使用 – 没有销售和没有发行 – 软件代码可能被修改和零件重复使用,而不需要发布源代码。对于销售或分销,整个源代码需要提供给最终用户,包括任何代码更改和添加 – 在这种情况下,应用copyleft来确保最终用户保留上面定义的自由。
然而,作为GPL许可操作系统(如Linux)下的应用程序运行的软件不需要根据GPL进行许可或者以源代码可用性分发 – 许可只依赖于使用的库和软件组件,而不是依赖于底层平台。例如,如果一个程序仅由自己的原始定制软件组成(software component),或者与其他软件组件的源代码组合在一起,则自己的定制软件组件不需要根据GPL许可,不需要使其代码可用;即使所使用的底层操作系统是根据GPL许可的,运行在其上的应用程序也不被视为派生作品。只有在程序中使用了GPLed部件(程序已经分发)的情况下,程序的所有其他源代码才能在相同的许可条款下提供。GNU较宽松公共许可协议(LGPL)被创建为具有比GPL更弱的Copyleft,因为它不需要在相同的许可条款下提供自己定制的源代码(不同于LGPLed部分)。
Copyleft
GPL许可版本的修改后作品的发行权不是无条件的。当有人分发GPL的作品又加上自己的修改时,分发整个作品的要求不能大于GPL中的要求。这个要求被称为Copyleft。它透过软件程序使用著作权获得法律权力。由于GPL的作品受著作权保护,被许可人无权重新分发,即使是以修改形式(除合理使用 )外,除了许可条款外, 如果希望行使通常受著作权法限制的权利,例如重新分配,只需遵守GPL的条款。相反,如果在不遵守GPL条款(例如保留源代码秘密)的情况下分发作品的副本,则原始作者可以根据著作权法提起诉讼。因此,“Copyleft使用著作权法来完成”与常见法律的设置目的相反,不是施加限制,而是“赋予其他人权利,以确保权利不能随之被剥夺的方式。”如果在Copyleft声明中找到任何法律缺陷,它也可以确保不给予无限的重新分发权限。
许多GPL程序的经销商将源代码与可执行文件捆绑在一起。满足Copyleft的替代方法是提供书面报价,以便在物理介质(如CD)上提供源代码。实际上,许多GPL的程序透过Internet进行分发,源代码透过FTP 或 HTTP提供。对于互联网分发,这符合许可协议。只有当一个人试图重新分发程序时,Copyleft才适用。只要不将修改后的软件分发给任何人,开发人员可以制作私有修改版本,无需泄露修改。请注意,Copyleft仅适用于软件,而不适用于其输出(除非该输出本身是程序的派生作品[注 3])。
例如,运行GPL内容管理系统(CMS)修改版的派生产品之公共门户网站不需将其更动分发给底层软件,因为其输出不是派生产品。
有人辩论,如果以代码混淆形式发布源代码是否违反GPL,例如在作者不太愿意提供源代码的情况下。普遍认为虽然这是不道德的,但无法认为是违法行为。这问题已得到澄清:当许可协议被更改为v2时,就需要提供源代码的“首选”版本。
许可协议与合同的区别
GPL被设计为许可协议 ,而不是契约。在一些普通法(Common Law)司法管辖区,许可协议和契约之间的法律区别是重要的:契约可以透过契约法执行,而许可协议是根据著作权法执行的。然而,这种区别对于契约和许可协议之间没有区别的许多司法管辖区(如民法系统)并不适用。
GPL原理很简单:在著作权法下,你不遵守GPL的条款和条件你就没有相对应的权利。而作品在没有GPL的情况下,著作权法作为默认条款发生效力,而不是作品进入公有领域。那些不接受GPL条款和条件的人根据著作权法没有许可复制或分发GPL许可软件或派生作品。然而,如果他们不重新分发GPL的程序,他们仍然可以按自己的喜好使用组织内的软件,使用该程序构建的工程(包括程序)不需要被该许可协议覆盖。
艾里逊·兰德尔认为,GPLv3作为许可协议对于读者来说是不必要的混乱,可以在保留相同的条件和法律效力的情况下进行简化。
许可条款总结:
- Copyleft(著佐权):
- 任何使用 GPL 代码的软件,都必须开源并遵守 GPL 许可。
- 不能将 GPL 代码改成闭源软件再分发。
- 禁止添加额外限制:
- 不能给 GPL 软件附加额外的法律限制,例如禁止某些用户使用。
- 源代码提供要求:
- 任何发布的 GPL 软件,必须提供完整的源代码,以便其他人修改和使用。
- 兼容性问题:
- GPL 代码不能与某些专有软件许可证兼容(如 Apple App Store 不允许 GPL 软件)。
- 但 GPL v3 允许与 Apache License 2.0 兼容。
5. GPL 与其他开源许可证的比较
许可证类型 | 是否必须开源 | 是否允许商业使用 | 是否允许闭源衍生 | 是否受 Copyleft 约束 |
---|---|---|---|---|
GPL | 是 | 是 | 否 | 是 |
LGPL | 是 | 是 | 部分允许 | 是(仅限于库) |
MIT | 是 | 是 | 是 | 否 |
Apache 2.0 | 是 | 是 | 是 | 否 |
BSD | 是 | 是 | 是 | 否 |
- GPL vs MIT/Apache:
- MIT、Apache 许可证 允许开发者修改后闭源,而 GPL 不允许。
- GPL vs LGPL:
- LGPL(Lesser GPL) 适用于库,允许非 GPL 软件动态链接使用。
- GPL vs BSD:
- BSD 许可证 更宽松,允许开发者自由闭源,适合商业软件。
6. GPL 许可证的影响
6.1. 促进开源软件发展
- Linux 内核 采用 GPLv2,成为世界上最流行的操作系统之一。
- GCC 编译器、GDB 调试器、Emacs 编辑器 等关键软件都使用 GPL。
- MySQL、WordPress、Blender、GIMP 等知名软件都基于 GPL。
6.2. 影响商业软件
6.3. Copyleft 争议
- 有利方面:确保软件始终开源,防止公司利用开源社区却不贡献代码。
- 不利方面:
- 限制了与专有软件的集成,降低了商业化灵活性。
- 企业可能选择 MIT 或 Apache 许可证 以避免 GPL 义务。
7. 适用 GPL 的软件示例
软件名称 | 许可证版本 | 主要用途 |
---|---|---|
Linux 内核 | GPLv2 | 操作系统内核 |
GCC(GNU 编译器集合) | GPLv3 | 编程语言编译器 |
GDB(GNU 调试器) | GPLv3 | 调试工具 |
WordPress | GPLv2 | 网站内容管理 |
MySQL | GPLv2 | 数据库管理 |
Blender | GPLv2 | 3D 建模 |
GIMP | GPLv3 | 图像编辑 |
8. 适合 GPL 许可证的使用场景
8.1. 适用场景
- 开源项目:鼓励共享和贡献代码,例如 GNU 项目、Linux 发行版。
- 教育与研究:可免费使用和修改,无需担心版权问题。
- 非商业软件:如个人项目、社区开发的软件。
8.2. 不适合的情况
- 商业闭源软件:
- 如果公司不希望公开代码,不应使用 GPL 代码,可以选择 MIT、Apache 等许可证。
- 与专有软件集成:
- 由于 GPL 的 Copyleft 限制,商业软件无法直接使用 GPL 代码(可考虑 LGPL)。
9. 著作权所有人
GPL文本是著作权所有的,且著作权人是自由软件基金会。但是,自由软件基金会没有在GPL下发行作品的著作权(除非作者指定自由软件基金会是著作权人)。通常认为,只有著作权人才有权对许可协议的违反进行起诉,但是那并不准确。法国的一个教育组织AFPA于2000年从Edu4购买课堂使用的电脑设备发现其使用GPL软件但并未附带源代码。
自由软件基金会允许人们使用以GPL为基础的其他许可协议,但不允许演绎的许可协议未经许可地使用GPL的前言。不过像这样的许可协议通常与GPL不兼容。
GNU计划创立的其他许可协议包括:GNU宽通用公共许可证和GNU自由文档许可证
10. GNU 通用公共许可证(GPL)总结
特点 | 说明 |
---|---|
许可证类型 | 开源(Copyleft) |
适用领域 | 开源软件、自由软件 |
是否必须开源 | 是(派生作品也必须开源) |
是否允许商业化 | 允许,但必须开源 |
是否允许闭源 | 否(必须遵循 GPL) |
适用软件 | Linux、GCC、MySQL、WordPress 等 |
主要影响 | 推动自由软件发展,限制商业闭源集成 |
GNU GPL 是开源软件界最具影响力的许可证之一,确保软件自由传播,同时通过 Copyleft 机制防止软件私有化。对于开发者而言,选择 GPL 许可证 意味着贡献开源社区,而选择 其他许可证(如 MIT、Apache) 则可以在开源与商业化之间取得平衡。