DE EN RU

RSS Feed Developer Blog

Das MPort Fake-System

Einführung

Das Fake-System ist eine große Veränderung der MPorts, wodurch viele der Ports instabil wurden. Diese Seite soll Entwicklern dabei helfen, Fehlermeldungen des Fake-Systems besser verstehen und beheben zu können.

Das Fake-System installiert einen Port in den folgenden Schritten:

  1. Der Port wird wie üblich heruntergeladen, gepatcht, konfiguriert und gebaut. Bei diesen Schritten wurden keine Veränderungen vorgenommen.
  2. Der Port wird in ein temporäres Verzeichnis FAKE_DESTDIR installiert. Üblicherweise ist dies ${WRKDIR}/fake-inst-${ARCH}.
    Im Einzelnen passiert dabei folgendes:
    1. Das Verzeichnis ${FAKE_DESTDIR}/${PREFIX} wird erstellt und in diesem mittels mtree eine Verzeichnisstruktur erzeugt.
    2. Das Target pre-fake wird aufgerufen. Dieses Target läuft in der normalen Umgebung ab.
    3. Das Target pre-install (falls vorhanden) wird aufgerufen. Dieses Target läuft nicht in einer normalen Umgebung ab. Stattdessen haben verschiedene Variablen ein vorangestelltes FAKE_DESTDIR. Die betroffenen Variablen sind PREFIX, LINUXBASE, und KMODDIR. PREFIX wird wiederum in vielen anderen Variablen mit eingebunden, wodurch im Endeffekt fast sämtliche während einer Installation verwendeten Variablen automatisch angepaßt werden. Dies bedeutet, das ein pre-install Target ohne weitere Änderungen etwas wie
      ${CP} myconfig ${PREFIX}/etc
      verwenden kann. Der echte Präfix wird in der Variablen TRUE_PREFIX gespeichert.
    4. Das Target pre-su-install (falls vorhanden) wird in der Fake-Umgebung aufgerufen.
    5. Standardmäßig wird das dist-Makefile (das Makefile in WRKSRC) wie folgt aufgerufen (zur besseren Lesbarkeit vereinfacht dargestellt):
      make DESTDIR=${FAKE_DESTDIR} install
      Falls Ihr Port ein eigenes do-install Target besitzt, wird dieses stattdessen in der Fake-Umgebung aufgerufen.
    6. Das Target post-install (falls vorhanden) wird in der Fake-Umgebung aufgerufen.
    7. Das Target post-fake wird in der normalen Umgebung aufgerufen.
  3. Es wird ein Paket mit den Dateien in FAKE_DESTDIR erstellt.
  4. Dieses Paket wird installiert.

Falls etwas schief geht

Wenn ein Fehler durch die Verwendung des Fake-Systems entsteht, dann tritt dieser als erstes auf, wenn die Manpages komprimiert werden sollen. Die Komprimierung der Manpages ist der erste Schritt, welcher eine korrekte Installation der Dateien in FAKE_DESTDIR erwartet. Es gibt mehrere Gründe, warum eine Fake-Installation scheitern kann. Die häufigsten Ursachen werden im folgenden näher erläutert.

Keine Unterstützung von DESTDIR

Die Variable DESTDIR wird von vielen Projekten für eine schrittweise Installation verwendet, unter anderem auch von uns. DESTDIR wird jedem Installationsverzeichnis vorangestellt. Die GNU Coding Standards page on DESTDIR stellt eine exzellente Referenz dar.

Viele aktuelle Projekte, welche die GNU build Tools verwenden (insbesondere solche die automake verwenden), unterstützen DESTDIR, ebenso Perl-, Ruby- und GNUstep-Module sowie andere Projekte. Unserer Erfahrung nach unterstützen ca. 75% unserer Ports DESTDIR.

Manchmal wird DESTDIR nicht unterstützt. Dann ist es nötig ein oder zwei Anpassungen vorzunehmen. Falls das Projekt klein ist könnte es schon ausreichen, das Makefile anzupassen. Zum Beispiel ist folgendes ironischerweise ein Patch für GNU patch:

 install:: all installdirs
-       $(INSTALL_PROGRAM) patch$(EXEEXT) $(bindir)/$(patch_name)$(EXEEXT)
-       -$(INSTALL_DATA) $(srcdir)/patch.man $(man1dir)/$(patch_name)$(man1ext)
+       $(INSTALL_PROGRAM) patch$(EXEEXT) ${DESTDIR}$(bindir)/$(patch_name)$(EXEEXT)
+       -$(INSTALL_DATA) $(srcdir)/patch.man ${DESTDIR}$(man1dir)/$(patch_name)$(man1ext)

 installdirs::
-       $(SHELL) $(srcdir)/mkinstalldirs $(bindir) $(man1dir)
+       $(SHELL) $(srcdir)/mkinstalldirs ${DESTDIR}$(bindir) ${DESTDIR}$(man1dir)

Ein schneller und schmutziger Hack würde darin bestehen, prefix im Makefile des Ports zu überschreiben:

FAKE_MAKEARGS+= prefix=${FAKE_DESTDIR}${PREFIX}

Dies funktioniert, solange Sie nicht configure mit einem zusätzlichen exec_prefix verwenden.

Manchmal hat DESTDIR auch einfach einen anderen Variablennamen, häfig z.B. INSTALL_ROOT. In so einem Fall müssen Sie einfach die Variable DESTDIRNAME entsprechend setzen.

Fehlerhafte Unterstützung von DESTDIR

Die Unterstützung von DESTDIR kann manchmal für den Autor trickreich sein. Selbst kleinste Fehler können unter Umständen zu defekten Ports führen. Solche Fehler zu beheben kann für den Port Maintainer eine echte Herausforderung sein, da sich dieser in den gesamten Installationsprozeß der Software einarbeiten muß.

Pakete, die automake verwenden, "funktionieren häufig einfach". Trotzdem vergessen Autoren häufig die Unterstützung von DESTDIR bei selbstgestrickten Targets. Jedes solcher Targets muß dann vom Maintainer angepaßt werden.

Falls Ihr Paket eine Binärdatei ausführen muß, um z.B. Dateien während der Installation zu erzeugen, könnte es nötig sein, diesen Schritt in ein pkg-install Skript auszulagern. Dies hängt davon ab, ob die betreffende Binärdatei nach einer endgültigen Installation aufgerufen werden muß. Es gibt hierbei keine festen Regeln. Als Port Maintainer müssen Sie entscheiden wie Sie das Problem beheben. Wenn Sie in Ihrem Pfad auch Binärdateien, welche über eine Fake-Installation installiert wurden, benötigen, so können Sie die Option bin wie folgt verwenden: FAKE_OPTS= bin

Manchmal erwartet ein Paket, dass es während der Installation gegen seine eigenen, gemeinsam genutzten, Bibliotheken linken kann. Dies wird fehlschlagen da der Linker nichts über FAKE_DESTDIR weiß und auch nicht sollte. Setzen Sie in diesem Fall die Option libs wie folgt: FAKE_OPTS= libs

Die meisten Ports werden es nicht erlauben, DESTDIR und PREFIX (man achte auf die Großschreibung) gleichzeitig zu überschreiben. Falls Ihr Paket dies doch tut, so müssen Sie die Option trueprefix setzen, da PREFIX normalerweise durch ${FAKE_DESTDIR}${PREFIX} ersetzt wird.

Binäre Ports

Binäre Ports stellen aufgrund Ihrer unüblichen Installationsvorgänge ein Problem dar. Sie sind häufig sehr speziell. Es könnte in solch einem Fall einfach sein, ein do-install Target zu erstellen, anstatt die mitgelieferten Installationsskripte anzupassen.

GNUstep Ports

Wir verwenden jetzt GNUstep-make 2.0, welcher eine sehr gute Unterstützung von DESTDIR bietet. GNUstep-make 2.0 erzeugt keine library_paths.openapp-Datei mehr. Diese Datei wurde die letzten Jahre über nicht mehr verwendet. Sie sollten daher sicherstellen das sie nicht mehr in Ihrer plist-Datei auftaucht.

Anmerkungen

Üblicherweise tendierten Port Makefiles dazu, die Arbeitsschritte von pkg_add zu reproduzieren, z.B. indem das pkg-install Skript ausgeführt oder pkg-message angezeigt wurde. Makefiles sollten dies nicht mehr tun.

Der größte Teil des Subsystems (z.B. das Linux-RPM- oder das Python-Subsystem) wurde so modifiziert, das er mit dem Fake-System funktioniert. Manche müssen noch angepaßt werden. Wenn Sie ein noch nicht angepaßtes Subsystem benötigen kontaktieren Sie bitte ctriv@ bevor Sie irgendwelche Anpassungen einchecken.

Wenn Ihr Linux-Port etwas mit den falschen Zugriffsrechten installiert sollten Sie sicherstellen, daß Sie die aktuellste Version von cpio verwenden.