这是针对英文原版页面的中文翻译。

为了明确,请不要说 “使用 GNU GPL 2 授权”!

当我在 1989 年写成 GNU 通用公共许可证(GNU GPL)时,我就意识到它将来会有所更改:FSF 可能需要在未来的某一天发布一个新的版本。因此,我把那个版本的许可证叫做 “版本 1”,并且构建了一套允许用户将程序许可证升级到后来版本的框架。

当时并没有一个升级自由软件许可证的惯用方法;就我所知,以前也从来没有人这么做过。开发者使用一个不同的许可证发布软件的新版本,他们也可能使用一个不同的许可证作老版本软件的新发布,但是从来也没有为用户提供选择已发布程序要使用的新版许可证的系统方法。

我并不知道开发者对这个新事物的反应,所以我决定让每个开发者自己选择新版许可证的使用。这就意味着开发者可以按照 使用 GNU GPL 版本 1 授权,或者使用 GPL 版本 1 或任何以后版本 授权。开发者可以在每个源文件开头的 许可证声明 处陈述他们的选择。GPL 就是这么说的。

自由软件基金会敦促开发者选择 或任何以后版本,这样的话,用户就有自由按照 GNU GPL 版本 1、或版本 2(一旦有了版本 2)、或版本 3(一旦有了版本 3)来使用程序。而他们也有自由按照版本 4 使用程序,如果将来我们要发布版本 4。

从那时起,FSF 先后在 1991 年发布了 GNU GPL 版本 2,在 2007 年发布了版本 3。每个版本都为开发者提供了只使用一个许可证版本、或允许使用将来的许可证版本这两个选项。(GPL 3 还允许 “代理” 选项,它会指向一个特定的网页,该网页会指明程序所用许可证的将来版本。)

允许程序的许可证升级对使用不同版本 GPL 发布的程序保持兼容性非常重要。

如果缺失明确的兼容机制,那么两个不同的 copyleft 许可证将很难保持兼容。其原因就是每个许可证都必然会要求修改按照完全一样的许可证发布。后果就是,仅按照 GPLv2 发布的代码无法和仅按照 GPLv3 发布的程序合并。

GPL 各版本之间的兼容机制就是让程序可以按照遵循 “版本 N 或任何以后版本” 来发布。按照 GPL-2.0-或-以后版 发布的程序可以和按照 GPL-3.0-或-以后版 的代码合并,因为 “3 或以后版” 是 “2 或以后版” 的子集。

有些开发者说,“我目前只按照 GNU GPLv3 发布软件。当 GPLv4 发布时,如果我喜欢,我会把我的程序重新按照版本 4 发布。”如果你是唯一的作者,这个行得通,还得假定你健在、健康、联系得上、关注这件事。但是现今的版权会持续非常长的时间;如果没有大的变化,在美国,代码的版权在你死后 70 年都有效(墨西哥是 100 年)。如果你不在场,难道你已经让继承者考虑重新按照 GPL 版本 4 来发布你的代码?

但是在你的有生之年就会烦恼不断。如果我们在 10 年后发布了 GNU GPL 版本 4,假定那时已经有 50 个人为你的程序添加了代码,难道他们就应该仅仅是因为你选择按照仅使用 GPL-3.0 发布就必须继续这样?你也许可以批准你的原始程序使用 GPL 4,但是联系其他 50 个程序员来获取他们的许可是一个艰巨的工作。

避免这些麻烦的方法就是在许可证声明里批准使用将来的 GPL 版本。请在每个源文件的许可证声明里加上你所使用的 GPL 版本末尾的许可证声明。

由于我们这样处理许可证兼容性的问题,当人们告诉你一个程序是按照 “GNU GPLv2” 发布的,那么他们没有理清该程序的许可证状态。它是仅按照 GPL-2.0 发布,还是按照 GPL-2.0-或者-以后版 发布?你是否可以把它和按照 GPL-3.0-或者-以后版 发布的软件合并?

当诸如 GitHub 这样的网站邀请开发者选择按照 “GPL 3” 或者 “GPL 2” 等许可证来发布时,并没有提出许可证将来版本的问题,这就导致数以千计的开发者没有理清他们代码的许可证。如果请这些用户在 “仅” 和 “或者将来版” 之间选择,那么他们代码的许可证问题就会比较清晰。这也让大家有机会了解后一个选项如何避免了许可证未来的不兼容性。

象 “GPL-2.0” 或者 “GPL-3.0” 这样的许可证缩写也会导致混乱。人们或其他组织无法区分 “仅 2” 和 “2 或以后版” 之间的区别,他们就可能都写成 “GPL-2.0”,而实际上两者是应该明确区分的。

因此,如果你要使用 SPDX1 许可证缩减版,请使用以下:

  • GPL-2.0-only 或者 GPL-2.0-or-later
  • GPL-3.0-only 或者 GPL-3.0-or-later
  • LGPL-2.0-only 或者 LGPL-2.0-or-later
  • LGPL-2.1-only 或者 LGPL-2.1-or-later
  • LGPL-3.0-only 或者 LGPL-3.0-or-later
  • AGPL-3.0-only 或者 AGPL-3.0-or-later
  • GFDL-1.3-only 或者 GFDL-1.3-or-later

请不要使用过去的、模糊的许可证缩写,它们就要被废弃:

  • GPL-2.0
  • GPL-3.0
  • LGPL-2.0
  • LGPL-2.1
  • LGPL-3.0
  • AGPL-3.0
  • GFDL-1.3.

让开发者有权利选择 GPL 版本 “仅 1” 或者 GPL 版本 “1 或以后版” 在 1989 年看起来是必须的,但是它带来的复杂性比没有这个选项更多。同时,好多无条件给予用户选择升级到以后版的许可证被广泛的接受。它们包括 Mozilla 公共许可证和 Eclipse 公共许可证。它们每个版本都说明用户有自由选择以后版的该许可证,如果有的话。Creative Commons 许可证,即 CC BY-SA,允许用户在修改作品时升级许可证版本。

我们也许在将来的 GNU GPL 版本上也采取这样的策略。但这是将来要考虑的事情。

我们感谢 SPDX 决定为 GNU 许可证家族修改缩写,这样就使 “或者以后版” 和 “仅” 变得明确。SPDX 许可证列表下一版的缩写就会包含我们上面建议的缩写。而那些产生混淆的缩写,比如 “GPL-2.0” 会被废弃。我们恳求大家尽快把旧的缩写换成新的明确的许可证缩写。

通过明确使用 或者 任何以后版本,我们能够让社区明白这些不同,并且鼓励开发者清新地表述他们的决定。

译注

  1. SPDX,Software Package Data Exchange. 这是一个沟通软件组成(组件、许可证、版权和安全参考)的开放标准。