Lizenzkonformität Open-Source

YOCTO, IOT und die GPLv3

Yocto and GPL-v3 logo

IOT-Gerä­te bie­ten meist nur ein­ge­schränk­te Mög­lich­kei­ten, die dar­in ver­wen­de­te Soft­ware zu unter­su­chen oder gar zu ver­än­dern. YOCTO möch­te Soft­ware ganz spe­zi­fisch für IOT-Gerä­te zusam­men­stel­len. Die GPLv3 erfor­dert aber, dass man so lizen­zier­te Soft­ware erset­zen kön­nen muss. Wie also ste­hen sie wirk­lich zuein­an­der, YOCTO, IOT und die GPLv3?

[ de | en ]

Das “open source col­la­bo­ra­ti­on pro­ject” YOCTO bewirbt sich mit dem Slo­gan “it’s not an embedded Linux Dis­tri­bu­ti­on, it crea­tes a cus­tom one for you” (→ [7]): Man sam­melt und kom­pi­liert genau die Soft­ware, die man benö­tigt. So kann auch die aus­füh­ren­de IOT-Hard­ware ein­fach gehal­ten wer­den. Das ist der YOC­TO-Ansatz. Aller­dings: die tech­ni­sche Struk­tur der Gerä­te beein­flusst auch die Erfüll­bar­keit der Lizen­zen. Und da kann haa­rig wer­den!

Grund­sätz­lich weiß YOCTO um die Kom­ple­xi­tät der FOSS Com­pli­ance und unter­stützt die Pro­du­zen­ten schon wäh­rend des Kom­pi­la­ti­ons­pro­zes­ses. Es lis­tet z.B. alle Pake­te und alle in das Image ein­ge­flos­se­ne Lizen­zen auf (→ [8] 3.5). Außer­dem erlaubt es, auto­ma­ti­siert auch die Lizenz­tex­te in den Build zu inte­grie­ren (→ [8] 5.20.2). Und es bie­tet die Opti­on, auch den kor­re­spon­die­ren­den Quell­code als Paket zusam­men­zu­stel­len (→ [8] 5.20.1). Das sind wich­ti­ge Vor­ar­bei­ten. [Nur der Voll­stän­dig­keit hal­ber: die­se Vor­ar­bei­ten sind not­wen­dig, aber nicht hin­rei­chend. Aller­dings ist das jetzt nicht unser The­ma.]

Nun for­dert jede (A|L)GPLv lizen­zier­te Soft­ware mehr als nur die Mit­ga­be der Lizenz. Oder die Nen­nung der Copy­right-Owner und die Mit­ga­be des Dis­clai­mers und (auf Anfra­ge) die Über­sen­dung des Codes. Zusätz­lich muss dem Emp­fän­ger die Mög­lich­keit gege­ben wer­den, selbst eine ver­bes­ser­te oder ver­schlech­ter­te Ver­si­on auf der Hard­ware instal­lie­ren zu kön­nen. (→ [1,2,3] §3) Wenn das IOT-Gerät den Zugriff auf die inter­ne Plat­te erlaubt — sei es über ein USB-Inter­face oder sonst wie — ist das kein Pro­blem: der Nut­zer spei­chert sei­ne Ver­si­on der zu erset­zen­den Soft­ware dar­auf ab und legt den Link um. Bin­go. Was aber, wenn das Gerät kein sol­ches Inter­face hat? Oder wenn der Her­stel­ler nicht möch­te, dass sei­ne Kun­den die­ses Recht aus­üben, sei es, um gesetz­li­che Sicher­heits­stan­dards nicht zu unter­lau­fen, sei es um sei­nen Betreu­ungs­auf­wand gering zu hal­ten?

Dann — so die ein­fa­che Ant­wort — darf der Her­stel­ler kei­ne GPLv3, kei­ne LGPLv3 und kei­ne AGPLv3 lizen­zier­te Soft­ware in sei­nem Soft­ware­stack ver­wen­den. Denn über die Lizenz ver­spricht er, die Benut­zung oder Modi­fi­ka­ti­on der genutz­ten Soft­ware nicht zu beschrän­ken (→ [1] §3): Ent­we­der man erfüllt die Lizen­zen oder man ver­wen­det die Soft­ware nicht. So ein­fach und binär ist das ganz gene­rell mit der FOSS Com­pli­ance.

