做了个 wrapper, 聊聊开源协议

开源还是闭源?这是个大问题.辛辛苦苦撸出来的代码,怎么用它自然你说了算.出于各人的喜好,大家尽可以选择一个合适的分享或者不分享的方式. 个人觉得这无关道德.

但是, 若是别人用 GPL License 分享了代码,而你却擅自修改 License, 把你的代码设置为闭源, 这就不仅是不道德的问题了, 理论上说, 你已经违反了你和原作者的协议, 是违法的.

在实际使用中, 对于各种传染协议, 尤其是 GPLv3 之类, 我们被要求自己的代码也使用同样的 License. 若有人打算闭源, 或者只是希望使用 MIT License, 那也是不能直接使用的.

但是,这是否表示 MIT License 的工程就完全不能引用GPL呢? 前人告诉我们, 有讨巧的方法. 基本原理是:

源码引用和静态引用都是违反版权的, 但是可以使用动态链接库的方法引用.

版权是持有人主诉才行, 换言之, 若我写了个闭源代码, 然后被人偷了, 但我不去追究, 那对方也不算违法.

所以我可以先写个 wrapper 调用 GPL License 的程序. 这个 wrapper 必须是遵循那个程序 License 的规定. 然后自己的主程序则只调用 wrapper, 不调用原来 GPL 的内容. 那么自己只侵犯了自己, 我们选择不追究自己就行…

比如有 GPL 代码被打包为 xxx.a, 头文件为 xxx.h, 你可以构造一个 xxx_wrapper.h 和 xxx_wrapper.so, xxx_wrapper.h 是独立的, 只在 xxx_wrapper.cc 文件中引用 xxx.h, 编译成 xxx_wrapper.so, 而你的工程只调用 xxx_wrapper.h 和 xxx_wrapper.so 两个文件.

这种情况下,你的 xxx_wrapper.h 和 xxx_wrapper.cc 都是必须遵循 GPL License 的, 而引用 xxx_wrapper.so 因为是动态链接, 所以理论上是合法而不受 GPL 约束.

实现这一点, 有一个问题, 就是 xxx_wrapper.h 不得 include xxx.h 这个头文件, 否则依然是调用了 xxx 这个工程的内容, 所以要自己声明个 struct 类型, 然后在 .cc 中具体定义这个 struct.

leveldb 是一个 MIT License 的工程, 对使用者几乎没有任何约束, 但我还是用它做个 wrapper, 实现一些基本的功能, 从版权上说, 其实并没有什么意义. 就当 helper 用吧.

头文件参考此处, 实现参考此处.

许可证是任何人之间的约定, 是点对点的, 你情我愿的关系 .我从不觉得一个开源的软件就天生高冷一点, 而闭源就格外的罪恶. 我最初做这个 leveldb 的 wrapper 的动机, 其实主要是感觉直接引用 leveldb 每次都需要弄上一堆检查, 所以弄了个简单的宏, 试图把复杂的配置往下埋一下. 但每个人对 leveldb 的使用都有一些自己的想法, 适用于我的一组宏对别人恐怕只是毫无意义的增加个栈, 所以仅介绍下 wrapper 另一个用途.

而且类似这种方法, 还可以构造一些基于 C 的 API, 也就是传说中的 C 调用 C++ 啦.

后记,

开源是一个很严肃, 很奉献的事情. 它是把你的努力放到共有领域, 以供他人使用. 你在放出的时候, 应该很明确知道你给公众授权了什么.

比如 GPL, 它主要是期望能够被非商业地使用, 要求使用者能够把自己的改进也反馈回来. 作为使用者, 你得到了代码, 你被限制把代码藏起来卖钱, 但是你在告诉所有人你的修改后, 可以卖 binary release. 比如我最喜欢的公司, RedHat, 他们卖的就是二进制和服务, 同时 CentOS 则是使用他们放出的代码再编译的结果.

比如 BSD, 它授予了用户使用权, 修改并商业化权, 但是禁止用户使用自己的名字做广告.

比如 Apache v2, 它授予了使用权, 商业修改, 并且显式授予用户专利使用

比如 MIT, 除了显式声明了专利使用, 基本一句话: 随便玩, 随便改, 只要别用坏了找我麻烦就好.

作为开发者, 在开源的时候, 你应该知道你做了什么, 而不是觉得 “妈呀, MIT 好流行的样子”, 结果真的被人甚至基本没怎么改动, 直接打个包放 apple store 了, 回头又觉得被人占了便宜. 大哥呀, 这本来就是你送别人的啊.

不用说更遥远的二三十年前的史前了, 哪怕是十几年前, 那个各种公司壁垒森严, 代码重重保护, 敝帚自珍的年代, 妈的每个公司自己搞一套弱逼实现, 还觉得自己特了不起, 简直无语. 正是那群心怀理想的奉献者, 抱着改变这个世界的想法, 用代码, 用法律, 生生创出一条路来. 而今的世界, 连某软那种老古董都开始学着和世界分享更多的实现了.

作为我们, 幸运的后来者, 我觉得很多时候还是请满怀敬意充分利用前人的轮子, 并且努力改变这个世界, 以为回报.