OCTAVE_VERSION= 2.0.13 PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
Kapitel 7. Fortgeschrittene pkg-plist-Methoden
This translation may be out of date. To help with the translations please access the FreeBSD translations instance.
Table of Contents
7.1. Änderungen an pkg-plist mit Hilfe von make-Variablen
Einige Ports, insbesondere die p5-
-Ports, müssen, abhängig von ihren Konfigurationsoptionen (oder im Falle der p5-Ports von der perl
-Version), die pkg-plist verändern. Um dies zu vereinfachen, werden für jeden Eintrag in pkg-plist die Variablen %%OSREL%%
, %%PERL_VER%%
und %%PERL_VERSION%%
durch die jeweiligen Werte ersetzt. Der Wert von %%OSREL%%
ist die Revisionsnummer des Betriebssystems (z.B. 4.9
). %%PERL_VERSION%%
und %%PERL_VER%%
geben die vollständige Versionsnummer von perl
(z.B. 5.8.9
) an. Weitere, die Dokumentationsdateien des Ports betreffende %%VARS%%
, werden im entsprechenden Abschnitt erläutert.
Falls Sie weitere Ersetzungen von Variablen durchführen müssen, können Sie in der Variable PLIST_SUB
eine Liste von VAR=VALUE
-Paaren angeben, wobei in der pkg-plist%%VAR%%
durch VALUE ersetzt wird.
Wenn Sie z.B. einen Port haben, der viele Dateien in ein versionsspezifisches Unterverzeichnis installiert, dann können Sie etwas wie
in das Makefile schreiben und %%OCTAVE_VERSION%%
verwenden, unabhängig davon, wo die Variable in pkg-plist verwendet wird. In diesem Fall müssen Sie bei einem Upgrade des Ports nicht dutzende (oder manchmal sogar hunderte) Zeilen in pkg-plist anpassen.
Falls Ihr Port in Abhängigkeit von den ausgewählten Optionen Dateien installiert, ist es üblich, den entsprechenden Zeilen in der pkg-plist eine Zeichenfolge %%TAG%%
voranzustellen, wobei der Platzhalter TAG
der Variablen PLIST_SUB
im Makefile bei gleichzeitiger Zuweisung des speziellen Werts @comment
hinzugefügt wird, der die Paket-Werkzeuge die Zeile ignorieren lässt:
.if defined(WITH_X11) PLIST_SUB+= X11="" .else PLIST_SUB+= X11="@comment " .endif
und in der pkg-plist:
%%X11%%bin/foo-gui
Diese Ersetzung (ebenso wie das Hinzufügen weiterer Manualpages) wird zwischen den pre-install
- und do-install
-Targets ausgeführt, indem aus PLIST gelesen und in TMPPLIST geschrieben wird (Standard: WRKDIR/.PLIST.mktmp). Falls Ihr Port also PLIST während dem Erstellen generiert, so sollte dies vor oder in pre-install
geschehen. Muss Ihr Port die resultierende Datei verändern, so sollte dies in post-install
mit der Ausgabedatei TMPPLIST erfolgen.
Eine weitere Möglichkeit, die Paketliste eines Ports zu verändern, besteht darin die Variablen PLIST_FILES
und PLIST_DIRS
zu setzen. Der Wert jeder der beiden Variablen stellt eine Liste von Pfadnamen dar, die zusammen mit dem Inhalt von PLIST in TMPPLIST geschrieben wird. Dabei unterliegen die Namen in PLIST_FILES
und PLIST_DIRS
der weiter oben beschriebenen Substitution von %%VAR%%
. Die Namen aus PLIST_FILES
werden ansonsten unverändert in die endgültige Paketliste übernommen, während den Namen aus PLIST_DIRS
noch der Wert von @dirrm
vorangestellt wird. Damit die Verwendung von PLIST_FILES
und PLIST_DIRS
überhaupt möglich ist, müssen diese gesetzt werden, bevor TMPPLIST geschrieben wird - z.B. in pre-install
oder vorher.
7.2. Leere Verzeichnisse
7.2.1. Aufräumen leerer Verzeichnisse
Bitte sorgen Sie dafür, dass ihre Ports bei der Deinstallation leere Verzeichnisse löschen. Dazu wird für jedes Verzeichnis, das der Port erzeugt hat, eine @dirrm
-Zeile angegeben. Um ein Verzeichnis zu löschen müssen Sie zuerst dessen Unterverzeichnisse entfernen.
: lib/X11/oneko/pixmaps/cat.xpm lib/X11/oneko/sounds/cat.au : @dirrm lib/X11/oneko/pixmaps @dirrm lib/X11/oneko/sounds @dirrm lib/X11/oneko
Es kann allerdings auch vorkommen, dass @dirrm
Fehler ausgibt, da andere Ports ein Verzeichnis ebenfalls nutzen. Deshalb können Sie @dirrmtry
verwenden, um nur Verzeichnisse zu löschen, die wirklich leer sind, und damit Warnhinweise vermeiden.
@dirrmtry share/doc/gimp
Dadurch wird es weder eine Fehlermeldung geben noch wird pkg_delete(1) abnormal beendet werden - auch dann nicht, wenn ${PREFIX}/shared/doc/gimp nicht leer ist, da andere Ports hier ebenfalls Dateien installiert haben.
7.2.2. Erstellen leerer Verzeichnisse
Um leere Verzeichnisse während der Installation eines Ports zu erstellen, bedarf es etwas Aufmerksamkeit. Diese Verzeichnisse werden nicht erstellt, wenn das Paket installiert wird, da Pakete nur die Dateien speichern und pkg_add(1) nur die Verzeichnisse erstellt, die dafür benötigt werden. Um sicher zu gehen, dass das leere Verzeichnis erstellt wird, wenn ein Paket installiert wird, muss die folgende Zeile in pkg-plist über der entsprechenden @dirrm
Zeile eingetragen werden:
@exec mkdir -p %D/shared/foo/templates
7.3. Konfigurationsdateien
Sollte Ihr Port Konfigurationsdateien in PREFIX/etc benötigen, so sollten Sie diese nicht einfach installieren und in pkg-plist auflisten. Dies würde pkg_delete(1) veranlassen, diese Dateien zu löschen, selbst wenn wenn sie vom Benutzer editiert wurden.
Stattdessen sollten Beispieldateien mit einem entsprechenden Suffix (beispielsweise filename.sample) versehen werden. Ist die Konfigurationsdatei nicht vorhanden, so sollte die Beispieldatei an deren Platz kopiert werden. Bei der Deinstallation sollte die Konfigurationsdatei gelöscht werden, aber nur, wenn sie nicht vom Benutzer verändert wurde. Das alles muss sowohl im Makefile des Ports als auch in der pkg-plist (für die Installation aus einem Paket) sichergestellt werden.
Beispiel aus einem Makefile:
post-install: @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \ ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \ fi
Beispiel aus einer pkg-plist:
@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi etc/orbit.conf.sample @exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi
Wahlweise können Sie auch eine Nachricht ausgegeben lassen, in der Sie den Nutzer auffordern, die Datei an die richtige Stelle zu kopieren und zu bearbeiten, bevor das Programm ausgeführt werden kann.
7.4. Dynamische oder statische Paketliste
Eine statische Paketliste ist eine Paketliste, die in der Ports-Sammlung, entweder in Form der pkg-plist (mit oder ohne der Ersetzung von Variablen) oder durch PLIST_FILES
und PLIST_DIRS
im Makefile eingebettet, verfügbar ist. Selbst wenn der Inhalt durch ein Werkzeug oder ein Target im Makefile automatisch erzeugt wird, bevor die Datei von einem Committer in die Ports-Sammlung aufgenommen wird, so ist dies immer noch eine statische Liste, da es möglich ist den Dateiinhalt zu betrachten ohne ein Distfile Herunterladen oder Kompilieren zu müssen.
Eine dynamische Paketliste ist eine Paketliste, die beim Kompilieren des Ports erstellt wird, abhängig davon, welche Dateien und Verzeichnisse installiert werden. Es ist nicht möglich diese Liste zu betrachten, bevor der Quelltext heruntergeladen und kompiliert oder nachdem ein make clean
ausgeführt wurde.
Der Einsatz dynamischer Paketlisten ist zwar nicht untersagt, aber Sie sollten, wann immer das möglich ist, statische Paketlisten verwenden, da die Nutzer dann grep(1) auf alle verfügbaren Ports anwenden können, um z.B. herauszufinden, von welchem eine bestimmte Datei installiert wurde. Dynamische Paketlisten sollten für komplexe Ports verwendet werden, bei denen sich die Liste abhängig von den gewählten Funktionen sehr stark ändern kann (wodurch die Pflege von statischen Listen unmöglich wird), oder Ports, welche die Paketliste abhängig von den Versionen verwendeter Abhängigkeiten verändern (z.B. Ports, die Ihre Dokumentation mit Javadoc erzeugen).
Maintainer, die dynamische Paketlisten bevorzugen, werden dazu aufgefordert, neue Targets zu Ihren Ports hinzuzufügen, welche die pkg-plist-Datei erzeugen, sodass Benutzer den Inhalt überprüfen können.
7.5. Automatisiertes Erstellen von Paketlisten
Als Erstes sollten Sie sich vergewissern, dass der Port bis auf pkg-plist vollständig ist.
Als Nächstes erstellen Sie einen temporären Verzeichnisbaum, in welchem Ihr Port installiert werden kann, und installieren Sie alle Abhängigkeiten.
# mkdir /var/tmp/`make -V PORTNAME`
# mtree -U -f `make -V MTREE_FILE` -d -e -p /var/tmp/`make -V PORTNAME`
# make depends PREFIX=/var/tmp/`make -V PORTNAME`
Speichern Sie die Verzeichnisstruktur in einer neuen Datei.
# (cd /var/tmp/`make -V PORTNAME` && find -d * -type d) | sort > OLD-DIRS
Erstellen Sie eine leere pkg-plist-Datei:
# :>pkg-plist
Wenn Ihr Port auf PREFIX
achtet (was er machen sollte), so kann der Port nun installiert und die Paketliste erstellt werden.
# make install PREFIX=/var/tmp/`make -V PORTNAME`
# (cd /var/tmp/`make -V PORTNAME` && find -d * \! -type d) | sort > pkg-plist
Sie müssen auch alle neu erstellten Verzeichnisse in die Paketliste aufnehmen.
# (cd /var/tmp/`make -V PORTNAME` && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist
Zu guter Letzt muss die Paketliste noch manuell aufgeräumt werden - es funktioniert eben nicht alles automatisch. Manualpages sollten im Makefile des Ports unter MANn
aufgeführt sein und nicht in der Paketliste. Konfigurationsdateien des Benutzers sollten entfernt oder als filename.sample installiert werden. Die info/dir-Datei sollte nicht aufgeführt sein und die zugehörigen install-info-Zeilen sollten hinzugefügt werden, wie im info files-Abschnitt beschrieben. Alle Bibliotheken, die der Port installiert, sollten aufgelistet werden, wie es im Shared Libraries-Abschnitt festgelegt ist.
Alternativ dazu können Sie das plist
-Skript in /usr/ports/Tools/scripts/ verwenden, um die Paketliste automatisch zu erstellen. Das plist-Skript ist ein Ruby-Skript, das die meisten der in den vorangehenden Absätzen kurz dargestellten manuellen Schritte automatisiert.
Der erste Schritt ist derselbe wie oben: Nehmen Sie die ersten drei Zeilen, also mkdir
, mtree
und make depends
. Installieren und bauen Sie dann den Port:
# make install PREFIX=/var/tmp/`make -V PORTNAME`
Und lassen Sie plist
die pkg-plist-Datei erstellen:
# /usr/ports/Tools/scripts/plist -Md -m `make -V MTREE_FILE` /var/tmp/`make -V PORTNAME` > pkg-plist
Die Paketliste muss immer noch von Hand aufgeräumt werden, wie es oben erklärt wurde.
Ein weiteres Werkzeug zur Erzeugung einer ersten pkg-plist-Datei ist ports-mgmt/genplist. Wie bei jedem automatisierten Hilfswerkzeug, sollte die erzeugte pkg-plist-Datei überprüft und bei Bedarf von Hand nachbearbeitet werden.
Es gibt noch einige Tricks mit pkg-*, die wir noch nicht erwähnt haben, die aber oft sehr praktisch sind.
Last modified on: 9. März 2024 by Danilo G. Baio