Glück­li­cher­wei­se unter­stützt YOCTO den Pro­dukt­ma­na­ger auch bei der Ein­hal­tung die­ser Maxi­me. Man kann im “reci­pe” zur Erzeu­gung des Images die Varia­ble INCOMPATIBLE_LICENSE mit Lizenz­iden­ti­fi­ka­to­ren bele­gen kann. (→ [9] Chap­ter 10) Der Kom­pi­la­ti­ons­vor­gang bricht dann ab, wenn Ent­wick­ler trotz­dem so lizen­sier­te Soft­ware ein­bau­en. Aller­dings hat das funk­tio­nel­le Neben­ef­fek­te: YOCTO warnt sogar mehr­fach, dass mit die­ser Opti­on nur sehr rudi­men­tä­re Images erzeugt wer­den kön­nen, (→ [9] pars pro toto: Chap­ter 10), eben weil so vie­le gute Soft­ware mitt­ler­wei­le unter der GNU Lizen­zen V3 ver­öf­fent­licht wer­den. Aber immer­hin, es geht in Gren­zen.

So weit, so gut. Lei­der stößt man damit auf ein Kern­pro­blem, das sich viel stär­ker aus­wirkt:

Eini­ge Stan­dard­bi­blio­the­ken — wie eben die libstdc++ — ste­hen in akzep­ta­bler Rei­fe nur noch unter den Bedin­gun­gen der GPLv3 zur Ver­fü­gung. Wenn über­haupt ist es nur sehr schwer mög­lich, sie zu erset­zen. Und so inte­griert YOCTO die libstdc++ — fast, als wol­le das Pro­jekt dies unter­strei­chen — in sein Image, auch wenn die Bele­gung der Varia­ble INCOMPATIBLE_LICENSE dies eigent­lich ver­hin­dern müss­te. Es scheint also, als wür­de YOCTO nicht-Lizenz-kon­for­me Images erzeu­gen. Betrach­tet man die Lage genau­er, erkennt man, dass YOCTO den­noch auf dem rich­ti­gen Weg ist:

Stan­dard­bi­blio­the­ken haben eine beson­de­re Stel­lung. Sie stel­len die Basis­funk­tio­nen bereit, über die ein Pro­gramm mit dem aus­füh­ren­den Ker­nel kom­mu­ni­ziert und über die es erst aus­führ­bar gemacht wird. Sie sind unum­geh­bar. Wird eine Stan­dard­bi­blio­thek unter einer Lizenz mit star­kem Copy­left (AGPL|GPL) ver­öf­fent­licht, ergibt sich so unmit­tel­bar, dass jede ‘höher lie­gen­de’ Biblio­thek und jedes Pro­gramm unter der­sel­ben Lizenz ver­öf­fent­lich wer­den müss­te. Die “GNU Stan­dard C++ Libra­ry v3” — kurz libstdc++ — ist eine sol­che Biblio­thek: Sie sieht sich als ein “ongo­ing pro­ject to imple­ment the ISO 14882” (→ [5] 1.1), sie ver­steht sich als Teil der “GNU com­pi­ler coll­ec­tion” (→ [5] 1.2) [4] und ist unter der GPLv3 lizen­siert (→ [4]).

Trotz­dem ver­neint die Libstdc++-FAQ die Fra­ge ganz klar, ob jedes Pro­gramm, das die libstdc++ nut­ze, unter die GPL fal­le: “No. The spe­cial excep­ti­on per­mits use of the libra­ry in pro­prie­ta­ry appli­ca­ti­ons. ” (→ [5] 2.2) Wie ist das mög­lich?

