NetBSD benutzt den Ausdruck Ports für Architektur-abhängige Dinge. Ihre Ports-Struktur heißt stattdessen packages.
make lib-depends-check, um
Abhängigkeiten von Shared Librarys zu überprüfen.
make update-patches, das immer
benutzt werden sollte, um die Patches neu zu
erzeugen.
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.
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.
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.
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
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.
EXTRACT_ONLY=
und mache die Extrahierung in post-extract.
Denk dran, dass es NO_WRKSUBDIR nicht mehr gibt: seine Funktionalität kann stattdessen mit dem Setzen von WRKDIST=$(WRKDIR) erreicht werden.
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'.
PREFIX installiert zu werden,
normalerweise /usr/local).
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).
bsd.port.mk hier alle Probleme bemerken.
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:
@exec ldconfig wird nicht benötigt, da Shared
Librarys mit @lib libfoo.so.1.0 kommentiert werden
und ldconfig nur ausgeführt wird, wenn es benötigt wird,
und dann auch chroot dankbar verarbeiten wird.@exec install-info wird nicht benötigt, da
Dokumentationsdateien mit @info file.info kommentiert
werden. Dies handhabt auch mehrere Info-Dateien und entfernt die
Notwendigkeit von makeinfo --no-split.@font und
@fontdir automatisch eingebunden.@newuser und
@newgroup verarbeitet, statt über Installationsskripte.
Sie werden auch früh genug angelegt, sodass weitere
Package-Extrahierung sie nutzen kann.@sample statt über
Installationsskripte verarbeitet.
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.
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.