我的系统里有GPL软件,所以一定要开源吗?

在上一篇文章中,我们介绍了Linux等开源软件使用的开源许可协议GPL。GPL的一个需求是从GPL软件派生出来的软件。如果软件涉及分发,也必须遵守GPL,即需要开源,这就是所谓的GPL的“传染性”。例如,如果我修改了一个GPL程序,我需要开源我的程序。我从GPL中取了一段代码,我也需要开源我的程序。我用了一个GPL函数库,我也需要开源我的程序。在这个问题上有很多争议。应该怎样做才能满足GPL的要求?实际使用中有很多不确定性,有的是定论,有的是不定论。在本文中,我们只是拿几个问题进行简单的讨论。

库函数是程序运行时使用的API的集合,比如GNU C库(也称为glibc)。我们都知道库函数一般实现一些基本功能。使用库函数不仅可以提高程序的运行效率,还可以提高编程的质量。但是如果一个库使用GPL协议,那么你在你的程序中使用这个库,你的程序会被感染吗?在这个问题上有不同的观点。自由软件基金会(FSF)认为在这种情况下你的程序会被感染。只要链接到GPL库,你的整个程序在分发的时候必须是开源的,否则你就不能使用这个库。

但是,我们已经说过,库函数是基本的、底层的函数。如果使用GPL协议,会限制专利程序对这个库函数的使用,不利于自由软件的推广。于是我们提出了GNU Lesser General Public License(LGPL),主要用于函数库,其最大的特点是允许非自由软件链接到函数库而不被感染。

因此,在自由软件基金会看来,链接到GPL库的程序必须是开源的,而链接到LGPL库的程序不必是开源的。

在FSF的描述中,对软件聚合有单独的描述,主要是为了区分这些程序是独立的程序还是同一程序的不同部分。比如FSF认为可以从程序之间通信的机制来判断(exec,pipes,rpc,带地址空间的* *函数调用等。)和通信的语义(交换什么信息)。

如果你的程序全部打包在一个可执行文件里,那它一定是一个程序,整个程序必须符合GPL。但是如果程序之间的通信是基于管道、套接字和命令行参数的话,这些程序基本可以判断为独立的程序,不同的程序可以遵守不同的协议。如果程序之间交换的数据结构特别复杂,语义非常接近,一般可以认为是同一个程序。

然而,FSF也强调,这最终是一个法律问题,应由法官决定,以判断聚合程序是单独的还是同一个大程序。

Linux使用GPL协议,那么移植到Linux上的程序会被GPL感染吗?事实上,你的程序是否受到GPL的影响与你的底层操作系统无关。主要看我们上面说的第一项,你用的是哪种协议。如果你的程序根本不使用Linux上的库或者只使用LGPL库,它自然不会被感染。如果它使用GPL库,就会被GPL感染。据FSF介绍,GPL发布的库一般都是非常专业的库,这是其他平台上没有的。既然是Linux独占,那么开源就没有问题。

MySQL使用双协议授权,社区版使用GPLv2。以Java开发为例,程序与数据库的通信方式是socket。按照本文前面的说法,我们的Java程序不会被MySQL感染,也不必遵守GPL。但是有一个问题。我们用的驱动都是Oracle在GPL协议中提供的。我们确实把这些驱动放到了一个包里,所以我们的程序被这个驱动感染了。当你出售你的程序时,你必须同时把源代码给对方。

但在现实中,我们很少听说使用Mysql需要开源程序源代码。网上搜了一下,各种观点都有,大部分人基本都忽略了这个问题。我觉得认为开源最有说服力的理由是“Java提供了JDBC,MySQL驱动只是JDBC API的一个实现,可以替换,不是程序的必要部分”。

在这个问题上,网上还是有相当大的分歧。至今没有权威说法,也没有相应的判例。当然,如果你的程序不是用来发行的,完全没有必要纠结这个问题。归根结底,这是一个法律问题。

GPL的传染性保证了程序的开源和大多数程序员使用程序的自由,但也限制了一些专利程序使用GPL软件的自由。如果是在一些非常明确的情况下,就要按照GPL去打开相应的程序,但是如果是在一些模棱两可的情况下,要求打开源代码,那就让法官来判断。