„Portable Software“

Meine Laune gegenueber diversen Open-Source-Programmierern verschlechtert sich irgendwie taeglich in letzter Zeit. Wer auf seiner toll herausgeputzten SF-Webseite was von „written to be as portable as possible“ faselt, sollte nicht auf der anderen Seite die Ansicht vertreten „es compiliert auf Linux und Cygwin, das ist doch Portabilitaet pur“. Leider greift diese Einstellung in letzter Zeit immer mehr um sich – muss wohl am steigenden Marktanteil von Linux liegen.

Meines Erachtens nach bedeutet Portabilitaet mehr als dass das Programm auf verschiedenen Linux-Distros baubar ist.. erst recht wenn man sein Projekt in der Unix/Posix-Kategorie eintraegt. Daher hier mal ein paar der mir am haeufigsten begegnenden Problempunkte (berufsbedingt natuerlich aus Solaris-Sicht):

  • Die Linux-/bin/sh ist keine Bourne-sh sondern eine bash. Wenn ihr schon irgendwelche Zusatzroutinen in die (eigentlich hochportablen) configure-Scripte oder autoconf-Vorlagen etc einbaut, oder selbstgebaute Build-Scripts verwendet, dann probiert das ganze doch mal mit ner echten Bourne-sh aus. Unter anderem so wichtige Konstrukte wie `test` haben in der bash unkompatibel verbogene Parameter (dazu-)bekommen, die auf Nicht-Linuxen Fehler produzieren und teilweise kacke zu debuggen sind.
  • Ihr seid nicht der alleinseligmachende Softwareanbieter. Es ist ja ein toller Service, wenn ihr ein paar Bibliotheken von denen euer Programm abhaengt im Sourcenpaket mitliefert – aber verlangt bitte nicht, dass man unbedingt eure Version benutzt. Buildscripts die z.B. sowas verbreitetes wie die zlib ausschliesslich in ihrem Sourcetree erwarten, sind broken by design. Es gibt genug portable Methoden, die Existenz von Bibliotheken zu pruefen – sei es durch Compilieren eines Dreizeilers der diese einbindet, oder durch Durchsuchen der durch LD_LIBRARY_PATH referenzierten Verzeichnisse. Alternativ kann man auch mal nach gelaeufigen lib-Pfaden googeln.. gibt genug Programmierguides die diese auflisten. Tip fuer Solaris: /opt/csw/lib, /opt/sfw/lib, /usr/sfw/lib sind immer einen Blick wert – hier installieren die sehr beliebten Paketanbieter sunfreeware.com und blastwave.org sowie die Solaris Companion-CDs massenweise OSS-Bibliotheken.
  • Wenn ihr fremde Bibliotheken mitliefert (siehe Punkt 2), prueft bitte doppelt genau ob diese auf dem Zielsystem schon vorhanden sind. Nichts ist nerviger als wenn Programme ploetzlich nicht mehr laufen, nur weil ein wohlmeinender Entwickler beim letzten make install ohne Rueckfrage Bibliotheken durch aeltere Versionen ersetzt hat. Diese Unsitte ueberlasst ihr bitte den Windows-Programmierern, die sind sowas gewoehnt😉
  • Versucht bitte, die Optionen die euer Konsolenprogramm akzeptiert, einigermassen an gaengige Standards anzupassen. Dies heisst, -x fuer Kurzoptionen, –bla-fasel fuer Langoptionen. Mit Konstrukten der Art –CamelCaseOption=Wert steigert ihr nur die Chance, dass der Anwender sich verschreibt. getopt ist hierbei eine recht hilfreiche Bibliothek – man muss das Rad nicht case-sensitiv neu erfinden.
  • Bedenkt, dass OpenSource bedeutet, dass andere Leute euren Code lesen koennen, bzw. unter Umstaenden zwecks Korrekturen lesen muessen. Macht es ihnen nicht unnoetig schwer, und pflegt einen einigermassen lesbaren Programmierstil. Einrueckungen helfen viel. Kommentare auch. Sprechende Funktionsnamen noch viel mehr.
  • (bezugnehmend auf den letzten Punkt) Bitte haltet Texte und Funktionsnamen schmerzfrei lesbar. Englisch ist so eine tolle Sprache.. wieso mir dann augenkrebserzeugende Sachen wie „This Function Will Read An Input From The Command Line“ in einer Read_Input_Value_From_User_Function begegnen muessen, ist mir unverstaendlich. Entweder CamelCase _oder_ Unterstriche machen das ganze viel lesbarer – und im Englischen darf eh fast alles klein geschrieben werden. Binary-Namen sollten unbedingt komplett klein geschrieben und moeglichst kurz sein. Ein /usr/bin/megatollesallzweckprogramm nervt spaetestens beim naechsten ls.
  • Baut eure Source-Tarballs bitte inklusive dem euren Kram beinhaltenden Verzeichnis. Es nervt ziemlich, wenn ein tar xivf mir eure Sourcefiles quer ueber mein /home verteilt.
  • Kreuzt bei Sourceforge bitte nur die OS-Kategorien an, mit denen ihr eure Programm getestet habt (ggf. unter Zuhilfenahme der SF Compile Farm). „Wird schon laufen“ ist keine Grundlage.
  • Bedenkt, dass Linux teilweise Funktionen in anderen Bibliotheken untergebracht hat als andere Unices, und dass einige Funktionen garnicht vorhanden sind. Am haeufigsten begegnete Probleme: Linux hat fabsf, fpowf und andere float-to-float-Rechenfunktionen, Solaris bis 8 und HP-UX bis heute haben diese nicht. Hier kann man problemlos die Versionen ohne -f verwenden, diese liefern halt einen double  zurueck, was kein Verlust ist. Linux hat diverse Netzwerkfunktionen wie inet_aton/ntoa, gethostbyname etc in der libc, bei den meisten „echten“ Unices sind diese in Bibliotheken ausgelagert, die dem gcc mit -lnsl -lresolv bekanntgemacht werden muessen. Aehnliches gilt fuer „seltenere“ Rechenfunktionen und die mathlib -lm