Die libstdc++ ist nicht nur unter der GPLv3 allein lizen­ziert: “The source code is dis­tri­bu­ted under the GNU Gene­ral Public Licen­se ver­si­on 3, with the addi­ti­on under sec­tion 7 of an excep­ti­on descri­bed in the ‘GCC Run­time Libra­ry Excep­ti­on, ver­si­on 3.1’ as fol­lows” (→ [4]). Und die­se GCC-Run­time Libra­ry Excep­ti­on sagt unter §1:

You have per­mis­si­on to pro­pa­ga­te a work of Tar­get Code for­med by com­bi­ning the Run­time Libra­ry with Inde­pen­dent Modu­les, even if such pro­pa­ga­ti­on would other­wi­se vio­la­te the terms of GPLv3, pro­vi­ded that all Tar­get Code was gene­ra­ted by Eli­gi­ble Com­pi­la­ti­on Pro­ces­ses. You may then con­vey such a com­bi­na­ti­on under terms of your choice, con­sis­tent with the licen­sing of the Inde­pen­dent Modu­les. (→ [4] §1)

Das klingt erst ein­mal kryp­tisch. Aber das Erra­ti­sche löst sich auf, wenn man auch die unter §0 hin­zu­ge­füg­ten Defi­ni­tio­nen berück­sich­tigt:

Der “Tar­get Code” bezeich­net jeden “[…] Out­put from any com­pi­ler for a real or vir­tu­al tar­get pro­ces­sor archi­tec­tu­re, in exe­cu­ta­ble form or sui­ta­ble for input to an assem­bler, loa­der, lin­ker and/or exe­cu­ti­on pha­se”. Die “Run­time Libra­ry” meint eben die Biblio­thek, für die Aus­nah­me gilt, hier also die libstdc++. Und “Inde­pen­dent Modu­les” sind die Datei­en, zu deren Aus­füh­rung in kom­pi­lier­ter Form die Run­time Libra­ry not­wen­dig ist. (→ [4] §0) Oder anders gesagt: Es sind die Datei­en, die Funk­ti­ons­auf­ru­fe in die libstdc++ ent­hal­ten, die deren Objekt und Metho­den nut­zen oder deren Inline-Funk­tio­nen über libstdc++ auf­ge­löst wer­den.

Also erlaubt uns der Ers­te der oben zitier­ten Sät­ze, sein kom­pi­lier­tes Pro­gramm auch unter Bedin­gun­gen zu ver­tei­len, die die GPLv3 ver­letz­ten. Vor­aus­ge­setzt wird nur, man hat sein gan­zes Pro­dukt über einen Eli­gi­ble Com­pi­la­ti­on Pro­cess gene­riert.

Ein Com­pi­la­ti­on Pro­cess wie­der­um ist jedes Ver­fah­ren, dass mensch­lich les­ba­ren Soft­ware­code oder JAVA-Byte-Code in den Tar­get Code über­führt. Und Elig­ble ist ein sol­cher Com­pi­la­ti­on Pro­cess dann und nur dann, “[…] if it is done using GCC, alo­ne or with other GPL-com­pa­ti­ble soft­ware, or if it is done wit­hout using any work based on GCC.” (→ [4]) Ent­we­der ganz GCC oder gar nicht — aber kein Misch­masch. Dar­um geht es.

Der ers­te Satz von §1 besagt also, dass man sei­ne gegen die libstdc++ kom­pi­lier­ten eige­nen Pro­gram­me auch dann ver­tei­len darf, wenn man durch die Art der Ver­tei­lung die GPLv3 ver­let­zen wür­de, vor­aus­ge­setzt, man hat alle Tei­le kom­plett mit dem GCC kom­pi­liert (oder kei­nes). Der ers­te Satz hebt also den star­ken Copy­left-Effekt unter bestimm­ten Bedin­gun­gen auf.

In unse­rem Kon­text von IoT-Gerä­ten ohne Inter­face zum Erset­zen der Soft­ware ist das aber nicht genug! Die Fra­ge bleibt ja, ob man die libstdc++ selbst unter Ver­let­zung der GPLv3 ver­trei­ben dürf­te. Um die­se Fra­ge zu beant­wor­ten, benö­ti­gen wir den 2. Satz von §1. Er besagt,

