从华为方舟编译器开源“乌龙”聊聊常见的开源协议

最近令国人“沸腾”的一件大事,那就是8月31日,华为在自己官网开源了方舟编译器。方舟编译器的厉害,大家都在华为开发者大会的PPT中早有耳闻,可惜只闻其名未见其人。

正所谓“PPT is cheap,show me the code”,所以华为方舟编译器的开源受到IT界前所未有的关注。在这举世瞩目的关键时刻,华为闹了一个小小的“乌龙”。

方舟编译器在开源3分钟之后就关闭了访问权限,原因是有人发现华为将zlib的版权声明信息修改成了华为的。下图来自知乎网友@默然的爆料。

因为zlib的第三方开源的软件,根据它使用的开源协议,使用和修改它是需要保留版权声明信息的。正因为这个小小的过失,让华为遭受了很多自媒体的过度解读,各种夹枪带棒冷嘲热讽,甚至恶意抹黑说华为公然抄袭等等。华为不得不在开源3分钟之后关闭了访问权限,修正排查之后再重新开源。

这是华为的一个小小的“过失”,但完全没有必要过度解读。因为一个已有的项目开源,肯定要先整理一下格式,包括编码规范、版权声明、代码注释等。几百个文件如果手工挨个修改效率太低,通常都会使用脚本或者工具进行批量处理统一修改。zlib.h头文件出问题的版权声明只是用工具批量整理时的失误,不存在主观“窃取”开源代码的意图,最直接的理由就是:zlib是放在第三方文件夹的,清清楚楚的告诉你这个是第三方代码,并且zlib的readme文件完整保留,对zlib的作者、版权交代的清清楚楚。

华为开源的“乌龙”虽然没有必要过度解读,但是也确实给了我们一个教训,在使用第三方开源代码时一定要关注它所用到的开源协议。当前业界使用的开源协议非常多,可以在(http://www.opensource.org/licenses/alphabetical )详细查看。不过,我们最常用到的开源协议主要有6种,GPL,LGPL,BSD,Apache,Mozilla,MIT,绝大部分开源项目都是使用的这6种,了解了这6种开源协议后,在公司上班使用开源代码时心里就有底了。

这里给大家分享一种著名的图(原著:乌克兰程序员Paul Bagwell,翻译:阮一峰)。

看完这张图后,相信大家对这6个开源协议的关键点都有了初步的了解。我再简单总结一下,如果你是在商业公司上班,最好不要使用GPL协议的开源代码,因为它具有“传染性”并强制开源,只要引入的某个模块是GPL的,它会一直扩展到最上层直到整个项目都强制GPL开源。相反,用BSD、Apache或者MIT的开源项目则一般不会有问题,只需要开源项目本身的安全性或者健壮性等其他需求满足公司要求即可。

另外还有一点想提醒一下大家,有声明协议和没声明协议的裸代码区别的非常大的。一般开源代码如果没声明协议默认为Copy right的,也就是版权保留。此种情况表明他人没有任何授权,不得复制分发修改使用等等。所以如果要开源自己的代码,最好也是选择这些著名的开源协议。

有心的同学肯定已经发现华为使用的开源协议并不是上面所说的6种之一,而是叫做Mulan PSL v1。这是什么协议呢?这是中国开源云联盟今年发布的一个中国自己的开源协议,中文名叫“木兰宽松许可证”,看名字中有“宽松”二字就知道这是一个很宽松的协议,对使用者限制非常少,甚至比Apache License 还更,Apache License 要求列出每个修改文件,其实很多项目做不到这一点,所以 MulanPSL 直接取消了这项要求。想要详细了解这个开源协议请查看协议官方链接“http://license.coscl.org.cn/MulanPSL/”。

最后,针对上面提到的六种开源许可协议做一个简单资料整理和介绍,供大家查阅。

1. BSD ( original BSD license 、 FreeBSD license 、 Original BSD license )

BSD 开源协议是一个给于使用者很大自由的协议。基本上使用者可以” 为所欲为”, 可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。但” 为所欲为” 的前提当你发布使用了BSD 协议的代码,或则以BSD 协议代码为基础做二次开发自己的产品时,需要满足三个条件:- 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD 协议。- 如果再发布的只是二进制类库/ 软件,则需要在类库/ 软件的文档和版权声明中包含原来代码中的BSD 协议。- 不可以用开源代码的作者/ 机构名字和原来产品的名字做市场推广。BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在BSD 代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

2. Apache Licence 2.0 ( Apache License, Version 2.0 、Apache License, Version 1.1 、Apache License, Version 1.0 )

Apache Licence 是著名的非盈利开源组织Apache 采用的协议。该协议和BSD 类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD 类似:- 需要给代码的用户一份Apache Licence- 如果你修改了代码,需要再被修改的文件中说明。- 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。- 如果再发布的产品中包含一个Notice 文件,则在Notice 文件中需要带有Apache Licence 。你可以在Notice 中增加自己的许可,但不可以表现为对Apache Licence 构成更改。Apache Licence 也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/ 销售。

3. GPL ( GNU General Public License )

我们很熟悉的Linux 就是采用了GPL 。GPL 协议和BSD, Apache Licence 等鼓励代码重用的许可很不一样。GPL不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux ,包括商业公司的linux 和linux 上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。GPL 协议的主要内容是只要在一个软件中使用(” 使用” 指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL 协议,既必须也是开源和免费。这就是所谓的” 传染性” 。GPL 协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。由于GPL 严格要求使用了GPL 类库的软件产品必须使用GPL 协议,对于使用GPL 协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/ 采用作为类库和二次开发的基础。

4. LGPL ( GNU Lesser General Public License )

LGPL 是GPL 的一个为主要为类库使用设计的开源协议。和GPL 要求任何使用/ 修改/ 衍生之GPL 类库的的软件必须采用GPL 协议不同。LGPL 允许商业软件通过类库引用(link) 方式使用LGPL 类库而不需要开源商业软件的代码。这使得采用LGPL 协议的开源代码可以被商业软件作为类库引用并 发布和销售。但是如果修改LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL 协议。因此LGPL 协议的开源 代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

5. MIT (The MIT License )

MIT 是和BSD 一样宽范的许可协议, 作者只想保留版权, 而无任何其他了限制. 也就是说, 你必须在你的发行版里包含原许可协议的声明, 无论你是以二进制发布的还是以源代码发布的.

6. MPL ( Mozilla Public License )

MPL协议允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者 。这种授权维护了商业软件的利益,它要求基于这种软件的修改无偿贡献版权给该软件。

发布了61 篇原创文章 · 获赞 64 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_41268683/article/details/100189709
今日推荐