[OpenBSD]

OpenBSD-Portierungsinformationen

Wichtige Unterschiede zu anderen BSD-Projekten

NetBSD benutzt den Ausdruck Ports für Architektur-abhängige Dinge. Ihre Ports-Struktur heißt stattdessen packages.

Zusätzliche Unterstützung

Die ,porting'-Infrastruktur enthält verschiedene Skripte, die das Erzeugen neuer Ports erleichtern:
build/resolve-lib
aufgerufen durch make lib-depends-check, um Abhängigkeiten von Shared Librarys zu überprüfen.
build/update-patches
aufgerufen durch make update-patches, das immer benutzt werden sollte, um die Patches neu zu erzeugen.
install/make-plist
aufgerufen durch make update-plist. Hier wird sich sich um die meisten kleinen Punkte gekümmert, mit denen man akkurate Packing-Listen erzeugt. OpenBSD-Packing-Listen unterscheiden sich deutlich von anderen BSDs, zum Teil auch, weil die Packagetools vollkommen neu geschrieben wurden.

Infrastruktur

OpenBSDs make unterstützt ${VAR:U} und ${VAR:L}, um den Wert einer Variablen in Groß- oder Kleinschreibung zu ändern. Dementsprechend sollte ,make test' auch unabhängig von Groß- und Kleinschreibung programmiert sein, also z. B.:

	.if ${NEED_XXX:L} == "yes"
	do stuff if yes
	.else
	do other stuff
	.endif

In der Theorie sollten alle Boolean-Variablen, die von bsd.port.mk erkannt werden, auch definiert sein, sodass Code wie defined(USE_FOO) nicht notwendig sein sollte. ${USE_FOO:L} != "no" müsste funktionieren.

Die Haupt-bsd.port.mk-Datei wurde deutlich verändert und schlanker gemacht. Insbesondere ist sie jetzt bereit für ,parallel-make'. Das scripts/{pre,do,post}-*-Feature ging während des Prozesses verloren. Um das Skript wieder auferstehen zu lassen, rufe es per Hand aus dem Makefile auf.

make sauber benutzen

Denk daran, wenn du make mit make VAR=value aufrufst, wird die Zuweisung jeden Wert überschreiben, den VAR vom Makefile erhalten kann. Also sind viele Makefile-Patches nicht mehr notwendig, es ist viel besser, die MAKE_FLAGS korrekt zu setzen, um den Wartungsaufwand zu verringern.

Quelltexte holen

Es gibt zwei Arten von Archiven: DISTFILES und PATCHFILES. OpenBSD behandelt sie in gleicher Art und Weise, und holt standardmäßig alles von den MASTER_SITES. Es gibt keine PATCH_SITES oder PATCH_SITES_SUBDIR.

Wenn nicht alle zu holenden Dateien von der selben Site kommen, erlaubt OpenBSD die erweiterten Dateinamen:0 bis Dateiname:9, in diesem Fall wird es die Dateien von den MASTER_SITES0 bis MASTER_SITES9 holen.

Manche Architekturen benötigen möglicherweise spezielle distfiles. In der Vergangenheit gab es Probleme damit, soweit das Spiegeln von distfiles betroffen war. OpenBSD unterstützt eine dritte Art von Dateien: SUPDISTFILES. Diese werden nur zum Erzeugen von Prüfsummen und beim Spiegeln verwendet. Denk dran, dass SUPDISTFILES möglicherweise mit DISTFILES oder PATCHFILES kollidieren. Zum Beispiel:

	DISTFILES=foo-1.0.tgz
	.if ${ARCH} == "i386"
	DISTFILES+=foo-i386.tgz
	.elif ${ARCHI} == "sparc"
	DISTFILES+=foo-sparc.tgz
	.endif
	SUPDISTFILES=foo-i386.tgz foo-sparc.tgz

Die WRKDIR-Infrastruktur

Wir wollen nicht, dass Ports NO_WRKDIR benutzen. Alle OpenBSD-Ports müssen ein ,work directory' haben. Die Details der Namensgebung sollten keine Angelegenheit des Portierers sein. Wenn du einen solchen Namen erfahren musst, frage einfach das Makefile: cd that_ports_dir && make show=WRKDIR wird die Vorstellung des Codes von seinem WRKDIR offenlegen.

Der Hauptgrund hinter dieser Annahme ist, dass OpenBSDs bsd.port.mk wie ein echtes Makefile agiert, allerdings mit ein paar Abhängigkeiten. Die fetch-Stufe hängt von den distfiles und patchfiles ab, alle anderen Stufen sind von echten Dateien im ,working directory' (Cookies) abhängig, sodass sie gar nicht ohne einem 'working directory' existieren können.

Wenn die DISTFILES-Extrahierung speziell ist, setze

EXTRACT_ONLY=

und mache die Extrahierung in post-extract.

