KnowHow über Lizenzen wie die GPL
Ich habe für mich die CLL entwickelt, weil ich Probleme mit meinem Urheberrecht und Public Domain sah. Des weiteren publiziere ich einiges unter der GPL. Immer mal wieder tauchen Leute auf, die meinen, sie hätten die GPL verstanden, dem ist aber eben oft nicht so. Deshalb mal hier meine Interpretation der GPL aus der Sicht von jemandem, der diese so ca. 15 Jahre für sich verwendet.Eigener Code der GPL Code referenziert ist in der Regel wieder GPL
www.heise.de/open/news/foren/go.shtml?read=1&msg_id=12980785&forum_id=119205
Zitat: Ein selbstgeschriebener Quelltext ist damit immer frei
lizenzierbar, egal, ob man Aufrufe auf GPL-Code drin hat oder nicht
(die Aufrufe sind nur Verweise, keine Kopien des aufgerufenen Codes).
Diese Aussage ist in der Regel ganz klar falsch und gilt nur für die Lesser bzw. Library GPL. Erklärung wie folgt:
Wenn mein Werk unter der GPL steht ist jeder Teil dieses Werkes unter der GPL. Einzelne isolierte Teile wie der Dateiname sind das zwar wohl nicht (weil trivial), aber die Namensgebung und die Optionen in den Funktionsaufrufen sind eindeutig mein Werk.
Wenn jemand also diese Funktionsaufrufe nutzt, also mein Werk referenziert, dann ist dies eindeutig eine Nutzung meines Werkes, somit baut das andere Werk auf meinem auf, womit es ein von meinem Werk abgeleitetes Werk darstellt. Das ist eine Tatsache an der man nicht deuteln kann.
Ist die Nutzung meines Werkes also nicht trivial, dann muss das andere Werk, das mein Werk nutzt das unter der GPL liegt, somit ebenfalls unter der GPL stehen. Die GPL erzwingt damit, dass das andere Werk bei Weitergabe (also Veröffentlichung) ebenfalls unter der GPL stehen muss.
Wie lässt sich das Problem lösen?
Die Lösung ist extrem einfach, aber erfordert etwas Vorarbeit. Der Trick ist, dass man eine LGPL-Zwischenschicht einbaut. Das funktioniert wie folgt:- Man schreibt ein Interface, das das GPL-Werk nutzt. Dieses Interface muss, da es ein abgeleitetes Werk ist, ebenfalls unter der GPL stehen.
- Dieses Interface nutzt "auf der anderen Seite" Include-Files die unter der LGPL stehen. Diese Include-Files dürfen dabei kein abgeleitetes Werk aus dem originalen GPL-Werk darstellen, d. h. nicht auf der ersten Arbeit basieren sondern von dieser vollständig unabhängig sein. Nur triviale Dinge dürfen somit identisch sein.
- Das kommerzielle (oder unter einer anderen Lizenz) stehende Werk nutzt dann nur und ausschließlich die unter der LGPL stehenden Includes und Aufrufe. Es darf somit entsprechend der Lizenzbestimmungen unter einer beliebigen Lizenz stehen.
- Der erste Schritt ist absolut zulässig. Das GPL-Werk wird durch ein anderes GPL-Werk ergänzt. Niemand kann dagegen etwas haben.
- Der zweite Schritt ist ganz normal. Ich würde behaupten: Millionen von GPL-Werken nutzen Include-Files von LGPL-Werken. Es ist also im ersten Schritt nicht verboten, diese Interfaces zu inkludieren und zu bedienen. Dass die Interfaces unter der LGPL keine abgeleiteten Werke sind, kann jeder sehen, indem er den Sourcecode betrachtet. Man muss eben nur sicherstellen, dass diese Unabhängigkeit auch jedermann aufgeht, d. h. dass in dem Interface auch wirklich eigene Arbeit drinnensteckt. Nur kopieren ist nicht. Wer also im Interface 1:1 die Funktionalität des originalen GPL-Codes zur Verfügung stellt macht eben etwas falsch.
- Der dritte Schritt ist ebenfalls ganz normal und wird täglich mehrere millionen Mal als korrekt angesehen. Kommerzielle Software darf gegen LGPL-Code gelinkt werden, hier geht es aber nur um LGPL-Includes!
Eigener Code der CLL Code referenziert ist unbelastet
Die CLL stellt klar, dass CLL-Code nicht unter einem Copyright liegt. Wenn jemand in seinem Code nicht darauf hinweist, dass das so ist, begeht er keinen direkten Fehler. Die CLL gilt nämlich implizit weiter. Er wird nur irgendwann wohl Argumentationsprobleme bekommen, weil er behauptet, das vollständige Copyright an seinem Werk zu besitzen, man ihm aber leicht nachweisen kann, dass er sich da irrt.Das Problem ist leicht zu beheben
Man nimmt in den Code einfach den Hinweis auf, dass sich das eigene Copyright nur auf die Codeteile bezieht, die sich nicht unter der CLL befinden. Das bedeutet also, man erhält kein Copyright auf die Funktionsnamen die man aufruft oder die Funktionsparameter, man erhält auch kein Copyright, wie man den CLL-Teil aufruft. Aber alle anderen Teile unterliegen weiterhin dem Copyright. Ist eigentlich sehr simpel. Und ich gehe davon aus, dass Richter den vorhandenen Hinweis auf die CLL nicht gegen den Copyrightbesitzer auslegen werden, sondern für ihn, da er sorgfältig gearbeitet hat. Hat der Copyrightbesitzer hingegen geschlampt und den CLL-Hinweis verworfen, muss man ihm mangelnde Sorgfalt vorwerfen, und somit steht ganz klar in Frage gestellt, ob die anderen Ausführungen vom Copyrightbesitzer nicht ebenso schlampig wären.GPL und CLL vertragen sich perfekt
Hier sieht man auch, warum es kein Problem ist, GPL-Code und CLL-Code zu mixen: Die GPL erstreckt sich nur auf das Copyright. Da die CLL das Copyright für ihre Teile ausschließt, wird die GPL nicht eingeschränkt, da sie per se niemals auf Teile wirken kann die nicht durch das Copyright geschützt sind. Somit hat man in obigem Fall, wenn man also GPL-Code über ein Interface "entschärfen" will, auch die Wahl, ob man statt der LGPL nicht gleich die CLL verwendet. Das geht aber halt nur für Deutsche.Gegen GPL gelinkter Code ist an sich immer GPL
www.heise.de/open/news/foren/go.shtml?read=1&msg_id=12980785&forum_id=119205
Zitat: Wenn ich meinen Quelltext übersetze und mit einer shared library
bzw. DLL binde, enthält das Ergebnis wieder nur Verweise auf
GPL-Code, nicht den GPL-Code selbst. Also darf ich das Compilat auch
unter einer eigenen Lizenz weitergeben.
Diese Aussage ist grob falsch, sie gilt nur und ausschließlich für LGPL! Dies ist eine der üblichen falschen Interpretationen der GPL. Denn das ist genau der Fall, wofür die GPL geschaffen wurde!
Das Linken gegen GPL-Code bedeutet ganz klar, dass das eigene Werk von der GPL abgeleitet wurde. Die einzige Ausnahme ist, wenn der Code auch ohne die gelinkte GPL Software lauffähig wäre.
Das ist aber ein weitgehend akademischer Fall. Wer sich fragt, wie ein "linken ohne Notwendigkeit" möglich ist, hier ein paar Beispiele:
- Ein Programm, dass die "exec()"-Funktion nutzt, ist in der Lage, eine GPL-Software aufzurufen und zu nutzen. Auch wenn das Programm auf dem GPL-Programm basiert, also z. B. der exec-Aufruf hart-codiert ist und das Programm fehlschlägt wenn der exec() nicht klappt, dann ist das Programm trotzdem kein abgeleitetes Werk. Der Grund ist derselbe wie immer: Das Programm nutzt hier ein Interface das selber als "trivial" angesehen werden kann. Der Programmname alleine ist ebenfalls als "trivial" anzusehen, da sich dieser leicht durch Umbenennen erzeugen lässt. Somit nutzt solch ein Programm keinerlei GPL-würdige Teile, so lange aber kein anderer Teil dem GPL-Schutz unterliegt. Da Input und Output von GPL-Programmen meistens (implizit!) keiner GPL unterliegen, unterliegt der Aufruf eines Programms ebenfalls nicht der GPL.
- Ein Programm, das in der Lage ist, ein Shared-Library nachzuladen und zu nutzen, ähnlich dem Class-Loader von Java. Der Unterschied zwischen Linken ist hier, dass dies zur Runtime geschieht, und das Programm eine sinnvolle Aktion ausführen kann (genauer: Sollte!) wenn das Laden fehlschlägt. Ein solches Programm könnte auch das andere Programm in den Speicher mappen (Memory Mapping) oder Debuggen, und unterliegt trotzdem nicht der GPL. Das ganze ist so lange klar, wie das Programm sinnvolle Dinge tun kann wenn es das GPL-Programm nicht laden kann. Aber das ganze ist auch (meist) dann klar, wenn es das GPL-Library anderweitig nutzt (und der Entwickler entsprechend vorsichtig war) oder erweitert! Denn hier wird wiederum ein ganz klarer und trivialer Mechanismus des Betriebssystems verwendet um das Library anzusprechen. Wichtig ist hier wiederum nur, dass das Programm, das das Library verwendet, nicht selber eine Ableitung des Libraries ist, weil es z. B. direkt von dem Library abhängt.
- Ein Programm, das eine Standard-API verwendet, darf diese auch dann weiterverwenden, wenn diese API von einem GPL-Programm bereitgestellt wird. Das Programm muss dann nicht der GPL unterliegen, nur weil es ein GPL-Programm gibt, das diese API implementiert.
- Wenn das Programm, das eine DLL nutzt, sich ohne die DLL und deren Header übersetzten und laden lässt, dann ist dieses Programm nicht von der DLL abhängig, auch dann nicht, wenn es die DLL zum Ablauf benötigt, d. h. der Ablauf abbricht wenn die DLL fehlt.
- Wer aber wieder meint, dass er der GPL so entkommen kann, indem er einfach Teile der DLL implizit im eigenen Code "kopiert", damit er diesen Code nicht includieren muss, dann irrt er gewaltig. Tatsache ist, das eigene Werk muss von dem anderen Werk (der DLL) also wirklich unabhängig sein, und nicht auf ihr basieren! Man darf also nur triviale Teile nutzen. Die Header sind nichttrivial, da diese sonst unter der LGPL stehen müssten. Die Header der GPL-Software "nachzuprogrammieren" (auch nur in kleinsten Teilen) ist ebenso eine Nutzung des fremden Werkes.
- DLLs stellen einige Informationen bereit, die man frei nutzen darf! Dazu gehört die Link-Information in der oft auch die Parameter die eine Funktion erwartet drinnenstehen. Aber das ist nicht notwendigerweise so. Man kann also einfach eine DLL nachladen und dann, hardcodiert, eine Funktion namens "dns_aufloesung" aufrufen mit den 3 notwendigen Parametern, und sich die notwendigen anderen Daten dann aus der Struktur rausfischen. Man darf das deshalb, weil das das typische Vorgehen eines jeden Debuggers ist. Und der Debugger muss nicht selber unter der GPL stehen wenn er GPL-Software debuggen kann.
Gegen CLL gelinkter Code ist unbelastet
Man hat hier zwar wieder das Problem, dass man nominell kein vollständiges Copyright am gegen CLL gelinkten Code erwerben kann, aber da durch das Linken der allergrößte Teil des CLL-Aspekts verloren geht, wird man in den allermeisten Fällen darauf verzichten können, darauf hinzuweisen, dass es einige Bits (um mehr handelt es sich nicht) bzw. einige verwendete Routinen nicht dem eigenen Copyright unterliegen. Da niemand in der Lage sein wird, das Teil am Ende wieder auseinanderzudividieren, ist es vollkommen in Ordnung, das Kompilat vollständig mit dem eigene Copyright zu versehen, da es aufgrund der monolithischen Einheit keinerlei Unterschied macht. (Hier aber wiederum: Wer denkt, so den CLL-Code nur zu wrappen, wird ebenso Schiffbruch erleiden, weil eben jemand den CLL-Teil "herausdividieren" könnte und sich jemand findet, der das dann auch tut!)GPL-Code darf kommerzielle Libraries nutzen
Es gibt Hardliner im GPL-Bereich, die sind der Meinung, Open Source, der ein kommerzielles Library voraussetzt, ist nicht GPL: www.heise.de/open/news/foren/go.shtml?read=1&msg_id=12979629&forum_id=119205
Zitat: nen tag später war die erweiterung aber wieder weg. auf neuer anfrage
hiess es, ich wuerda ja noch auf die (nicht mehr ausgelieferte) lib
refernzieren.
Ich bin der Meinung des gerade zitierten, dass nämlich solch eine "Erweiterung" sehr wohl den Statuten der GPL entspricht, und somit das Argument des "referenzierens" nicht richtig ist:
Es ist unerheblich, ob eine Library kommerziell ist oder nicht. Wichtig ist nur, ist eine Library mit dem GPL-Code kompatibel. Wäre obiger Fall nicht erlaubt, wäre die LGPL nicht zur GPL kompatibel! Ebenso wäre es unmöglich, GPL-Code auf closed-source-Hardware ablaufen zu lassen (die Opcodes vom Prozessor sind nicht GPL!).
Kompatibel bedeutet: Schränkt die Library den GPL-Code ein, wenn sie durch den GPL-Code verwendet wird, oder nicht. Wenn sie die GPL einschränkt, dann ist die Library nichtkompatibel.
Beispiel für nichtkompatible Lizenzen sind viele Lizenzen von Microsoft, in denen Microsoft sich die eigenen Nutzungsrechte vorbehält wenn man ihre Lizenz verwendet. Die Library ist dann inkompatibel, wenn sich diese Lizenz dann auf den GNU-Code erstrecken würde, und somit diese Lizenz nicht mehr aus dem Code gelassen werden kann.
Was die GPL-Hardliner in ihrer Argumentation unterschlagen ist nämlich, dass hier der Fall vollkommen anders liegt, nämlich dass das kommerzielle Library nicht den GPL-Code nutzt, sondern der GPL-Code das kommerzielle Library! Es ist hierbei sogar vollkommen unerheblich, ob der Hersteller des Libraries den GPL-Code zur Verfügung stellt oder nicht (es ist dann allerdings fraglich, ob das Library ohne den GPL-Code existieren kann. Da man initial, also als der Autor, auch multiple lizenzieren kann, ist das kein Widerspruch. Aber mit der Zeit werden die Verhältnisse kompliziert, nämlich wenn in den originalen Code Änderungen von Dritten einfließen, und diese dann nur unter der GPL standen. Aber das ist erst einmal unwichtig in der Betrachtung hier, denn es wird davon ausgegangen, dass das Library den GPL-Code nicht nutzt und niemals kennt).
Das muss erlaubt sein, anderenfalls ist der Sinn der gesamten GPL in Frage gestellt.
Die Weitergabe von kompiliertem Code der ein kommerzielles Library nutzt ist ebenfalls nicht ausgeschlossen
Ebenfalls scheint einigen Open-Source-Verfechtern ein Dorn im Auge zu sein, wenn jemand GPL-Code schreibt, der ein kommerzielles Library nutzt und dann den Code weitergibt. Denn laut diesen muss das Resultat ebenfalls der GPL unterliegen, man muss also an den Source-Code der Library heran können. Diese Aussage ist ebenso falsch wie das vorangegangene. Das Problem ist nicht das kommerzielle Library, sondern die Erlaubnis zur Weitergabe! Darum dreht sich die GPL, um nichts sonst! Es gibt kein Problem, sofern man das nicht-GPL-Library vollständig weitergeben kann. Wichtig ist hier aber, dass diese Weitergabe korrekt geschieht. D. h. es müssen folgende Punkte erfüllt sein:- Die Weitergabe des Binaries, das man bekommen hat, darf nicht eingeschränkt werden. Wichtig hierbei sind Exportbeschränkungen, die sich z. B. nur anteilig auf das Library beziehen und nicht auf den GPL-Anteil. Diese schränken in diesem Fall die GPL ein, somit darf man ein Resultat, das teilweise solchen Beschränkungen unterliegen könnte(!) nicht weitergeben, da dies ein GPL-Verstoß wäre.
- Man muss den Source-Code des GPL-Codes Verfügbar machen wie in der GPL gefordert. Das bedeutet nicht, dass man den Code des Libraries ebenfalls zur Verfügung stellen muss, da dieses ja nicht der GPL unterlag. Das schränkt die GPL auch in keinster Weise ein, denn ein "nicht-erweitern" ist nicht gleichbedeutend mit "einschränken".
- Man muss den Empfänger des Source-Code in die Lage versetzen eigene abgeleitete Varianten des GPL-Werkes herzustellen. Das bedeutet, man muss dafür sorgen, dass sich das Library auch linken lässt und alle notwendigen Teile bereitgestellt werden, die die Verbindung des Libraries und des GPL-Code bereitstellen (diese Teile müssen nur frei weitergebbar sein, aber nicht notwendigerweise Open Source sein).
Auf den konkreten Fall der oben zitiert wurde bezogen:
Die Mambo-Entwickler haben verweigert, das Library auf ihrem Server zu hosten. Das dürfen sie tun, da sie nur Sachen hosten wollen, die der GPL vollständig unterliegen (man kommt sonst zu leicht in Teufels Küche).
Die Mambo-Entwickler haben verweigert, das GPL-Code-Snippet zu hosten, weil ein Closed-Source-Library referenziert wurde. Das dürfen sie zwar auch tun, aber ich halte die Begründung für übertrieben, denn hier handelte es sich nur um Code, nicht um Binaries. Der Code ist vollständig GPL und es gibt keinerlei Einschränkung bei der Weitergabe von nur diesem Code! (Wer ihn compiliert und weitergibt hat dann das Problem, aber das Mambo-Projekt tat so etwas ja nicht.)
Ganz klar hätten die Mambo-Entwickler sich verweigern müssen, wenn neben dem GPL-Source-Code noch ein Binary gewesen wäre, das das Library benötigt, denn dann hätte man das vollständige Library ebenfalls vorhalten müssen, evtl. sogar mit Entwicklungsoberfläche. (Dies ist übrigens eines der typischen Probleme bei Debian, weshalb ein Paket nicht auf die Server wandern kann, weil es ein weiteres Paket benötigt, das nicht von Debian entsprechend der Debian-Statuten vorgehalten werden kann.) Dieser Fall lag aber nicht vor.
Fazit
Das mit der GPL ist eigentlich sehr einfach. Bei der GPL geht es nicht um Open Source, das vergessen die meisten. Bei der GPL geht es um die Nutzbarkeit einer Software. Dies wird gelöst indem man die GPL nicht einschränken darf. Alles, was die GPL einschränkt, ist somit unzulässig. Alles was die GPL nicht berührt ist zulässig. Das Linken mit Fremdcode (der nicht auf GPL basiert) ist per se zulässig, da es die GPL nicht berührt (wohl aber vielleicht die Lizenz des Fremdcode) so lange die andere Lizenz die GPL nicht einschränkt (was außer bei Microsoft neuere Lizenzen nur noch sehr selten tun). Die Weitergabe des Resultats schränkt die GPL nur dann ein, wenn der Empfänger dann nicht in der Lage wäre, eigene abgeleitete Werke zu erstellen. Ist das aber weiterhin möglich (weil der Fremdcode als Binary weitergegeben und weiterhin gelinkt werden kann), dann ist das keine Einschränkung der GPL. Meistens erlaubt der Fremdcode aber keine Weitergabe (oft muss man ihn z. B. von der Webseite runterladen). In diesem Fall wäre die Weitergabe des gelinkten Codes nicht erlaubt! Das betrifft aber nur das Compilat, nicht den Sourcecode an sich. Denn dieser ist von solch einer Regelung vollständig unbelastet. Es mag zwar unschön sein, dass man den Code erhält und nicht linken kann, weil der Fremdcode nicht mehr erhältlich ist. Aber man wäre nur dann eingeschränkt, wenn man dadurch kein abgeleitetes Werk erstellen könnte wie man es bereits im Einsatz hat. Hat man noch nichts im Einsatz, ist das somit kein GPL-Verstoß. Der Verstoß geschieht auch nur bei der Weitergabe. Wenn ich also ein abgeleitetes Werk erstelle muss ich sicherstellen, dass der Empfänger das Werk ebenso wie ich herstellen könnte und davon weitere Werke ableiten kann. Bei Sourcecode per se, also reinem Text, ist das immer gewährleistet. Ob Sourcecode etwas sinnvolles tut, das entscheidet die GPL nicht! Genausowenig wie die GPL entscheidet, ob das Compilat etwas sinnvolles tut oder nicht. Aber hat man ein Compilat das unter der GPL steht, muss man die Freiheit haben, es abzuändern, und dazu ist nun einmal zwingend notwendig, dass man den Sourcecode hat, aber eben auch alle weiteren Teile die notwendig sind, daraus das Compilat herzustellen.
Letzteres ist übrigens der Grund, warum ich, als Autor, keine Binaries herstelle. Obwohl ich, als der Autor, gar nicht an diese Bedingung gebunden bin, d. h. vollständig von den Beschränkungen der GPL befreit bin!
Autoren (die das vollständige Copyright halten, ohne Einschränkung) selber unterliegen der GPL nämlich nicht. Die GPL greift erst, wenn derjenige, der vom Autor die Software erhalten hat, diese an Dritte weitergibt!