You may then [= unter den zuvor genann­ten Bedin­gun­gen] con­vey [= pro­pa­ga­te = dis­tri­bu­te] such a com­bi­na­ti­on under terms of your choice, con­sis­tent with the licen­sing of the Inde­pen­dent Modu­les. (→ [4] §1)

Die genann­te Kom­bi­na­ti­on kann dann nichts ande­res sein als die libstdc++ plus die gegen sie kom­pi­lier­ten unab­hän­gi­gen Modu­le und Pro­gram­me. Wir dür­fen das gan­ze Kon­glo­me­rat unter den Bedin­gun­gen ver­trei­ben, die zu den Bedin­gun­gen der unab­hän­gi­gen Modu­le pas­sen, also auch unter Ver­let­zung der GPLv3 — eben mit Rück­griff auf die Run­time Excep­ti­on selbst. Und das gilt mit­hin auch für die libstdc++.

Bin­go! Wirk­lich? Lei­der noch nicht ganz.

Im Urhe­ber­recht kommt es nicht nur dar­auf an, die wört­li­che Bedeu­tung eines Ver­trags­tex­tes, einer Lizenz zu ermit­teln. Statt­des­sen muss man auch berück­sich­ti­gen, was die Urhe­ber gemeint haben. Glück­li­cher­wei­se kann man das in die­sem Fall recht ein­fach ermit­teln:

Der Copy­right-Owner der GNU Com­pi­ler Coll­ec­tion ist die FSF. Und die hat in einer libstdc++-FAQ erläu­tert, wie sie die GCC Run­time Excep­ti­on im Kon­text der libstdc++ ver­stan­den haben möch­te (→ [5]) :

Einer­seits fragt die FSF ob “[…] any pro­gram which uses libstdc++ falls under the GPL?”. Und ant­wor­tet kurz und knapp: “No. The spe­cial excep­ti­on per­mits use of the libra­ry in pro­prie­ta­ry appli­ca­ti­ons.” (→ [5] 2.1) Auf der ande­ren Sei­te erläu­tert des FSF in die­ser FAQ, dass die libstdc++ ganz gene­rell nicht so ein­fach ersetzt wer­den kön­ne, wie es bei ande­ren Biblio­the­ken mög­lich sei, weil “much of the libra­ry con­sists of inline func­tions and tem­pla­tes, which are expan­ded insi­de the code that uses the libra­ry” and repla­cing the libra­ry would also requi­re to recom­pi­ling the using pro­gram. (→ [5] 2.3)

Also dür­fen wir auch aus der FAQ schlie­ßen, dass die FSF nicht nur den star­ken Copy­left­ef­fekt unter den genann­ten Bedin­gun­gen auf­ge­ho­ben sehen will, son­dern auch die Bedin­gung der Ersetz­bar­keit.

Unglück­li­cher­wei­se gibt es ein drit­tes Doku­ment, was die­sem Schluss zu wider­spre­chen scheint. Die libstdc++ ist nicht die ein­zi­ge Biblio­thek, die unter der Run­time Libra­ry Excep­ti­on ver­öf­fent­licht ist. Des­halb hat die FSF unter dem Titel “GCC Run­time Libra­ry Excep­ti­on Ratio­na­le and FAQ” auch eine gene­rel­le Ein­füh­rung ver­öf­fent­lich. (→ [6]) Die­ses Doku­ment erklärt zuerst, war­um man die­se Tech­nik der Aus­nah­me­re­ge­lun­gen ab der Ver­si­on 3 gene­rell ein­führt. Im 2. Abschnitt erläu­tert es, wie die Tech­nik funk­tio­niert. Und endet hier in dem jetzt bereits bekann­ten Satz “As long as you use an Eli­gi­ble Com­pi­la­ti­on Pro­cess, then you have per­mis­si­on to take the Tar­get Code that GCC gene­ra­tes and pro­pa­ga­te it ‘under terms of your choice.’” (→ [6])