Wer auch nur ein paar dieser Vorschlaege beherzigt und seinen Code mal auf derartige Schwachstellen durchsucht, wird bald einen grossen Schritt von „Laeuft auf allen Linuxen“ hin zu „Laeuft auf fast allem Unix-artigen“ machen koennen. Auch wenn ihr’s nicht fuer moeglich haltet, es finden die ungewoehnlichsten Programme manchmal den Weg auf meine Server. Unterschaetzt den Umfang eurer Zielgruppe nicht!

Veröffentlicht in Job. 2 Comments »

2 Antworten to “„Portable Software“”

  1. Zarquod Says:

    Also, zumindest laut man-page ist fabsf() kein Linuxismus:

    CONFORMING TO
    The fabs() function conforms to SVr4, POSIX.1-2001, 4.3BSD, C89. The other functions are from C99.

    Dass man von Linux ausgehend schwer portabel programmieren kann, hab ich im Studium irgendwann auch mal schmerzlich bemerkt, IIRC. Unter Linux hat man irgendwie die Auswahl aus sämtlichen Welten; wenn man das unbedacht ausnutzt, hat man beim Portieren dann die A-Karte.

  2. Woo Says:

    Danke fuer die Erinnerung.. den C99-Hinweis wollte ich eigentlich noch irgendwo unterbringen, aber dann war ich so im Rant-Fluss..😉
    Jedenfalls gibts dieses ganze Funktionspaket nur auf Linux, bzw bei den „echten“ Unixen erst in sehr neuen Versionen. Dies sollte man zumindest wissen wenn man von seinem Projekt behauptet, es waere hochportabel.


Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ă„ndern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ă„ndern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ă„ndern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ă„ndern )

Verbinde mit %s

%d Bloggern gefÀllt das: