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:
- Der Port wird wie üblich heruntergeladen, gepatcht, konfiguriert und gebaut. Bei diesen Schritten wurden keine Veränderungen vorgenommen.
-
Der Port wird in ein temporäres Verzeichnis
FAKE_DESTDIRinstalliert. Üblicherweise ist dies${WRKDIR}/fake-inst-${ARCH}.
Im Einzelnen passiert dabei folgendes:-
Das Verzeichnis
${FAKE_DESTDIR}/${PREFIX}wird erstellt und in diesem mittelsmtreeeine Verzeichnisstruktur erzeugt. - Das Target pre-fake wird aufgerufen. Dieses Target läuft in der normalen Umgebung ab.
-
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 sindPREFIX,LINUXBASE, undKMODDIR.PREFIXwird 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}/etcverwenden kann. Der echte Präfix wird in der VariablenTRUE_PREFIXgespeichert. - Das Target pre-su-install (falls vorhanden) wird in der Fake-Umgebung aufgerufen.
-
Standardmäßig wird das dist-Makefile (das Makefile in
WRKSRC) wie folgt aufgerufen (zur besseren Lesbarkeit vereinfacht dargestellt):make DESTDIR=${FAKE_DESTDIR} installFalls Ihr Port ein eigenes do-install Target besitzt, wird dieses stattdessen in der Fake-Umgebung aufgerufen. - Das Target post-install (falls vorhanden) wird in der Fake-Umgebung aufgerufen.
- Das Target post-fake wird in der normalen Umgebung aufgerufen.
-
Das Verzeichnis
-
Es wird ein Paket mit den Dateien in
FAKE_DESTDIRerstellt. - 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.