Die Fra­ge, ob auch die libstdc++ unter den Aus­nah­me­be­din­gun­gen der Run­time Libra­ry Excep­ti­on ver­trie­ben wer­den darf, stellt der Text jedoch nicht. Im Kon­text einer Fra­ge nach der Nut­zung einer kom­plett pro­prie­tä­ren Kom­pi­ler­ket­te wird aller­dings her­aus­ge­ho­ben, dass man auch dann die Vor­tei­le der Run­time Excep­ti­on nut­zen kann, aller­dings müs­se man die libstdc++ selbst unter den Bedin­gun­gen der GPLv3 wei­ter­ge­ben.

Die­sen Zusatz könn­te man gene­rell sehen wol­len. Aller­dings gibt es zwei star­ke Grün­de, die das ver­bie­ten. Zum ers­ten ist er im spe­zi­fi­schen Kon­text die­ser Fra­ge ein­ge­fügt wor­den, also nicht gene­ra­li­siert wor­den. Und zum zwei­ten wür­de eine gene­rel­le Gel­tung die Run­time Excep­ti­on im durch die FSF dar­ge­stell­ten Sin­ne unter­lau­fen. Wenn auf der einen Sei­te der star­ke Copy­left­ef­fekt der GPLv3 für die eige­nen Pro­gram­me über die GCC Run­time Excep­ti­on auf­ge­ho­ben wer­den soll und wenn ande­rer­seits die Art der Biblio­thek trotz­dem die Offen­le­gung des nut­zen­den Codes erzwin­gen wür­de, damit man die Bedin­gung der Ersetz­bar­keit über­haupt erfül­len kann, dann hät­te die FSF etwas Selbst-wider­sprüch­li­ches im Sinn gehabt. Und davon ist nicht aus­zu­ge­hen.

So liegt die Sache nun­mehr klar auf dem Tisch:

YOCTO darf die libstdc++ Biblio­thek auch dann in sei­ne Images inte­grie­ren, wenn die Nut­zung von GPLv3 Soft­ware eigent­lich aus­ge­schlos­sen sein soll. Es ent­steht auch damit ein lizenz­kon­for­mes Image. Denn der star­ke Copy­left­ef­fekt ist durch die Run­time Excep­ti­on eben­so auf­ge­ho­ben, wie die For­de­rung nach der Ersetz­bar­keit der libstdc++.

Aller­dings gilt dies nur für die libstdc++. Auf ande­re Libra­ri­es kön­nen wir es nicht so ein­fach über­tra­gen. Die Mög­lich­keit, die libstdc++ auch — wie es in der GCC Run­time Libra­ry Excep­ti­on heißt — unter Ver­let­zung der GPLv3 zu ver­trei­ben, hängt von der Lizen­zie­rung der libstdcc unter der GPLv3 mit GCC Run­time Libra­ry Excep­ti­on eben­so ab, wie von ihrer imma­nen­ten Natur als c++-Bibliothek.


Und in welchem Zusammenhang …

… steht das mit einer sys­te­ma­ti­schen Erfül­lung von FOSS-Lizen­zen? Nun, dazu müs­sen wir halt auch poli­ti­sche Kon­no­ta­tio­nen beden­ken, kon­zep­tio­nel­le und kon­tex­tu­el­le Aspek­te ana­ly­sie­ren — ein­zeln oder gemein­sam auf Kon­fe­ren­zen. Wir müs­sen kon­kre­te Fäl­le und all­ge­mei­ne Neben­wir­kun­gen durch­den­ken, für Soft­ware, Bil­der oder Doku­men­te. Wir müs­sen Trends benen­nen und Leit­fä­den erstel­len. Vor­nehm­lich aber müs­sen wir die Auto­ma­ti­sie­rung der Lizenz­er­fül­lung vor­an­trei­ben, unser Lizenz­wis­sen frei zur Ver­fü­gung stel­len, es in klei­ne­re Tools gie­ßen und in grö­ße­re Sys­te­me ein­brin­gen: Denn FOSS lebt von der Frei­heit durch Lizenz­er­fül­lung, im Gro­ßen und im Klei­nen.


Im Übri­gen: Män­ner sind mit­ge­meint.

Ein Kommentar “YOCTO, IOT und die GPLv3”

  • Coo­ler Arti­kel!

    Hier ein paar Kom­men­ta­re

    1) “Nun for­dert jede (A|L)GPLv” — da fehlt die 3. Brad­ley Kuhn sagt, dass dies auch fuer die v2 gilt[1], aber da wuer­den wohl vie­le ande­re wider­spre­chen.

    2) “Dann – so die ein­fa­che Ant­wort – darf der Her­stel­ler kei­ne GPLv3, kei­ne LGPLv3 und kei­ne AGPLv3 lizen­zier­te Soft­ware in sei­nem Soft­ware­stack ver­wen­den.” Die Ant­wort ist oft nicht ganz so ein­fach, denn wenn das Sys­tem etwas kom­ple­xer wird, dann ist es schwer kei­ne xGPLv2 Soft­ware zu ver­wen­den. Ein “Work­around” wae­re, wenn man in das Manu­al rein­schreibt, dass man ein “spe­zi­el­les” Image auf Anfra­ge anbie­ten kann, wel­ches es dann erlaubt die xGPLv3 Kom­po­nen­ten durch ande­re Ver­sio­nen zu erset­zen — aller­dings fehlt in die­sem Image dann Eini­ges an pro­prie­tae­rem Code.

    3) “Der Kom­pi­la­ti­ons­vor­gang bricht dann ab, wenn Ent­wick­ler trotz­dem so lizen­sier­te Soft­ware ein­bau­en.” — Mit viel Glueck sucht das Build­sys­tem auch noch nach Alter­na­ti­ven, die ver­su­chen die
    xGPLv3 Kom­po­nen­te dur eine Kom­po­nen­te mit ande­rer Lizenz zu erset­zen.

    4) “in sein Image, auch wenn die Bele­gung der Varia­ble INCOMPATIBLE_LICENSE dies eigent­lich ver­hin­dern müss­te.” — wie die­se Lib, wie auch vie­le ande­re under xGPLx lizen­sier­te Libs spe­zi­el­le Lizenz “Excep­ti­ons” beinhal­tet, die z.B. “deri­va­te Work” und ande­re Din­ge wie­der aus der Lizenz raus­neh­men.

    5) “libstdc++” Man schafft es ueb­ri­gens nicht mit dem Yoc­to Pro­ject nur die libstdc++ in das rootfs auf­zu­neh­men ohne z.B. min­des­tens ein hello-world.cpp zu haben, dass gegen die lib linkt, d
    enn nur die libstdc++ wae­re nicht erlaubt.

    6) Was die std C lib auf­ruft (sys­tem calls) ist auch span­nend, denn dazu braucht man spe­zi­el­le Ker­nel hea­ders, die mit GPLv2 plus excep­ti­on lizen­siert sind.

    7) In einer aktu­el­len Yoc­to Ver­si­on (mome­n­atn in mas­ter) ab Honister/3.4 offi­zi­ell kann man ein SBOM (Soft­ware Bill of Mate­ri­al) gene­rie­ren, wel­ches mit dem ent­spre­chen­den Too­ling Open Source Soft­ware Com­pli­ance hof­fent­lich nich bes­ser machen wird (bis jetzt wer­den nur ein­zel­ne recipes und kein “com­bi­ned work” betrach­tet).

    8) Man­che Fir­men machen open source meta lay­ers und damit kann man ein Image bau­en und auf das Geraet laden, was auch inter­es­sant ist.

    [1] https://sfconservancy.org/blog/2021/jul/23/tivoization-and-the-gpl-right-to-install/


    Robert Ber­ger
    Embedded Soft­ware Evan­ge­list

    Relia­ble Embedded Sys­tems
    Con­sul­ting Trai­ning Engi­nee­ring
    URL: https://www.reliableembeddedsystems.com

    Sche­du­le a web mee­ting:
    https://calendly.com/reliableembeddedsystems/
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Antworten

Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To top