I would like to explicitly consider possibility of having either of
Fig.1:
- (1-A) A GPL application with dlopen-based plugin system.
- (1-B) LGPL plugin for application (1-A), that is linked to (1-C)
- (1-C) Proprietary non-GPL compatible library.
or
Fig.2:
- (2-A) A GPL application with dlopen-based plugin system.
- (2-B) LGPL plugin for application (2-A), that is making own dlopen-based plugin system for (2-C)
- (2-C) LGPL plugin for a plugin (2-B), that is linked to (2-D)
- (2-D) Proprietary non-GPL compatible library.
or
Fig.3:
- (3-A) A GPL application with dlopen-based plugin system.
- (3-B) LGPL plugin for application (3-A), that is making use of any network/IPC/shared memory communication to (3-C)
- (3-C) An application linked to (3-D) and receiving commands from (3-B) over communication channel.
- (3-D) Proprietary non-GPL compatible library.
as GPL-compatible way to allow GPL application utilize proprietary library.
As per https://www.gnu.org/licenses/gpl-faq.en.html#GPLPlugins quote
If the main program dynamically links plug-ins, and they make function calls to each other and share data structures, we believe they form a single combined program, which must be treated as an extension of both the main program and the plug-ins. If the main program dynamically links plug-ins, but the communication between them is limited to invoking the ‘main’ function of the plug-in with some options and waiting for it to return, that is a borderline case.
The Fig.1 apparently ruled out (not sure about Fig.2 completely though), however, where does make function calls to each other and share data structures
part ends anyway?
- (Q-1) Is Fig.2 the same as Fig.1 in this respect after all?
- (Q-2) Is IPC/shared memory page to purely exchange data counts? It lacks one of
function calls
ANDshare data structures
, only sharing data structures that may themselves be under LGPL, dual-licensed or public domain. - (Q-3) Is network-based RPC falls into same category as shared memory? What if RPC implementation (e.g. zeromq) can be configured to use shared memory as a transport as well as some TCP/UDP/Unix socket?