WRKDIR
Das Port-,working directory', wo es seine eigenen Cookies unterbringt.
WRKDIST
Unterverzeichnis von WRKDIR, in dem der Port tatsächlich ausgepackt wird. Das ist auch das Basisverzeichnis für Patches. Andere BSDs haben zurzeit keine WRKDIST/WRKSRC-Aufteilung, sondern nur WRKSRC.
WRKSRC
Unterverzeichnis von WRKDIST, in dem der tatsächliche Source liegt.
WRKBUILD
Unterverzeichnis von WRKDIR, wo das Konfigurieren und Erzeugen (build) des Ports geschehen wird. Andere BSDs haben die WRKBUILD/WRKSRC-Aufteilung nicht. Programme, die (größtenteils) auf autoconf basieren, können für gewöhnlich SEPARATE_BUILD setzen, damit der Port in einem anderen Verzeichnis (WRKBUILD) als WRKSRC erzeugt wird.
WRKCONF
Unterverzeichnis von WRKDIR, in dem configure-Skripte ausgeführt werden sollten. Standardmäßig WRKBUILD, was in 99% der Fälle auch korrekt ist.
WRKINST
Verzeichnis, in das der Port installiert wird, bevor er gepackt wird (packaged) (siehe auch ,Faking ports' weiter unten).

Denk dran, dass es NO_WRKSUBDIR nicht mehr gibt: seine Funktionalität kann stattdessen mit dem Setzen von WRKDIST=$(WRKDIR) erreicht werden.

Faking ports

Einführung

Nachdem ein ,build' komplett ist, gehen andere BSDs dazu, über den Port zu installieren und erzeugen dann ein Package vom installierten Port. OpenBSD benutzt stattdessen ,faked installation'.

Vorteile

Wie man es macht

Die Ziele (targets), die make fake aufruft, sind die üblichen Installationsziele, mit einigen Ausnahmen:

Ports, die imake benutzen, sollten so wie sie sind funktionieren, da die imake-Fragmente konfiguriert sind, um DESTDIR zu benutzen. Genauso sollten Ports, die ein aktuelles GNU configure nutzen, keine Änderungen benötigen.

Eine weitere gute Technik ist ein ,late binding'-Trick: konfiguriere die Ports so, dass sie einen Präfix von $(DESTDIR)/usr/local benutzen, so dass das resultierende Makefile den Präfix

prefix=$(DESTDIR)/usr/local

hat. Wenn der Port erzeugt wird und DESTDIR nichts enthält, wird /usr/local benutzt, und die fake-Installation wird alles unter WRKINST/usr/local installieren (also für GNU configure benutze CONFIGURE_STYLE= gnu dest).

Fallen

Packaging-Tools

Die Package-Tools kennen schon ein paar Dateitypen und können viele Dinge automatisch durchführen: in den meisten Fällen werden @exec-Kommandos oder INSTALL-Skripte nicht gebraucht.
Beachte, dass alle unnötigen Skripte verbannt werden sollten, da das zu ,scalability'-Problemen führen kann. Es ist sehr viel einfacher, eine einzelne Package-Infrastruktur nach Fehlern zu überprüfen, als hunderte von Skripten zu modifizieren, damit sie mit neuen Problemen umgehen können.
Zum Beispiel:

Greife für weitere Details auf pkg_create(1) zurück. In den meisten Fällen wird make update-plist einen sehr guten Angleich für eine komplette Packing-Liste erstellen und wird des weiteren auch von Hand durchgenommene Verbesserungen von einer Version zur nächsten übernehmen.

,flavors'

Optionen wurden zu ,flavors' zusammengefasst, sodass das Erzeugen von Packages (package building) konsistent sein kann. Ein Port mit Optionen sollte mit FLAVORS eine Liste von all den Optionen setzen, die Sinn für diesen Port machen (also FLAVORS=foo bar zoinx); benutze ,FLAVOR' um zu testen, welche Optionen tatsächlich gesetzt wurden (also: FLAVOR=zoinx foo). bsd.port.mk bietet einige Unterstützung:

Zu überprüfen, ob ein gegebenes ,flavor' ausgewählt wurde, ist recht leicht:

.if ${FLAVOR:L:Mzoinx}
Es gibt eine Extra-Erweiterung namens MULTI_PACKAGES. Allgemein gesagt sind MULTI_PACKAGES und FLAVORS orthogonale Mechanismen, also ergänzend. Zusammen sorgen sie dafür, dass der OpenBSD-Ports-Tree kleiner ist als der von anderen BSDs, da sie dafür sorgen, dass ein einzelner Port viele verschiedene Packages erzeugen kann. bsd.port.mk(5) enthält ein ganzes Kapitel über FLAVORS und MULTI_PACKAGES.
$OpenBSD: diffs.html,v 1.25 2007/11/17 12:49:53 tobias Exp $