doc/de_DE.ISO8859-1/books/porters-handbook/book.xml
2013-07-03 17:35:46 +00:00

16793 lines
551 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN"
"../../../share/xml/freebsd45.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/porters-handbook/book.xml,v 1.241 2011/10/08 16:18:17 jkois Exp $
basiert auf: r37819
-->
<book id="of" lang="de">
<bookinfo>
<title>Das FreeBSD Porter-Handbuch</title>
<authorgroup>
<corpauthor>The FreeBSD German Documentation Project</corpauthor>
</authorgroup>
<pubdate>April 2000</pubdate>
<copyright>
<year>2000</year>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<year>2004</year>
<year>2005</year>
<year>2006</year>
<year>2007</year>
<year>2008</year>
<year>2009</year>
<year>2010</year>
<year>2011</year>
<holder role="mailto:doc@FreeBSD.org">The FreeBSD German
Documentation Project</holder>
</copyright>
&trademarks;
&legalnotice;
<releaseinfo>$FreeBSD$</releaseinfo>
</bookinfo>
<chapter id="why-port">
<title>Einführung</title>
<para>Die Ports-Sammlung von FreeBSD ist der gebräuchlichste
Weg, um Anwendungen ("Ports") unter FreeBSD zu installieren.
Wie alles andere in FreeBSD auch, ist sie hauptsächlich
das Ergebnis der Arbeit von Freiwilligen. Es ist wichtig,
diesen Aspekt beim Lesen im Hinterkopf zu behalten.</para>
<para>In FreeBSD kann jeder einen neuen Port einsenden oder sich
dazu bereit erklären, einen bereits vorhandenen Port zu
pflegen, sofern der Port derzeit keinen Maintainer
hat&nbsp;&ndash;&nbsp;dazu sind keine besonderen Rechte
nötig.</para>
</chapter>
<chapter id="own-port">
<title>Einen neuen Port erstellen</title>
<para>Sie sind also daran interessiert, einen neuen Port zu
erstellen oder einen vorhandenen zu aktualisieren?
Großartig!</para>
<para>Die folgenden Kapitel beinhalten einige Richtlinien, um
einen neuen Port für FreeBSD zu erstellen. Wenn Sie
einen vorhandenen Port auf den neuesten Stand bringen
wollen, sollten Sie mit <xref linkend="port-upgrading"/>
fortfahren.</para>
<para>Wenn Ihnen dieses Dokument nicht detailliert genug ist,
sollten Sie einen Blick in
<filename>/usr/ports/Mk/bsd.port.mk</filename> werfen. Das
Makefile jedes Ports bindet diese Datei ein. Auch wenn Sie
nicht täglich mit Makefiles arbeiten, sollten Sie gut
damit zurecht kommen, da die Datei gut dokumentiert ist und
Sie eine Menge Wissen daraus erlangen können.
Zusätzlich können Sie speziellere Fragen an die
&a.ports;-Mailingliste stellen.</para>
<note>
<para>Nur ein Bruchteil der Variablen
(<makevar><replaceable>VAR</replaceable></makevar>), die von
Ihnen gesetzt werden können, finden hier
Erwähnung. Die meisten von ihnen (wenn nicht sogar
alle) sind am Anfang von
<filename>/usr/ports/Mk/bsd.port.mk</filename>
erläutert. Beachten Sie bitte, dass diese Datei eine
nicht standardkonforme Tabulator-Einstellung
verwendet. <application>Emacs</application> und
<application>Vim</application> sollten diese Einstellung
jedoch automatisch beim Öffnen der Datei setzen. Sowohl
&man.vi.1; als auch &man.ex.1; können mit dem Befehl
<command>:set tabstop=4</command> dazu gebracht werden, die
Datei richtig anzuzeigen, wenn sie geöffnet wird.</para>
</note>
<para>Sind Sie auf der Suche nach einer neuen Aufgabe? Dann sehen
Sie sich bitte die <ulink
url="http://wiki.freebsd.org/WantedPorts">Ports-Wunschliste</ulink>
an und prüfen Sie, ob Sie an einem dieser Ports arbeiten
können.</para>
</chapter>
<chapter id="quick-porting">
<title>Einen neuen Port erstellen</title>
<para>Dieser Abschnitt beschreibt, wie Sie schnell einen neuen
Port erstellen können. In vielen Fällen ist dies
allerdings nicht ausreichend, dann werden Sie in diesem Buch
weiterlesen müssen.</para>
<para>Als Erstes besorgen Sie sich das Original-Tarball
(komprimiertes Archiv) und legen es im
<makevar>DISTDIR</makevar> ab, welches
standardmäßig
<filename>/usr/ports/distfiles</filename> ist.</para>
<note>
<para>Im Folgenden wird angenommen, dass die Software
unverändert kompiliert werden konnte, dass also keinerlei
Änderungen nötig waren, um den Port auf Ihrem
FreeBSD-Rechner zum Laufen zu bringen. Falls Sie
Änderungen vornehmen mussten, werden Sie auch den
nächsten Abschnitt beachten müssen.</para>
</note>
<sect1 id="porting-makefile">
<title>Das <filename>Makefile</filename> schreiben</title>
<para>Ein minimales <filename>Makefile</filename> sieht in etwa
so aus:</para>
<programlisting># New ports collection makefile for: oneko
# Date created: 5 December 1994
# Whom: asami
#
# &dollar;FreeBSD&dollar;
#
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.org
COMMENT= A cat chasing a mouse all over the screen
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include &lt;bsd.port.mk&gt;</programlisting>
<para>Versuchen Sie es zu verstehen. Machen Sie sich keine
Gedanken um die
<literal>&dollar;FreeBSD&dollar;</literal>-Zeile, diese wird
automatisch vom CVS eingefügt, wenn der Port in den
Haupt-Ports-Tree importiert wird. Ein detailliertes Beispiel
finden Sie im Abschnitt
<link linkend="porting-samplem">sample Makefile</link>.</para>
</sect1>
<sect1 id="porting-desc">
<title>Die Beschreibungsdateien erstellen</title>
<para>Es gibt zwei Beschreibungsdateien, die für jeden Port
benötigt werden, ob sie tatsächlich im Paket
enthalten sind oder nicht. Dies sind
<filename>pkg-descr</filename> und
<filename>pkg-plist</filename>. Der <filename>pkg-</filename>
Präfix unterscheidet sie von anderen Dateien.</para>
<sect2>
<title><filename>pkg-descr</filename></title>
<para>Diese enthält eine längere Beschreibung des
Ports. Einer oder mehrere Absätze, die kurz und
prägnant erklären, was der Port macht, sind
ausreichend.</para>
<note>
<para><filename>pkg-descr</filename> enthält
<emphasis>keine</emphasis> Anleitung oder detaillierte
Beschreibung wie der Port benutzt oder kompiliert wird!
<emphasis>Bitte seien Sie vorsichtig, wenn Sie aus dem
<filename>README</filename> oder der Manualpage kopieren
</emphasis>; Diese sind oft keine prägnanten
Beschreibungen des Ports oder sie sind in einem
ungünstigen Format (Manualpages haben z.B.
bündige Zwischenräume). Wenn es für die
portierte Software eine offizielle Webseite gibt, sollten
Sie diese hier angeben. Fügen Sie hierzu
<emphasis>eine</emphasis> der Webseiten mit dem
Präfix <literal>WWW:</literal> ein, damit
automatische Werkzeuge korrekt arbeiten.</para>
</note>
<para>Das folgende Beispiel zeigt wie Ihre
<filename>pkg-descr</filename> aussehen sollte:</para>
<programlisting>This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(etc.)
WWW: http://www.oneko.org/</programlisting>
</sect2>
<sect2>
<title><filename>pkg-plist</filename></title>
<para>Diese Datei enthält eine Liste aller Dateien, die
von diesem Port installiert werden. Sie wird auch die
<quote>Packliste</quote> genannt, da das Paket durch die
hier aufgeführten Dateien erstellt wird. Die
Pfadangaben sind relativ zum Installationspräfix
(für gewöhnlich <filename>/usr/local</filename>
oder <filename>/usr/X11R6</filename>). Wenn Sie die
<makevar>MAN<replaceable>n</replaceable></makevar>-Variablen
verwenden (was Sie auch machen sollten), führen Sie hier
keine Manualpages auf. Wenn der Port während der
Installation Verzeichnisse erstellt, stellen Sie sicher
entsprechende <literal>@dirrm</literal>-Zeilen
einzufügen, um die Verzeichnisse zu entfernen, wenn das
Paket gelöscht wird.</para>
<para>Hier ist ein kleines Beispiel:</para>
<programlisting>bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko</programlisting>
<para>Für weitere Details zur Packliste lesen Sie in der
&man.pkg.create.1; Manualpage nach.</para>
<note>
<para>Es wird empfohlen alle Dateinamen in dieser Datei
alphabetisch sortiert zu halten. Das erlaubt Ihnen die
Änderungen bei einem Upgrade Ihres Ports deutlich
einfacher zu Überprüfen.</para>
</note>
<note>
<para>Eine Packlist von Hand zu erzeugen kann eine sehr
mühsame Aufgabe sein. Wenn der Port eine große
Anzahl Dateien installiert, kann es Zeit sparen,
<link linkend="plist-autoplist">eine Packliste automatisch
zu erstellen</link>.</para>
</note>
<para>Es gibt nur einen Fall, in dem
<filename>pkg-plist</filename> weggelassen werden kann.
Wenn der Port nur eine handvoll Dateien und Verzeichnisse
installiert, können diese in den Variablen
<makevar>PLIST_FILES</makevar> und
<makevar>PLIST_DIRS</makevar> im
<filename>Makefile</filename> aufgelistet werden. Zum
Beispiel könnten wir im obigen Beispiel ohne
<filename>pkg-plist</filename> für den
<filename>oneko</filename>-Port auskommen, indem wir die
folgenden Zeilen ins <filename>Makefile</filename>
einfügen:</para>
<programlisting>PLIST_FILES= bin/oneko \
lib/X11/app-defaults/Oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
PLIST_DIRS= lib/X11/oneko</programlisting>
<para>Natürlich sollte <makevar>PLIST_DIRS</makevar>
ungesetzt bleiben, wenn der Port keine eigenen Verzeichnisse
installiert.</para>
<para>Der Preis für diese Art die Dateien eines Ports
anzugeben ist, dass man keine Befehlsfolgen wie in
&man.pkg.create.1; nutzen kann. Deshalb ist es nur
für einfache Ports geeignet und macht diese noch
einfacher. Gleichzeitig bringt es den Vorteil die Anzahl
der Dateien in der Ports-Sammlung zu reduzieren. Deshalb
ziehen Sie bitte diese Vorgehensweise in Erwägung,
bevor Sie <filename>pkg-plist</filename> benutzen.</para>
<para>Später werden wir uns ansehen, wie
<filename>pkg-plist</filename> und
<makevar>PLIST_FILES</makevar> benutzt werden können,
um <link linkend="plist">anspruchsvollere Aufgaben</link> zu
erfüllen.</para>
</sect2>
</sect1>
<sect1 id="porting-checksum">
<title>Die Checksummendatei erzeugen</title>
<para>Geben Sie einfach <command>make makesum</command> ein.
Die Regeln von Make sorgen dafür, dass die Datei
<filename>distinfo</filename> automatisch erstellt
wird.</para>
<para>Wenn sich die Checksumme einer heruntergeladenen Datei
regelmäßig ändert und Sie sicher sind, dass
Sie der Quelle trauen können (weil sie z.B. von einer
Hersteller-CD oder täglich erstellter Dokumentation
stammt), sollten Sie diese Dateien in der Variable
<makevar>IGNOREFILES</makevar> angeben. Dann wird die
Checksumme für diese Datei bei
<command>make makesum</command> nicht berechnet, sondern auf
<literal>IGNORE</literal> gesetzt.</para>
</sect1>
<sect1 id="porting-testing">
<title>Den Port testen</title>
<para>Sie sollten sicherstellen, dass die Port-Regeln genau das
einhalten, was Sie von ihnen erwarten, auch beim Erzeugen eines
Pakets aus dem Port. Dies sind die wichtigen Punkte, die Sie
überprüfen sollten.</para>
<itemizedlist>
<listitem>
<para><filename>pkg-plist</filename> enthält nichts,
das nicht von Ihrem Port installiert wurde.</para>
</listitem>
<listitem>
<para><filename>pkg-plist</filename> enthält alles,
was von Ihrem Port installiert wurde.</para>
</listitem>
<listitem>
<para>Ihr Port kann mit Hilfe von
<command>make reinstall</command> mehrmals installiert
werden.</para>
</listitem>
<listitem>
<para>Ihr Port
<link linkend="plist-cleaning">räumt</link> bei der
Deinstallation hinter sich auf.</para>
</listitem>
</itemizedlist>
<procedure>
<title>Empfohlene Testreihenfolge</title>
<step>
<para><command>make install</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>pkg_add <replaceable>Paket-Name</replaceable>
</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>make reinstall</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
</procedure>
<para>Stellen Sie bitte sicher, dass während
<command>make package</command> und
<command>make deinstall</command> keine Warnungen ausgegeben
werden. Nach Schritt 3 überprüfen Sie bitte, ob alle
neuen Verzeichnisse korrekt entfernt wurden. Und versuchen Sie
die Software nach Schritt 4 zu benutzen, um sicherzustellen,
dass sie korrekt funktioniert, wenn diese aus einem Paket
installiert wird.</para>
<para>Der gründlichste Weg diese Schritte zu automatisieren
ist eine <application>Tinderbox</application> zu installieren.
Diese verwaltet <literal>Jails</literal>, in denen Sie alle
oben genannten Schritte durchführen können, ohne den
Zustand Ihres laufenden Systems zu verändern. Mehr
Informationen hierzu entält
<filename>ports/ports-mgmt/tinderbox</filename></para>
</sect1>
<sect1 id="porting-portlint">
<title>Ihren Port mit <command>portlint</command>
überprüfen</title>
<para>Bitte verwenden Sie <command>portlint</command>, um
festzustellen, ob Ihr Port unseren Richtlinien entspricht.
Das Programm
<filename role="package">ports-mgmt/portlint</filename> ist
Teil der Ports-Sammlung. Stellen Sie vor allem sicher, dass
das <link linkend="porting-samplem">Makefile</link> in der
richtigen Form und das
<link linkend="porting-pkgname">Paket</link> passend benannt
ist.</para>
</sect1>
<sect1 id="porting-submitting">
<title>Den neuen Port einreichen</title>
<para>Bevor Sie den neuen Port einreichen, lesen Sie bitte
unbedingt den Abschnitt <link
linkend="porting-dads">DOs and DON'Ts</link>.</para>
<para>Nun, da Sie mit Ihrem Port zufrieden sind, müssen Sie
ihn nur noch in den Haupt-Ports-Tree von &os; einbringen,
damit alle daran teilhaben können. Wir benötigen
nicht Ihr <filename>work</filename>-Verzeichnis oder Ihr
<filename>pkgname.tgz</filename>-Paket&nbsp;&ndash;&nbsp;diese
können Sie nun löschen. Wenn Ihr Port beispielsweise
<literal>oneko</literal> heißt, wechseln Sie in das
Verzeichnis, in dem sich das Verzeichnis
<literal>oneko</literal> befindet und führen
den Befehl <command>shar `find oneko` &gt; oneko.shar</command>
aus.</para>
<para>Fügen Sie Ihre Datei <literal>oneko.shar</literal>
einem Fehlerbericht an und senden Sie diesen mit Hilfe des
Programms &man.send-pr.1; (unter <ulink
url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">
Bug Reports and General Commentary</ulink> finden Sie weitere
Informationen über &man.send-pr.1;). Ordnen Sie den
Fehlerbericht bitte in die Kategorie <literal>Ports</literal>
mit der Klasse <literal>Change-Request</literal> ein
(Markieren Sie den Bericht nicht als
<literal>vertraulich</literal>
(<literal>confidential</literal>)!). Fügen Sie bitte eine
kurze Beschreibung des Programms, das Sie portiert haben, in
das <quote>Beschreibungs</quote>-Feld des Problemberichts und
die shar-Datei in das <quote>Fix</quote>-Feld
ein (bespielsweise eine kurze Version des
<makevar>COMMENT</makevar>).</para>
<note>
<para>Sie können uns die Arbeit um einiges vereinfachen,
wenn Sie eine gute Beschreibung in der Zusammenfassung des
Problemberichtes verwenden. Wir bevorzugen etwas wie
<quote>Neuer Port:
&lt;Kategorie&gt;/&lt;Portname&gt;&lt;Kurzbeschreibung des
Ports&gt;</quote> für neue Ports. Wenn Sie sich an
dieses Schema halten, ist die
Chance, dass sich jemand bald Ihren Bericht ansieht,
deutlich besser.</para>
</note>
<para>Noch einmal: <emphasis>Bitte fügen Sie nicht das
distfile der Originalquelle, das
<filename>work</filename>-Verzeichnis oder das Paket, das Sie
mit <command>make package</command> erstellt haben,
ein.</emphasis> Und verwenden Sie &man.shar.1; für
neue Ports (und NICHT &man.diff.1;).</para>
<para>Haben Sie bitte etwas Geduld, nachdem Sie den Port
eingereicht haben. Manchmal kann es einige Monate dauern,
bevor ein Port in &os; eingefügt wird, obwohl es
wahrscheinlich nur ein paar Tage dauert. Sie können sich
die <ulink
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
Liste der PRs, die darauf warten, in &os; committet zu
werden</ulink>, ansehen.</para>
<para>Nachdem wir einen Blick auf Ihren Port geworfen haben,
werden wir, wenn nötig, bei Ihnen nachfragen und ihn in
die Ports-Sammlung übernehmen. Ihr Name taucht dann auch
in der Liste der <ulink
url="&url.articles.contributors;/contrib-additional.html">Additional
FreeBSD Contributors</ulink> und in anderen Dateien auf.
Ist das nicht toll?! <!-- smiley -->:-)</para>
</sect1>
</chapter>
<chapter id="slow">
<title>Einen Port in aller Ruhe erstellen</title>
<para>Ok, das war nicht ganz einfach und der Port hat einige
Veränderungen erfordert, um funktionieren zu können.
In diesem Abschnitt werden wir Schritt für Schritt
erklären, wie man den funktionierenden Port den Vorgaben
der Ports entsprechend anpasst.</para>
<sect1 id="slow-work">
<title>Die Funktionsweise</title>
<para>Beginnen wir mit der Abfolge der Ereignisse, die
eintreten, wenn der Nutzer das erste <command>make</command>
in Ihrem Portsverzeichnis ausführt. Sie empfinden es
für das Verständnis vielleicht hilfreich
<filename>bsd.port.mk</filename> in einem anderen Fenster
offen zu haben, während Sie diesen Abschnitt
lesen.</para>
<para>Aber machen Sie sich keine Sorgen, falls Sie nicht
wirklich verstehen, was <filename>bsd.port.mk</filename>
macht, die Wenigsten begreifen dies... <!-- smiley -->
<emphasis>:&gt;</emphasis></para>
<procedure>
<step>
<para>Das Target <maketarget>fetch</maketarget> wird
aufgerufen. Es ist dafür verantwortlich
sicherzustellen, dass der Tarball lokal im
<makevar>DISTDIR</makevar> verfügbar ist. Falls
<maketarget>fetch</maketarget> die benötigten Dateien
in <makevar>DISTDIR</makevar> nicht finden kann,
durchsucht es die URL <makevar>MASTER_SITES</makevar>,
welche im Makefile gesetzt ist, ebenso wie unsere
Haupt-FTP-Seite unter <ulink
url="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles">
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
</ulink>, wo wir genehmigte Distfiles als Backup
aufbewahren. Danach wird versucht, so eine direkte
Internetverbindung besteht, dass genannte Distfile mit
<makevar>FETCH</makevar> herunterzuladen. Falls dies
gelingt, wird die Datei in <makevar>DISTDIR</makevar>
für weitere Nutzung abgelegt und fährt
fort.</para>
</step>
<step>
<para>Das Target <maketarget>extract</maketarget> wird
aufgerufen. Es sucht nach den Distfiles Ihres Ports
(normalerweise ein gzip-komprimierter Tarball) in
<makevar>DISTDIR</makevar> und entpackt diese in ein
temporäres Unterverzeichnis, welches von <makevar>
WRKDIR</makevar> festgelegt wird (standardmäßig
<filename>work</filename>).</para>
</step>
<step>
<para>Das Target <maketarget>patch</maketarget> wird
aufgerufen. Zuerst werden alle in
<makevar>PATCHFILES</makevar> festgelegten Patches
eingespielt. Anschließend werden, falls Patches der
Form
<filename>patch-<replaceable>*</replaceable></filename> in
<makevar>PATCHDIR</makevar> (standardmäßig das
<filename>files</filename>-Unterverzeichnis) gefunden
werden, diese in alphabetischer Reihenfolge
eingespielt.</para>
</step>
<step>
<para>Das Target <maketarget>configure</maketarget> wird
aufgerufen. Dieses kann viele verschiedene Dinge
machen.</para>
<orderedlist>
<listitem>
<para>Existiert <filename>scripts/configure</filename>,
so wird es aufgerufen.</para>
</listitem>
<listitem>
<para>Falls <makevar>HAS_CONFIGURE</makevar> oder
<makevar>GNU_CONFIGURE</makevar> gesetzt sind, wird
<filename><makevar>WRKSRC</makevar>/configure
</filename>ausgeführt.</para>
</listitem>
<listitem>
<para>Falls <makevar>USE_IMAKE</makevar> gesetzt ist,
wird <makevar>XMKMF</makevar>
(standardmäßig <command>xmkmf -a</command>)
ausgeführt.</para>
</listitem>
</orderedlist>
</step>
<step>
<para>Das Target <maketarget>build</maketarget> wird
aufgerufen. Es ist für das Wechseln in das private
Arbeitsverzeichnis (<makevar>WRKSRC</makevar>) und das
Bauen des Ports zuständig. Ist
<makevar>USE_GMAKE</makevar> gesetzt, so wird GNU
<command>make</command> verwendet, sonst das
System-<command>make</command>.</para>
</step>
</procedure>
<para>Die oben genannten Schritte sind die Standardaktionen.
Zusätzlich können Sie <maketarget>pre-<replaceable>
irgendwas</replaceable></maketarget> oder
<maketarget>post-<replaceable>irgendwas</replaceable>
</maketarget> als Targets definieren oder Skripten mit diesen
Namen in das <filename>scripts</filename>-Unterverzeichnis
legen. Sie werden dann vor bzw. nach den Standardaktionen
aufgerufen.</para>
<para>Angenommen Sie haben das Target <maketarget>post-extract
</maketarget> in Ihrem <filename>Makefile</filename>
definiert und eine Datei <filename>pre-build</filename> im
<filename>scripts</filename> Unterverzeichnis, so wird das
Target <maketarget>post-extract</maketarget> nach dem normalen
Entpacken aufgerufen und das Skript
<filename>pre-build</filename>
ausgeführt, bevor die vordefinierten Bau-Regeln
abgearbeitet sind. Es wird empfohlen, dass Sie
<filename>Makefile</filename>-Targets verwenden, falls die
Aktionen es erlauben, da es so für jemanden einfacher
sein wird herauszufinden, was für eine
nicht-standardmäßige Aktion der Port
benötigt.</para>
<para>Die Standardaktionen werden aus den Targets
<filename>bsd.port.mk</filename>
<maketarget>do-<replaceable>irgendwas</replaceable>
</maketarget> übernommen. Zum Beispiel sind die Befehle
zum Entpacken eines Ports im Target
<maketarget>do-extract</maketarget> zu finden. Falls Sie mit
einem vorgegebenen Target nicht zufrieden sind, können
Sie es verändern, indem Sie das Target
<maketarget>do-<replaceable>irgendwas</replaceable>
</maketarget> in Ihrem <filename>Makefile</filename> neu
definieren.</para>
<note>
<para>Die <quote>Haupt</quote>-Targets (z.B.
<maketarget>extract</maketarget>,
<maketarget>configure</maketarget> usw.) machen nicht mehr
als sicherzustellen, dass bis hierhin alle Abschnitte
abgeschlossen sind, um danach die eigentlichen Targets oder
Skripte aufzurufen. Und es ist nicht beabsichtigt, dass
diese geändert werden. Falls Sie das Entpacken
verändern wollen, verändern Sie
<maketarget>do-extract</maketarget>, aber niemals die Art,
wie <maketarget>extract</maketarget> arbeitet!</para>
</note>
<para>Jetzt, da Sie verstehen, was geschieht, wenn der Benutzer
<command>make</command> eingibt, lassen Sie uns durch die
empfohlenen Schritte gehen, um den perfekten Port zu
erstellen.</para>
</sect1>
<sect1 id="slow-sources">
<title>Den originalen Quelltext besorgen</title>
<para>Normalerweise liegt der original Quelltext als gepackte
Datei (<filename><replaceable>foo</replaceable>.tar.gz
</filename> oder
<filename><replaceable>foo</replaceable>.tar.Z</filename>)
vor. Kopieren Sie diese nach <makevar>DISTDIR</makevar>.
Nutzen Sie, soweit möglich, immer die Quellen aus dem
<emphasis>Hauptzweig</emphasis>.</para>
<para>Es ist notwendig die Variable
<makevar>MASTER_SITES</makevar> anzupassen, um anzugeben, wo
sich der originale Quelltext befindet. In
<filename>bsd.sites.mk</filename> finden sich hilfreiche
Definitionen für die gebräuchlichsten Seiten. Bitte
nutzen Sie diese Seiten und die zugehörigen Definitionen,
soweit dies möglich ist. Damit wird vermieden, immer und
immer wieder dieselben Informationen zu wiederholen. Da die
Hauptseiten regelmäßig angepasst werden
müssen, vereinfacht dieses Vorgehen die Pflege der
Dateien für jeden Beteiligten.</para>
<para>Falls keine zuverlässige und gut erreichbare
FTP/HTTP-Seite zu finden ist, oder nur Seiten auffindbar sind,
die keinen Standards entsprechen, sollte eine Kopie des
Quelltextes auf einer zuverlässigen Seite abgelegt
werden. Dies könnte z.B. die eigene Internetseite
sein.</para>
<para>Ist kein geeigneter Ort zum Ablegen des Quelltextes
auffindbar, ist es möglich diesen <quote>intern</quote>
auf <hostid>ftp.FreeBSD.org</hostid> abzulegen; dies sollte
jedoch als letzte Möglichkeit angesehen werden. Das
Distfile muss in diesem Fall in <filename>~/public_distfiles/
</filename> eines <hostid>freefall</hostid>-Accounts abgelegt
werden. Bitten Sie den Committer Ihres Ports dies zu erledigen.
Er wird außerdem <makevar>MASTER_SITES</makevar> nach
<makevar>MASTER_SITE_LOCAL</makevar> und <makevar>
MASTER_SITE_SUBDIR</makevar> auf den
<hostid>freefall</hostid>-Benutzernamen angepasst.</para>
<para>Sollte sich das Distfile des Ports regelmäßig
ohne Versionsanpassungen des Autors ändern, sollte
überlegt werden, das Disfile auf der eigenen
Internetseite abzulegen und diese in der Liste der
<makevar>MASTER_SITES</makevar> an die erste Stelle zu setzen.
Falls möglich, sollte der Autor des Ports gebeten werden,
dies zu erledigen; hierüber wird die Kontrolle des Quelltextes
verbessert. Wird eine eigene Version des Quelltextes auf
eigenen Internetseiten verfügbar gemacht, verhindert dies
Warnungen von <errorname>checksum mismatch</errorname> und
reduziert den Arbeitsaufwand der Maintainer der FTP-Seiten.
Auch wenn nur eine Quelle für den Quelltext des Ports zur
Verfügung steht, ist es empfohlen, ein Backup auf einer
weiteren Seite abzulegen und diese als zweiten Eintrag in
<makevar>MASTER_SITES</makevar> aufzunehmen.</para>
<para>Sind für den Port zusätzlich aus dem Internet
verfügbare Patches erforderlich, sollten diese ebenfalls
in <makevar>DISTDIR</makevar> abgelegt werden. Sollten diese
Patches von anderer Quelle als der Hauptseite des Ports
stammen, ist das kein Grund zur Sorge. Es gibt Wege diesem
Umstand gerecht zu werden (beachten Sie die unten stehende
Beschreibung zu <link linkend="porting-patchfiles">PATCHFILES
</link>).</para>
</sect1>
<sect1 id="slow-modifying">
<title>Den Port bearbeiten</title>
<para>Entpacken Sie eine Kopie des Tarballs in ein privates
Verzeichnis und nehmen Sie alle Änderungen
vor, die nötig sind, um den Port unter einer aktuellen
&os;-Version kompilieren zu können.
<emphasis>Protokollieren Sie sorgfältig</emphasis> alle
Schritte, die Sie vornehmen, da Sie den Prozess in Kürze
automatisieren werden. Alles, auch das Entfernen,
Hinzufügen oder Bearbeiten von Dateien, sollte von einem
automatisierten Skript oder einer Patch-Datei machbar sein,
wenn Ihr Port fertig ist.</para>
<para>Falls Ihr Port bedeutende Interaktionen/Veränderungen
durch den Benutzer benötigt, um ihn zu Kompilieren oder
zu Installieren, sollten Sie einen Blick auf Larry Walls
klassische <application>Configure</application>-Skripte werfen
oder vielleicht etwas Ähnliches selbst erstellen. Das
Ziel der Ports-Sammlung ist es, jeden Port so
<quote>plug-and-play-fähig</quote> wie möglich
für den Endbenutzer zu machen, während ein Minimum
an Speicherplatz gebraucht wird.</para>
<note>
<para>Solange nicht anders angegeben wird von Patch-Dateien,
Skripten und anderen Dateien, die Sie erstellt und der &os;
Ports-Sammlung hinzugefügt haben, angenommen, dass Sie
unter den standardmäßigen BSD-Copyright-Bedingungen
stehen.</para>
</note>
</sect1>
<sect1 id="slow-patch">
<title>Fehlerbehebung (Patches)</title>
<para>Bei der Vorbereitung eines Ports können die Dateien,
die hinzugefügt oder verändert wurden, mittels
&man.diff.1; abgefangen werden, um Sie später an
&man.patch.1; zu übergeben. Jeder Patch, der dem
Quelltext übergeben werden soll, sollte in einer Datei
<filename>patch-<replaceable>*</replaceable></filename>
abgelegt werden, wobei <replaceable>*</replaceable> dem
Pfadnamen der zu korrigierenden Datei entspricht, wie er auch
in <filename>patch-Imakefile</filename> oder im
<filename>patch-src-config.h</filename> erscheint. Diese
Dateien sollten in <makevar>PATCHDIR</makevar> (normalerweise
<filename>files</filename>) abgelegt sein, von wo sie
automatisch übernommen werden. Alle Patches müssen
sich relativ zur <makevar>WRKSRC</makevar>-Variable
(normalerweise dem Verzeichnis, in dem sich der Quelltext des
Ports entpackt und wo auch der Bau stattfindet)
befinden.</para>
<para>Um Korrekturen und Updates zu vereinfachen, sollte es
vermieden werden, mehr als einen Patch für eine Datei zu
nutzen (z.B. <filename>patch-file</filename> und
<filename>patch-file2</filename>, welche beide
<filename><makevar>WRKSRC</makevar>/foobar.c</filename>
verändern). Beachten Sie, dass, falls der Pfad einer zu
korrigierenden Datei einen Unterstrich (<literal>_</literal>)
enthält, der Patch stattdessen zwei Unterstriche im Namen
haben muss. Zum Beispiel muss der Patch, der eine Datei namens
<filename>src/freeglut_joystick.c</filename> korrigieren soll,
<filename>patch-src-freeglut__joystick.c</filename> genannt
werden.</para>
<para>Für die Benennung der Patches sollten nur die Zeichen
<literal>[-+._a-zA-Z0-9]</literal> genutzt werden. Bitte
verwenden Sie keine weiteren Zeichen als die angegebenen. Die
Namensvergabe sollte nicht <filename>patch-aa</filename> oder
<filename>patch-ab</filename> etc. entsprechen, erwähnen
Sie immer den Pfad und Dateinamen.</para>
<para>RCS-Zeichenketten sollten vermieden werden, da CVS diese
verstümmeln würde, sobald wir diese Dateien in die
Ports-Sammlung einpflegen. Wenn wir die Dateien wieder abrufen
wären diese verändert und der Patch würde
fehlschlagen. RCS-Zeichenketten sind in Dollar-Zeichen
(<literal>&dollar;</literal>) eingefügte Zeichen und
beginnen üblicherweise mit <literal>&dollar;Id</literal>
oder <literal>&dollar;RCS</literal>.</para>
<para>Die Option rekursiv (<option>-r</option>) zu nutzen
&man.diff.1;, um Patches zu erstellen, ist zulässig,
jedoch sollte der Patch anschließend geprüft
werden, um Unnötiges aus dem Patch zu entfernen. Im
Einzelnen bedeutet dies, dass Diffs zwischen zwei
Backup-Dateien, <filename>Makefile</filename>s oder wenn der
Port <command>Imake</command> oder GNU
<command>configure</command> usw. nutzt, überflüssig
sind und entfernt werden sollten. Falls es es notwendig war,
<filename>configure.in</filename> zu bearbeiten und es soll
<command>autoconf</command> zum Neuerstellen von
<command>configure</command> genutzt werden, sollten die Diffs
aus <command>configure</command> nicht genutzt werden (diese
werden oft einige tausend Zeilen
groß!);&nbsp;&ndash;&nbsp;hier sollte
<literal>USE_AUTOTOOLS=autoconf:261</literal> definiert und
das Diff aus <filename>configure.in</filename> genutzt
werden.</para>
<para>Zusätzlich sollte man unnötige
Markup-Änderungen in Patches/Änderungen möglichst
vermeiden. In der Open Source-Welt teilen sich Projekte
häufig große Teile des Quellcodes. Allerdings
verwenden die einzelnen Projekte oft unterschiedliche
Programmierstile und Vorgaben für Einrückungen. Wenn
man also einen funktionierenden Teil einer Funktion aus einem
Projekt verwendet, um ein ähnliches Problem in einem anderen
Projekt zu lösen, sollte man besonders vorsichtig sein, weil
sich ansonsten die CVS-Änderungseinträge mit
überflüssigen Einträgen füllen, die nur
das Markup des Quellcodes betreffen, ohne dass sich an der
Funktion des eigentlichen Quellcode etwas ändert
(<quote>withspace-only changes</quote>). Solche Änderungen
vergrößern nicht nur das CVS-Repository, sondern
erschweren es auch die Ursache für eventuell auftretende
Probleme zu finden.</para>
<para>War es notwendig eine Datei zu entfernen, wird dies besser
mittels des <maketarget>post-extract</maketarget>-Targets als
über den Patch selbst realisiert.</para>
<para>Ein einfacher Austausch kann direkt über das
<filename>Makefile</filename> des Ports umgesetzt werden,
indem der in-place-Modus von &man.sed.1; genutzt wird. Dies
ist sehr hilfreich, wenn variable Werte korrigiert werden
sollen. Beispiel:</para>
<programlisting>post-patch:
@${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
@${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure
</programlisting>
<para>Relativ häufig ergibt sich die Situation, in der die
portierte Software die CR/LF-Konventionen für Zeilenenden
nutzt (dies ist bei unter &windows; entwickelter Software
häufig der Fall). Dies kann bei weiteren Patches Probleme
(Compiler-Warnungen, Fehlermeldungen bei der Ausführung
von Skripten wie z.B. <command>/bin/sh^M</command> not found)
und anderes ergeben. Um schnell alle Dateien von CR/LF
nach LF zu konvertieren, kann
<literal>USE_DOS2UNIX=yes</literal> in das
<filename>Makefile</filename> des Ports geschrieben werden.
Hierzu kann eine Liste der zu konvertierenden Dateien erstellt
werden:</para>
<programlisting>USE_DOS2UNIX= util.c util.h</programlisting>
<para>Sollen Gruppen von Dateien über verschiedene
Unterverzeichnisse konvertiert werden, kann
<makevar>DOS2UNIX_REGEX</makevar> genutzt werden, dessen
Argumente <command>find</command>-kompatible, reguläre
Ausdrücke sind. Mehr zur Formatierung findet sich in
&man.re.format.7;. Diese Option ist beim Konvertieren aller
Dateien mit definierter Endung, z.B. aller Dateien im
Quellcode, wobei binäre Dateien unberührt bleiben,
sinnvoll:</para>
<programlisting>USE_DOS2UNIX= yes
DOS2UNIX_REGEX= .*\.(c|cpp|h)</programlisting>
<para>Wenn Sie einen Patch zu einer bereits existierenden Datei
erstellen wollen, können Sie von ihr eine Kopie mit der
Endung <filename>.orig</filename> erstellen und
anschließend die Originaldatei bearbeiten. Das make-Ziel
<maketarget>makepatch</maketarget> führt dann zu
einer entsprechenden Patch-Datei im Verzeichnis <filename
class="directory">files</filename> des Ports.</para>
</sect1>
<sect1 id="slow-configure">
<title>Konfigurieren</title>
<para>Fügen Sie alle zusätzlichen
Veränderungsbefehle Ihrem Skript
<filename>configure</filename> hinzu und speichern Sie es im
<filename>scripts</filename>-Unterverzeichnis. Wie vorstehend
schon erwähnt, können Sie dies auch mit den Targets
<filename>Makefile</filename> und/oder Skripte mit dem Namen
<filename>pre-configure</filename> oder
<filename>post-configure</filename> erledigen.</para>
</sect1>
<sect1 id="slow-user-input">
<title>Handhabung von Benutzereingaben</title>
<para>Sollte der Port Eingaben vom Benutzer benötigen,
muss <makevar>IS_INTERACTIVE</makevar> im
<filename>Makefile</filename> des Ports gesetzt werden. Dies
erlaubt <quote>overnight builds</quote> Ihren Port zu
überspringen, falls der Nutzer die Variable
<envar>BATCH</envar> setzt (setzt der Nutzer hingegen die
Variable <envar>INTERACTIVE</envar>, werden
<emphasis>nur</emphasis> Ports gebaut, die Interaktion vom
Nutzer erwarten). Dies erspart den Rechnern, welche
kontinuierlich Ports bauen, eine Menge Zeit (siehe
unten).</para>
<para>Zudem ist es empfohlen, falls sinnvolle Vorgaben für
interaktive Optionen gesetzt sind, die
<makevar>PACKAGE_BUILDING</makevar>-Variable zu prüfen
und das interaktive Skript abzuschalten. Dies macht es uns
möglich, Pakete für CDROMs und FTP-Server zu
bauen.</para>
</sect1>
</chapter>
<chapter id="makefile">
<title>Die Konfiguration des Makefile</title>
<para>Das Konfigurieren des <filename>Makefile</filename> ist
sehr einfach und wir schlagen vor, dass Sie zunächst
einen Blick auf vorhandene Beispiele werfen. Zusätzlich
gibt es ein
<link linkend="porting-samplem">Beispiel eines Makefile</link>
in diesem Handbuch. Schauen Sie es sich an und verfolgen Sie
bitte die Abfolge der Variablen und Abschnitte in dieser
Vorlage. Damit erleichtern Sie es anderen,
Ihren Port zu lesen.</para>
<para>Bedenken Sie bitte die folgenden Probleme in der hier
vorgegebenen Abfolge der Unterabschnitte dieses Kapitels, wenn
Sie Ihr neues <filename>Makefile</filename> erstellen:</para>
<sect1 id="makefile-source">
<title>Der originale Quelltext</title>
<para>Liegt der Quelltext in <makevar>DISTDIR</makevar> als eine
standardisierte und mit gzip gepackte Datei in der Art
<filename>foozolix-1.2.tar.gz</filename>? Falls ja,
können Sie zum nächsten Schritt übergehen.
Falls nicht, sollten Sie versuchen, die Variablen
<makevar>DISTVERSION</makevar>, <makevar>DISTNAME</makevar>,
<makevar>EXTRACT_CMD</makevar>,
<makevar>EXTRACT_BEFORE_ARGS</makevar>,
<makevar>EXTRACT_AFTER_ARGS</makevar>,
<makevar>EXTRACT_SUFX</makevar>, oder
<makevar>DISTFILES</makevar> zu ändern. Das hängt
davon ab, wie fremdartig das Distributionsfile Ihres Ports ist
(der häufigste Fall ist
<literal>EXTRACT_SUFX=.tar.Z</literal>, wenn der Tarball durch
ein normales <command>compress</command> und nicht durch
<command>gzip</command> gepackt wurde).</para>
<para>Im schlimmsten Fall können Sie einfach Ihre eigene
Vorgabe mittels <maketarget>do-extract</maketarget> erzeugen
und die Standardvorgabe überschreiben; aber dies sollte
in den wenigsten Fällen, wenn überhaupt, notwendig
sein.</para>
</sect1>
<sect1 id="makefile-naming">
<title>Bezeichnungen</title>
<para>Der erste Teil des <filename>Makefile</filename>
beschreibt die Versionsnummer des Ports und führt ihn in
der richtigen Kategorie auf.</para>
<sect2>
<title><makevar>PORTNAME</makevar> und
<makevar>PORTVERSION</makevar></title>
<para>Setzen Sie bitte die Variable
<makevar>PORTNAME</makevar> auf den Basisnamen Ihres Ports
und die Variable <makevar>PORTVERSION</makevar> auf dessen
Versionsnummer.</para>
</sect2>
<sect2 id="makefile-naming-revepoch">
<title><makevar>PORTREVISION</makevar> und
<makevar>PORTEPOCH</makevar></title>
<sect3>
<title><makevar>PORTREVISION</makevar></title>
<para>Die <makevar>PORTREVISION</makevar>-Variable ist ein
streng monoton wachsender Wert, welcher auf 0
zurückgesetzt wird, nachdem
<makevar>PORTVERSION</makevar> erhöht wurde (d.h.
jedes Mal, wenn ein offizielles Release erfolgt). Sie wird
an den Namen des Pakets angehängt, wenn sie ungleich
0 ist. Änderungen an <makevar>PORTREVISION</makevar>
werden von automatisierten Werkzeugen (z.B.
&man.pkg.version.1;) genutzt, um anzuzeigen, dass ein
neues Paket verfügbar ist.</para>
<para><makevar>PORTREVISION</makevar> sollte jedes Mal
erhöht werden, wenn eine Änderung am Port
erfolgt, die beträchtliche Auswirkungen auf den
Inhalt oder Struktur des aus dem Port erzeugten Pakets
zur Folge hat.</para>
<para>Beispiele dafür, wann
<makevar>PORTREVISION</makevar> erhöht werden
sollte:</para>
<itemizedlist>
<listitem>
<para>Hinzufügen von Patches, welche
Sicherheitslücken schließen, Fehler
beseitigen oder neue Funktionalität zum Port
hinzufügen.</para>
</listitem>
<listitem>
<para>Änderungen am <filename>Makefile</filename>
des Ports, welche compile-time-Optionen
hinzufügen oder entfernen.</para>
</listitem>
<listitem>
<para>Änderungen bezüglich Packliste oder am
Verhalten während der Installation des Pakets
(d.h. Änderungen an einem Skript, welches
Ausgangsdaten für das Paket erzeugt, wie z.B.
SSH-Hostschlüssel).</para>
</listitem>
<listitem>
<para>Versionssprung einer Shared-Library, welche eine
Abhängigkeit dieses Ports ist (In diesem Fall
würde ein Anwender bei der Installation des alten
Pakets scheitern, falls er eine neue Version der
Abhängigkeit bereits installiert hat, weil nach
der alten Bibliothek libfoo.x anstatt nach
libfoo.(x+1)) gesucht wird).</para>
</listitem>
<listitem>
<para>Schleichende Änderungen am Distfile, welche
bedeutende funktionale Änderungen verursachen,
d.h. Änderungen des Distfile erfordern eine
Korrektur an <filename>distinfo</filename>, ohne dass
damit zusammenhängend die
<makevar>PORTVERSION</makevar> verändert wird,
obwohl ein <command>diff -ru</command> zwischen der
alten und der neuen Version bedeutende
Veränderungen am Code nachweist.</para>
</listitem>
</itemizedlist>
<para>Beispiele für Änderungen, welche keine
Erhöhung von <makevar>PORTREVISION</makevar>
erfordern:</para>
<itemizedlist>
<listitem>
<para>Stilistische Änderungen am Grundgerüst
des Ports ohne funktionale Änderungen am daraus
resultierenden Paket.</para>
</listitem>
<listitem>
<para>Änderungen an der Variable
<makevar>MASTER_SITES</makevar> oder andere
funktionale Änderungen, welche das resultierende
Paket nicht verändern.</para>
</listitem>
<listitem>
<para>Marginale Patches am Distfile wie die Korrektur
von Tippfehlern, welche nicht wichtig genug sind, um
dem Benutzer die Bürde eines Upgrades
aufzuerlegen.</para>
</listitem>
<listitem>
<para>Build fixes, die ein Paket erst kompilierbar
machen, welches ohne diese Änderungen vorher
nicht erzeugt werden konnte (solange die
Änderungen keine funktionale Differenz bringen
auf Plattformen, auf denen dieses Paket schon vorher
gebaut werden konnte). Da
<makevar>PORTREVISION</makevar> den Inhalt des Pakets
wiederspiegelt, ist es nicht notwendig
<makevar>PORTREVISION</makevar> zu erhöhen, wenn
das Paket vorher nicht erstellt werden konnte.</para>
</listitem>
</itemizedlist>
<para>Als Faustregel gilt: Stellen Sie sich die Frage, ob
die durchgeführte Änderung am Port jedem hilft
(entweder aufgrund einer Verbesserung, Beseitigung eines
Fehlers, oder der Annahme, dass das neue Paket
überhaupt erst funktioniert) und wägen Sie es
gegen den Umstand ab, dass jedermann, der seine
Ports-Sammlung regelmässig auf dem neuesten Stand
hält, zu einer Aktualisierung gezwungen wird.
Falls Sie die Frage positiv beantworten sollten,
erhöhen Sie die Variable
<makevar>PORTREVISION</makevar>.</para>
</sect3>
<sect3>
<title><makevar>PORTEPOCH</makevar></title>
<para>Von Zeit zu Zeit geschieht es, dass irgendjemand
(Drittanbieter von Software oder FreeBSD Ports Committer)
etwas Dummes tut und eine Version einer Software
veröffentlicht, deren Versionsnummer niedriger ist
als die der vorherigen. Ein Beispiel hierfür ist
ein Port, der von foo-20000801 auf foo-1.0 geändert
wird (der Erstere wird fälschlicherweise als neue
Version behandelt, weil 2000801 ein numerisch
größerer Wert ist als 1).</para>
<para>In Situationen wie diesen sollte die Variable
<makevar>PORTEPOCH</makevar> erhöht werden. Wenn
<makevar>PORTEPOCH</makevar> größer als 0 ist,
wird sie an den Namen des Pakets angehängt, wie in
Abschnitt 0 oberhalb bereits beschrieben.
<makevar>PORTEPOCH</makevar> darf niemals verringert oder
auf 0 gesetzt werden, weil der Vergleich des Pakets mit
einem früheren Zeitpunkt scheitern würde (d.h.
das Paket würde niemals als veraltet erkannt werden):
Die neue Versionsnummer (<literal>1.0,1</literal> im
obigen Beispiel) ist immer noch numerisch kleiner als die
vorherige Version (2000801), aber das Suffix
<literal>,1</literal> wird von automatisierten Werkzeugen
gesondert behandelt und wird als größer
erkannt, als das implizit angenommene Suffix
<literal>,0</literal> im früheren Paket.</para>
<para>Das Entfernen oder Zurücksetzen von
<makevar>PORTEPOCH</makevar> führt zu unendlichem
Ärger. Wenn Sie die obigen Ausführungen nicht
vollständig verstanden haben, lesen Sie es bitte
unbedingt nochmals bis Sie es vollständig
verinnerlicht haben, oder fragen Sie vor jeder
Änderung auf den Mailinglisten nach!</para>
<para>Es wird erwartet, dass <makevar>PORTEPOCH</makevar>
für die weitaus überwiegende Zahl der Ports
nicht verwendet wird und der verantwortungsvolle und
vorausschauende Umgang mit <makevar>PORTVERSION</makevar>
macht es meist überflüssig, falls ein
späteres Release die Versionsstruktur ändern
sollte. Vorsicht ist geboten, wenn ein Release einer
Drittanbieter-Software ohne eine offizielle Versionsnummer
veröffentlicht wird, wie z.B. bei
<quote>Snapshot-Versionen</quote>. Man ist versucht,
das Release mit dem jeweiligen Datum zu bezeichnen,
was unweigerlich zu den oben beschriebenen Problemen
führt, wenn das nächste
<quote>offizielle</quote> Release erscheint.</para>
<para>Wenn z.B. ein Snapshot zum Datum 20000917
veröffentlicht wird und die vorherige Version der
Software war 1.2, dann sollte der Snapshot die
<makevar>PORTVERSION</makevar> 1.2.20000917 oder
ähnlich erhalten und nicht 20000917, damit das
nachfolgende Release, angenommen 1.3, immer noch einen
größeren numerischen Wert aufweist.</para>
</sect3>
<sect3>
<title>Beispiel für den Gebrauch von
<makevar>PORTREVISION</makevar> und
<makevar>PORTEPOCH</makevar></title>
<para>Der <literal>gtkmumble</literal>-Port, Version
<literal>0.10</literal>, befindet sich in der
Ports-Sammlung:</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.10</programlisting>
<para><makevar>PKGNAME</makevar> wird zu
<literal>gtkmumble-0.10</literal>.</para>
<para>Ein Sicherheitsloch wurde entdeckt, das einen lokalen
Patch von FreeBSD erforderlich macht.
<makevar>PORTREVISION</makevar> wird entsprechend
erhöht.</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.10
PORTREVISION= 1</programlisting>
<para><makevar>PKGNAME</makevar> wird zu
<literal>gtkmumble-0.10_1</literal></para>
<para>Eine neue Version wird vom Software-Drittanbieter
veröffentlicht, bezeichnet mit der Version
<literal>0.2</literal> (es stellt sich heraus, dass der
Autor beabsichtigte, dass <literal>0.10</literal>
eigentlich <literal>0.1.0</literal> bedeuten sollte,
nicht <quote>was kommt nach 0.9</quote>
&nbsp;&ndash;&nbsp;Hoppla, aber nun ist es zu spät).
Da die neue Unterversion <literal>2</literal> numerisch
kleiner ist als die vorherige Version
<literal>10</literal>, muss <makevar>PORTEPOCH</makevar>
erhöht werden, um sicherzustellen, dass das neue
Paket auch als <quote>neuer</quote> erkannt wird. Da es
ein neues Release des Drittanbieters ist, wird
<makevar>PORTREVISION</makevar> auf 0 zurückgesetzt
(oder aus dem <filename>Makefile</filename>
entfernt).</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.2
PORTEPOCH= 1</programlisting>
<para><makevar>PKGNAME</makevar> wird zu
<literal>gtkmumble-0.2,1</literal></para>
<para>Das nächste Release ist 0.3. Da
<makevar>PORTEPOCH</makevar> niemals verringert wird,
sind die Versionsvariablen nun wie folgt:</para>
<programlisting>PORTNAME= gtkmumble
PORTVERSION= 0.3
PORTEPOCH= 1</programlisting>
<para><makevar>PKGNAME</makevar> wird zu
<literal>gtkmumble-0.3,1</literal></para>
<note>
<para>Falls <makevar>PORTEPOCH</makevar> mit diesem
Upgrade auf <literal>0</literal> zurückgesetzt
worden wäre, dann würde jemand, der das Paket
<literal>gtkmumble-0.10_1</literal> installiert
hätte, das Paket <literal>gtkmumble-0.3</literal>
nicht als neuer erkennen, da <literal>3</literal> immer
noch numerisch kleiner ist als <literal>10</literal>.
Bedenken Sie, dass genau dies der springende Punkt an
<makevar>PORTEPOCH</makevar> ist.</para>
</note>
</sect3>
</sect2>
<sect2>
<title><makevar>PKGNAMEPREFIX</makevar> und
<makevar>PKGNAMESUFFIX</makevar></title>
<para>Zwei optionale Variablen,
<makevar>PKGNAMEPREFIX</makevar> und
<makevar>PKGNAMESUFFIX</makevar>, werden verknüpft mit
<makevar>PORTNAME</makevar> und
<makevar>PORTVERSION</makevar>, um
<makevar>PKGNAME</makevar> zu bilden als <literal>
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}
</literal>. Stellen Sie bitte unbedingt sicher, dass diese
Variablen den <link linkend="porting-pkgname">Richtlinien
für einen guten Paketnamen</link> entsprechen.
Insbesondere dürfen Sie
<emphasis>keinesfalls</emphasis> einen Bindestrich
(<literal>-</literal>) in <makevar>PORTVERSION</makevar>
verwenden. Falls das Paket den
<replaceable>language-</replaceable> oder
<replaceable>-compiled.specifics</replaceable>-Teil aufweist
(siehe unten) benutzen Sie <makevar>PKGNAMEPREFIX</makevar>
oder <makevar>PKGNAMESUFFIX</makevar> respektive. Machen Sie
diese Variablen nicht zum Bestandteil von
<makevar>PORTNAME</makevar>!</para>
</sect2>
<sect2>
<title><makevar>LATEST_LINK</makevar></title>
<para>Die Umgebungsvariable <makevar>LATEST_LINK</makevar> wird
während der Paketerstellung verwendet, um einen Kurznamen
festzulegen, der danach von <command>pkg_add -r</command> genutzt
werden kann. Dadurch wird es beispielsweise möglich, die
aktuelle Perl-Version durch einen einfachen Aufruf von
<command>pkg_add -r perl</command> zu installieren (ohne die
Angabe der korrekten Versionsnummer). Dieser Name muss eindeutig
sowie <quote>offensichtlich</quote> sein.</para>
<para>In einigen Fällen können mehrere Versionen
einer Applikation gleichzeitig in der Ports-Sammlung sein.
Das index build- und das package build-System müssen
nun in der Lage sein, diese als unterschiedliche Ports zu
erkennen, obwohl diese Versionen alle die gleichen Variablen
<makevar>PORTNAME</makevar>,
<makevar>PKGNAMEPREFIX</makevar> und sogar
<makevar>PKGNAMESUFFIX</makevar> aufweisen. In solchen
Fällen sollte die optionale Variable
<makevar>LATEST_LINK</makevar> auf einen unterschiedlichen
Wert für alle Ports gesetzt werden mit Ausnahme des
<quote>Haupt-Ports</quote>. Beispiele hierfür sind die
<filename>lang/gcc46</filename> und
<filename>lang/gcc</filename>-Ports und die
<filename>www/apache*</filename>-Familie. Wenn Sie die
Umgebungsvariable <makevar>NO_LATEST_LINK</makevar> setzen, wird
kein Link erzeugt, was für alle Versionen (aber nicht für
die <quote>Hauptversion</quote>) nützlich sein kann. Beachten
Sie bitte, dass die Frage der Auswahl der
<quote>wichtigsten</quote> Version
(<quote>am populärsten</quote>,
<quote>am besten Unterstützt</quote>,
<quote>zuletzt gepatcht</quote> usw.) ausserhalb der
Möglichkeiten dieses Handbuches liegt. Wir sagen Ihnen
nur, wie Sie die anderen Ports spezifizieren, nachdem Sie
den <quote>Haupt-Port</quote> erkoren haben.</para>
</sect2>
<sect2 id="porting-pkgname">
<title>Namensregeln für Pakete</title>
<para>Im Folgenden finden Sie die Regeln für die
Benennung Ihrer Pakete. Diese sollen gewährleisten,
dass das Paketverzeichnis leicht zu durchsuchen ist, da es
bereits abertausende Pakete gibt und die Nutzer sich mit
Schauder abwenden, wenn Ihre Augen überstrapaziert
werden!</para>
<para>Der Paketname soll aussehen wie
<filename><replaceable><optional>language<optional>_region</optional></optional>-name<optional><optional>-</optional>compiled.specifics</optional>-version.numbers</replaceable></filename>.</para>
<para>Der Paketname ist definiert als
<literal>
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}
</literal>. Stellen Sie bitte sicher, dass die Variablen
Ihres Ports diesem Format entsprechen.</para>
<orderedlist>
<listitem>
<para>FreeBSD bemüht sich ausserordentlich, die
Landessprachen seiner Nutzer zu unterstützen.
Die <replaceable>language-</replaceable>Variable soll
eine Abkürzung mit 2 Buchstaben sein der Sprachen
gemäß ISO-639, falls der Port für eine
bestimmte Sprache spezifisch ist.
Beispiele hierfür sind <literal>ja</literal>
für Japanisch, <literal>ru</literal> für
Russisch, <literal>vi</literal> für Vietnamesisch,
<literal>zh</literal> für Chinesisch,
<literal>ko</literal> für Koreanisch und
<literal>de</literal> für Deutsch.</para>
<para>Sollte der Port spezifisch sein für eine
gewisse Region innerhalb eines Sprachraumes, dann
fügen Sie bitte auch den Ländercode mit 2
Buchstaben hinzu. Beispiele sind
<literal>en_US</literal> für nordamerikanisches
Englisch und <literal>fr_CH</literal> für
schweizerisches Französisch.</para>
<para>Der <replaceable>language-</replaceable>Teil muss
in der <makevar>PKGNAMEPREFIX</makevar>-Variable gesetzt
werden.</para>
</listitem>
<listitem>
<para>Der erste Buchstabe des
<filename>name</filename>-Teils muss kleingeschrieben
werden (der Rest des Namens kann Großbuchstaben
enthalten. Daher seien Sie bitte umsichtig, wenn Sie den
Namen einer Software konvertieren, welche
Grossbuchstaben enthält).
Es ist Tradition, <literal>Perl 5</literal>-Module durch
ein vorstehendes <literal>p5-</literal> und durch
Umwandlung des doppelten Doppelpunktes in Bindestriche
zu bezeichnen. So wird z.B. aus dem
<literal>Data::Dumper</literal>-Modul der
<literal>p5-Data-Dumper</literal>-Port.</para>
</listitem>
<listitem>
<para>Vergewissern Sie sich, dass der Name des Ports und
seine Versionsnummer klar getrennt sind und in den
Variablen <makevar>PORTNAME</makevar> und
<makevar>PORTVERSION</makevar> stehen. Der einzige
Grund, um in <makevar>PORTNAME</makevar> einen
Versionsteil aufzunehmen ist der, dass die Software
wirklich so bezeichnet wird, wie z.B. die Ports
<filename>textproc/libxml2</filename> oder
<filename>japanese/kinput2-freewnn</filename>.
Ansonsten sollte <makevar>PORTNAME</makevar> keine
versionsspezifischen Bestandteile aufweisen. Es ist
vollkommen normal, dass viele Ports den gleichen
<makevar>PORTNAME</makevar> aufweisen wie z.B. die
<filename>www/apache*</filename>-Ports. In diesem Falle
werden unterschiedliche Versionen (und unterschiedliche
Indexeinträge) unterschieden durch die Werte von
<makevar>PKGNAMEPREFIX</makevar>,
<makevar>PKGNAMESUFFIX</makevar> und
<makevar>LATEST_LINK</makevar>.</para>
</listitem>
<listitem>
<para>Falls der Port mit verschiedenen, <link
linkend="makefile-masterdir">fest kodierten
Vorgaben</link> (üblicherweise Teil des
Verzeichnisnamens in einer Familie von Ports) gebaut
werden kann, dann soll der
<replaceable>-compiled.specifics</replaceable>-Teil die
einkompilierten Vorgaben anzeigen (der Bindestrich ist
optional). Beispiele hierfür sind
Papiergrößen und Font-Einheiten.</para>
<para>Der
<replaceable>-compiled.specifics</replaceable>-Teil
muss in der Variablen <makevar>PKGNAMESUFFIX</makevar>
gesetzt werden.</para>
</listitem>
<listitem>
<para>Die Versionszeichenfolge sollte einen Bindestrich
(<literal>-</literal>) am Schluss haben und eine von
Punkten getrennte Liste von Integer-Zahlen und
kleingeschriebenen Buchstaben sein.
Es ist nicht zulässig, einen weiteren Bindestrich
innerhalb des Versionsstrings zu verwenden! Die einzige
Ausnahme hiervon ist die Zeichenfolge
<literal>pl</literal> (bedeutet
<quote>patchlevel</quote>), welche
<emphasis>nur</emphasis> dann gebraucht werden darf,
wenn die Applikation über keine
Haupt&ndash;&nbsp;oder Unterversionsnummern
verfügt. Wenn die Versionsbezeichnung der Software
Zeichenketten wie <quote>alpha</quote>,
<quote>beta</quote>, <quote>rc</quote> oder
<quote>pre</quote> enthält, dann nehmen Sie bitte
den ersten Buchstaben daraus und setzen ihn unmittelbar
hinter einen Punkt.
Falls die Versionszeichenfolge nach diesem Punkt
fortgesetzt wird, sollen die Zahlen ohne einen Punkt
zwischen den einzelnen Buchstaben folgen.</para>
<para>Das Ziel ist es, die Ports anhand der
Versionszeichenfolge zu sortieren. Stellen Sie bitte
unbedingt sicher, dass die Bestandteile der
Versionsnummer immer durch einen Punkt getrennt sind
und falls Datumsangaben verwendet werden, dass diese im Format
<literal>0.0.<replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>
und nicht <literal><replaceable>dd</replaceable>.<replaceable>mm</replaceable>.<replaceable>yyyy</replaceable>
</literal> oder gar dem nicht Y2K-kompatiblen Format
<literal>
<replaceable>yy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable>
</literal> vorliegen. Es ist wichtig, dass die
Versionsnummer mit <literal>0.0.</literal> beginnt, da die
Versionsnummer im Falle einer Veröffentlichung auf jeden
Fall kleiner als
<literal><replaceable>yyyy</replaceable></literal> sein
wird.</para>
</listitem>
</orderedlist>
<para>Hier sind einige reale Beispiele, die aufzeigen,
wie man den Namen einer Applikation zu einem
vernünftigen Paketnamen umwandelt:</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="6">
<thead>
<row>
<entry>Softwarename</entry>
<entry><makevar>PKGNAMEPREFIX</makevar></entry>
<entry><makevar>PORTNAME</makevar></entry>
<entry><makevar>PKGNAMESUFFIX</makevar></entry>
<entry><makevar>PORTVERSION</makevar></entry>
<entry>Grund</entry>
</row>
</thead>
<tbody>
<row>
<entry>mule-2.2.2</entry>
<entry>(leer)</entry>
<entry>mule</entry>
<entry>(leer)</entry>
<entry>2.2.2</entry>
<entry>Keine Änderung erforderlich</entry>
</row>
<row>
<entry>EmiClock-1.0.2</entry>
<entry>(leer)</entry>
<entry>emiclock</entry>
<entry>(leer)</entry>
<entry>1.0.2</entry>
<entry>keine Großbuchstaben für einzelne
Applikationen</entry>
</row>
<row>
<entry>rdist-1.3alpha</entry>
<entry>(leer)</entry>
<entry>rdist</entry>
<entry>(leer)</entry>
<entry>1.3.a</entry>
<entry>Keine Zeichenketten wie
<literal>alpha</literal> erlaubt</entry>
</row>
<row>
<entry>es-0.9-beta1</entry>
<entry>(leer)</entry>
<entry>es</entry>
<entry>(leer)</entry>
<entry>0.9.b1</entry>
<entry>keine Zeichenketten wie <literal>beta</literal>
erlaubt</entry>
</row>
<row>
<entry>mailman-2.0rc3</entry>
<entry>(leer)</entry>
<entry>mailman</entry>
<entry>(leer)</entry>
<entry>2.0.r3</entry>
<entry>keine Zeichenketten wie <literal>rc</literal>
erlaubt</entry>
</row>
<row>
<entry>v3.3beta021.src</entry>
<entry>(leer)</entry>
<entry>tiff</entry>
<entry>(leer)</entry>
<entry>3.3</entry>
<entry>Was sollte denn das eigentlich sein?</entry>
</row>
<row>
<entry>tvtwm</entry>
<entry>(leer)</entry>
<entry>tvtwm</entry>
<entry>(leer)</entry>
<entry>pl11</entry>
<entry>Versionsstring zwingend erforderlich</entry>
</row>
<row>
<entry>piewm</entry>
<entry>(leer)</entry>
<entry>piewm</entry>
<entry>(leer)</entry>
<entry>1.0</entry>
<entry>Versionsstring zwingend erforderlich</entry>
</row>
<row>
<entry>xvgr-2.10pl1</entry>
<entry>(leer)</entry>
<entry>xvgr</entry>
<entry>(leer)</entry>
<entry>2.10.1</entry>
<entry><literal>pl</literal> nur erlaubt, wenn keine
Versionsnummer vorhanden</entry>
</row>
<row>
<entry>gawk-2.15.6</entry>
<entry>ja-</entry>
<entry>gawk</entry>
<entry>(leer)</entry>
<entry>2.15.6</entry>
<entry>Japanische Sprachversion</entry>
</row>
<row>
<entry>psutils-1.13</entry>
<entry>(leer)</entry>
<entry>psutils</entry>
<entry>-letter</entry>
<entry>1.13</entry>
<entry>Papergröße beim Paketbau fix
kodiert</entry>
</row>
<row>
<entry>pkfonts</entry>
<entry>(leer)</entry>
<entry>pkfonts</entry>
<entry>300</entry>
<entry>1.0</entry>
<entry>Paket für 300 DPI Schriftarten</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Falls es in der Originalquelle überhaupt keinen
Anhaltspunkt für irgendeine Versionsbezeichnung gibt
und es unwahrscheinlich ist, dass der Autor jemals eine neue
Version veröffentlichen wird, dann setzen Sie bitte die
Version einfach auf <literal>1.0</literal> (wie im obigen
Beispiel <literal>piewm</literal>). Sie können auch den
Autor fragen oder eine Datumszeichenfolge in der Art
<literal>0.0.<replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>
als Version verwenden.</para>
</sect2>
</sect1>
<sect1 id="makefile-categories">
<title>Kategorisierung</title>
<sect2>
<title><makevar>CATEGORIES</makevar></title>
<para>Wenn ein Paket erzeugt wird, dann wird es unter
<filename>/usr/ports/packages/All</filename> abgelegt und
von einem oder mehreren Unterverzeichnissen werden auf
<filename>/usr/ports/packages</filename> Links erstellt.
Die Namen dieser Unterverzeichnisse werden durch die
Variable <makevar>CATEGORIES</makevar> festgelegt.
Dies geschieht, um dem Nutzer zu helfen, eine große
Zahl von Paketen auf einer FTP-Webseite oder einer CD/DVD
zu durchsuchen.
Bitte werfen Sie einen Blick auf die <link
linkend="porting-categories">Aktuelle Liste der
Kategorien</link> und suchen Sie die beste Kategorie
für Ihren Port aus.</para>
<para>Diese Liste legt auch fest, an welcher Stelle in der
Ports-Sammlung der Port eingefügt wird. Falls Sie
mehrere Kategorien angeben wird angenommen, dass die Dateien
des Ports im Unterverzeichnis mit dem Namen der ersten
angegebenen Kategorie liegen. Schauen Sie bitte <link
linkend="choosing-categories">unten</link> für weitere
Informationen darüber, wie man die richtige Kategorie
bestimmt.</para>
</sect2>
<sect2 id="porting-categories">
<title>Aktuelle Liste der Kategorien</title>
<para>Hier ist die aktuelle Liste der Kategorien. Die mit
einem Asterisk (<literal>*</literal>) bezeichneten sind
<emphasis>virtuelle</emphasis> Kategorien, also solche,
welche über kein eigenes Unterverzeichnis in der
Ports-Sammlung verfügen. Sie werden nur als
Sekundärkategorien benutzt und sind nur für
Suchzwecke eingerichtet worden.</para>
<note>
<para>Für nicht-virtuelle Kategorien finden Sie eine
einzeilige Beschreibung in der Variable
<makevar>COMMENT</makevar> im
<filename>Makefile</filename> des jeweiligen
Unterverzeichnisses.</para>
</note>
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
<thead>
<row>
<entry>Kategorie</entry>
<entry>Beschreibung</entry>
<entry>Anmerkung</entry>
</row>
</thead>
<tbody>
<row>
<entry><filename>accessibility</filename></entry>
<entry>Ports für behinderte Menschen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>afterstep*</filename></entry>
<entry>Ports für den <ulink
url="http://www.afterstep.org">AfterStep</ulink>
Window Manager.</entry>
<entry></entry>
</row>
<row>
<entry><filename>arabic</filename></entry>
<entry>Arabische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>archivers</filename></entry>
<entry>Archivierungswerkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>astro</filename></entry>
<entry>Ports für Astronomie.</entry>
<entry></entry>
</row>
<row>
<entry><filename>audio</filename></entry>
<entry>Sound-Unterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>benchmarks</filename></entry>
<entry>Benchmarking-Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>biology</filename></entry>
<entry>Software für Biologie.</entry>
<entry></entry>
</row>
<row>
<entry><filename>cad</filename></entry>
<entry>CAD-Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>chinese</filename></entry>
<entry>Chinesische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>comms</filename></entry>
<entry>Kommunikationsprogramme.</entry>
<entry>Hauptsächlich Software für serielle
Schnittstellen.</entry>
</row>
<row>
<entry><filename>converters</filename></entry>
<entry>Zeichensatz-Konverter.</entry>
<entry></entry>
</row>
<row>
<entry><filename>databases</filename></entry>
<entry>Datenbanken.</entry>
<entry></entry>
</row>
<row>
<entry><filename>deskutils</filename></entry>
<entry>Dinge, die vor der Erfindung des Computers
auf dem Schreibtisch waren.</entry>
<entry></entry>
</row>
<row>
<entry><filename>devel</filename></entry>
<entry>Entwicklungs-Werkzeuge.</entry>
<entry>Legen Sie keine Bibliotheken hier ab, nur weil
es Bibliotheken sind, es sei denn, sie gehören
wirklich nirgendwo anders hin.</entry>
</row>
<row>
<entry><filename>dns</filename></entry>
<entry>DNS-bezogene Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>docs*</filename></entry>
<entry>Meta-Ports für die
FreeBSD-Dokumentation.</entry>
<entry></entry>
</row>
<row>
<entry><filename>editors</filename></entry>
<entry>allgemeine Editoren.</entry>
<entry>Spezielle Editoren gehören in Ihre
jeweilige Kategorie, (z.B. gehört ein
mathematischer Formeleditor in
<filename>math</filename>).</entry>
</row>
<row>
<entry><filename>elisp*</filename></entry>
<entry>Emacs-lisp-Ports.</entry>
<entry></entry>
</row>
<row>
<entry><filename>emulators</filename></entry>
<entry>Emulatoren für andere Betriebssysteme.
</entry>
<entry>Terminal-Emulatoren gehören
<emphasis>nicht</emphasis> hierher; X-basierende
gehören zu <filename>x11</filename> und
text-basierende zu <filename>comms</filename> oder
<filename>misc</filename>, abhängig von deren
genauer Funktionalität.</entry>
</row>
<row>
<entry><filename>finance</filename></entry>
<entry>Finanz-Software und ähnliches.</entry>
<entry></entry>
</row>
<row>
<entry><filename>french</filename></entry>
<entry>Französische Sprachunterstützung.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>ftp</filename></entry>
<entry>FTP Client- und Server-Werkzeuge.</entry>
<entry>Falls Ihr Port sowohl FTP als auch HTTP
unterstützt, stellen Sie ihn in
<filename>ftp</filename> mit der Zweitkategorie
<filename>www</filename>.</entry>
</row>
<row>
<entry><filename>games</filename></entry>
<entry>Spiele.</entry>
<entry></entry>
</row>
<row>
<entry><filename>geography*</filename></entry>
<entry>geografische Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>german</filename></entry>
<entry>Deutsche Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>gnome*</filename></entry>
<entry>Ports für <ulink
url="http://www.gnome.org">GNOME</ulink></entry>
<entry></entry>
</row>
<row>
<entry><filename>gnustep*</filename></entry>
<entry>Software für GNUstep.</entry>
<entry></entry>
</row>
<row>
<entry><filename>graphics</filename></entry>
<entry>grafische Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>hamradio*</filename></entry>
<entry>Software für Amateurfunk.</entry>
<entry></entry>
</row>
<row>
<entry><filename>haskell*</filename></entry>
<entry>Software für die
Haskell-Programmiersprache.</entry>
<entry></entry>
</row>
<row>
<entry><filename>hebrew</filename></entry>
<entry>Hebräische Sprachunterstützung.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>hungarian</filename></entry>
<entry>Ungarische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>ipv6*</filename></entry>
<entry>IPv6-bezogene Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>irc</filename></entry>
<entry>Internet Relay Chat (IRC)-Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>japanese</filename></entry>
<entry>Japanische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>java</filename></entry>
<entry>Software für die Java&trade;-Programmiersprache.
</entry>
<entry>Die <filename>java</filename>-Kategorie sollte
nicht die Einzige für einen Port sein mit
Ausnahme der direkt nur mit der Programmiersprache
zusammenhängenden Applikationen. Porter sollten
<filename>java</filename> nicht als Hauptkategorie
eines Ports wählen.</entry>
</row>
<row>
<entry><filename>kde*</filename></entry>
<entry>Ports für das <ulink
url="http://www.kde.org">K Desktop Environment
(KDE)</ulink>-Projekt.</entry>
<entry></entry>
</row>
<row>
<entry><filename>kld*</filename></entry>
<entry>Kernelmodule.</entry>
<entry></entry>
</row>
<row>
<entry><filename>korean</filename></entry>
<entry>Koreanische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>lang</filename></entry>
<entry>Programmiersprachen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>linux*</filename></entry>
<entry>Linux-Applikationen und -Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>lisp*</filename></entry>
<entry>Software für die Lisp-Programmiersprache.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>mail</filename></entry>
<entry>Mail-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>math</filename></entry>
<entry>Numerische Berechnungen und andere
mathematische Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>mbone*</filename></entry>
<entry>MBone-Applikationen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>misc</filename></entry>
<entry>Verschiedene Werkzeuge.</entry>
<entry>Hauptsächlich Werkzeuge, die nicht
anderswo hingehören. Versuchen Sie, falls
irgend möglich, eine bessere Kategorie
für Ihren Port zu finden als
<literal>misc</literal>, weil Ports hier leicht
untergehen.</entry>
</row>
<row>
<entry><filename>multimedia</filename></entry>
<entry>Multimedia-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>net</filename></entry>
<entry>Verschiedene Netzwerk-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>net-im</filename></entry>
<entry>Instant Messaging-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>net-mgmt</filename></entry>
<entry>Netzwerk-Management-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>net-p2p</filename></entry>
<entry>Peer to peer-Netzwerkprogramme.</entry>
<entry></entry>
</row>
<row>
<entry><filename>news</filename></entry>
<entry>USENET News-Software.</entry>
<entry></entry>
</row>
<row>
<entry><filename>palm</filename></entry>
<entry>Software für <ulink
url="http://www.palm.com/">Palm&trade;</ulink>.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>parallel*</filename></entry>
<entry>Applikationen für paralleles Rechnen.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>pear*</filename></entry>
<entry>Ports für das Pear PHP-Framework.</entry>
<entry></entry>
</row>
<row>
<entry><filename>perl5*</filename></entry>
<entry>Ports, welche <application>Perl</application>
Version 5 benötigen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>plan9*</filename></entry>
<entry>Verschiedene Programme von <ulink
url="http://www.cs.bell-labs.com/plan9dist/">Plan9</ulink>.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>polish</filename></entry>
<entry>Polnische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>ports-mgmt</filename></entry>
<entry>Hilfsprogramme für das Installieren und
Entwickeln von FreeBSD Ports und Paketen.</entry>
</row>
<row>
<entry><filename>portuguese</filename></entry>
<entry>Portugiesische Sprachunterstützung.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>print</filename></entry>
<entry>Drucker-Software.</entry>
<entry>Desktop Veröffentlichungs-Werkzeuge (DTP,
Betrachter etc.) gehören auch hierher.</entry>
</row>
<row>
<entry><filename>python*</filename></entry>
<entry>Software für <ulink
url="http://www.python.org/">Python</ulink>.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>ruby*</filename></entry>
<entry>Software für <ulink
url="http://www.ruby-lang.org/">Ruby</ulink>.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>rubygems*</filename></entry>
<entry>Ports für <ulink
url="http://www.rubygems.org/">RubyGems</ulink>-Pakete.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>russian</filename></entry>
<entry>Russische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>scheme*</filename></entry>
<entry>Software für die
Scheme-Programmiersprache.</entry>
<entry></entry>
</row>
<row>
<entry><filename>science</filename></entry>
<entry>Wissenschaftliche Programme, die in keine
andere Kategorie passen wie z.B.
<filename>astro</filename>,
<filename>biology</filename> und
<filename>math</filename>.</entry>
<entry></entry>
</row>
<row>
<entry><filename>security</filename></entry>
<entry>Security-Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>shells</filename></entry>
<entry>Shells.</entry>
<entry></entry>
</row>
<row>
<entry><filename>spanish*</filename></entry>
<entry>Spanische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>sysutils</filename></entry>
<entry>System-Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>tcl*</filename></entry>
<entry>Ports, welche Tcl benötigen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>textproc</filename></entry>
<entry>Textverarbeitungsprogramme.</entry>
<entry>Dies beinhaltet nicht DTP-Werkzeuge, diese
gehören in <filename>print</filename>.
</entry>
</row>
<row>
<entry><filename>tk*</filename></entry>
<entry>Ports, welche Tk benötigen.</entry>
<entry></entry>
</row>
<row>
<entry><filename>ukrainian</filename></entry>
<entry>Ukrainische Sprachunterstützung.</entry>
<entry></entry>
</row>
<row>
<entry><filename>vietnamese</filename></entry>
<entry>Vietnamesische Sprachunterstützung.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>windowmaker*</filename></entry>
<entry>Ports für den WindowMaker Window-Manager.
</entry>
<entry></entry>
</row>
<row>
<entry><filename>www</filename></entry>
<entry>Software für das World Wide Web (WWW).
</entry>
<entry>HTML-Werkzeuge gehören auch hierher.
</entry>
</row>
<row>
<entry><filename>x11</filename></entry>
<entry>X-Window-System und dergleichen.</entry>
<entry>Diese Kategorie ist nur für Software,
welche direkt X unterstützt.
Fügen Sie keine normalen X-Applikationen hinzu.
Die meisten davon gehören in eine andere
<filename>x11-*</filename>-Kategorie (siehe unten).
Falls Ihr Port eine X-Applikation
<emphasis>ist</emphasis>, dann definieren Sie bitte
<makevar>USE_XLIB</makevar> (impliziert durch
<makevar>USE_IMAKE</makevar>) und fügen ihn der
entsprechenden Kategorie hinzu.</entry>
</row>
<row>
<entry><filename>x11-clocks</filename></entry>
<entry>X11-Uhren.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-drivers</filename></entry>
<entry>X11-Treiber.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-fm</filename></entry>
<entry>X11-Dateimanager.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-fonts</filename></entry>
<entry>X11-Schriftarten und Werkzeuge.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-servers</filename></entry>
<entry>X11-Server.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-themes</filename></entry>
<entry>X11-Themes.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-toolkits</filename></entry>
<entry>X11-Toolkits.</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-wm</filename></entry>
<entry>X11-Window-Manager.</entry>
<entry></entry>
</row>
<row>
<entry><filename>xfce*</filename></entry>
<entry>Ports in Zusammenhang mit <ulink
url="http://www.xfce.org/">Xfce</ulink>.</entry>
<entry></entry>
</row>
<row>
<entry><filename>zope*</filename></entry>
<entry><ulink
url="http://www.zope.org/">Zope</ulink>-Unterstützung.
</entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2 id="choosing-categories">
<title>Wählen der richtigen Kategorie</title>
<para>Da viele der Kategorien sich überlappen,
müssen Sie oft festlegen, welches die primäre
Kategorie Ihres Ports ist. Hierzu gibt es einige Regeln,
welche diese Auswahl bestimmen. Hier ist die Liste der
Regeln mit abnehmender Wichtigkeit:</para>
<itemizedlist>
<listitem>
<para>Die erste (primäre) Kategorie muss eine
physische (keine virtuelle, siehe <link
linkend="porting-categories">oben</link>) sein. Dies
ist notwendig damit Pakete erstellt werden können.
Die nachfolgenden Kategorien können wahllos
virtuelle oder physische Kategorien sein.</para>
</listitem>
<listitem>
<para>Sprachspezifische Kategorien kommen immer zuerst.
Wenn Ihr Port z.B. Japanische X11-Schriftarten
installiert, dann muss Ihre
<makevar>CATEGORIES</makevar>-Zeile
<filename>japanese x11-fonts</filename>
enthalten.</para>
</listitem>
<listitem>
<para>Spezifische Kategorien werden vor weniger
spezifischen Kategorien aufgelistet. Ein HTML-Editor
sollte z.B. als <filename>www editors</filename>
aufgeführt werden und nicht umgekehrt.
Genauso sollten Sie keinen Port unter
<filename>net</filename> aufführen, wenn er zu
<filename>irc</filename>, <filename>mail</filename>,
<filename>news</filename>,
<filename>security</filename> oder
<filename>www</filename> passt, da
<filename>net</filename> in diesen Kategorien
bereits implizit eingeschlossen ist.</para>
</listitem>
<listitem>
<para><filename>x11</filename> wird nur als sekundäre
Kategorie benutzt, wenn die primäre Kategorie eine
sprachspezifische ist. Keinesfalls sollten Sie
<filename>x11</filename> in die Kategorie-Zeile einer
X-Applikation setzen.</para>
</listitem>
<listitem>
<para><application>Emacs</application> modes gehören
in die gleiche Kategorie wie die vom jeweiligen mode
unterstützte Applikation und nicht in
<filename>editors</filename>. Ein
<application>Emacs</application> mode z.B. für das
Editieren von Quelltext einer bestimmten
Programmiersprache gehört zur Kategorie
<filename>lang</filename>.</para>
</listitem>
<listitem>
<para>Für Ports, die vom Benutzer ladbare Kernelmodule
installieren, sollte die virtuelle Kategorie
<filename>kld</filename> in die
<makevar>CATEGORIES</makevar>-Zeile aufgenommen
werden.</para>
</listitem>
<listitem>
<para><filename>misc</filename> sollte nicht zusammen mit
irgendeiner anderen nicht-virtuellen Kategorie
auftreten. Falls Sie <literal>misc</literal> mit einer
anderen Kategorie in <makevar>CATEGORIES</makevar> haben
bedeutet dies, dass Sie gefahrlos
<literal>misc</literal> streichen und die andere
Kategorie alleine verwenden können!</para>
</listitem>
<listitem>
<para>Falls Ihr Port wirklich in keine andere Kategorie
passt, verwenden Sie bitte
<filename>misc</filename>.</para>
</listitem>
</itemizedlist>
<para>Falls Sie sich über die Kategorie im Unklaren sind,
hinterlassen Sie bitte einen Kommentar in Ihrem per
&man.send-pr.1; eingereichten Bericht, damit wir diese Frage
vor dem Import diskutieren können. Falls Sie ein
Committer sind, schicken Sie bitte eine Nachricht an
&a.ports;, damit die Frage im Vorhinein erörtert werden
kann. Neue Ports werden zu häufig falsch kategorisiert
und werden sofort wieder verschoben. Das bläht das
Master Source Repository unnötig auf.</para>
</sect2>
<sect2 id="proposing-categories">
<title>Eine neue Kategorie vorschlagen</title>
<para>Da die Ports-Sammlung über viele Jahre gewachsen
ist, wurden viele neue Kategorien hinzugefügt. Neue
Kategorien können <emphasis>virtuell</emphasis> (ohne
eigenes Unterverzeichnis in der Ports-Sammlung) oder
<emphasis>physisch</emphasis> sein.
Der nachfolgende Text führt einige Punkte auf, welche
bei der Neueinführung einer physischen Kategorie
beachtet werden müssen, damit Sie dies bei einem
eventuellen Vorschlag Ihrerseits berücksichtigen
können.</para>
<para>Unsere bestehende Maxime ist die Vermeidung der
Neuanlage von physischen Kategorien, solange nicht eine
große Zahl von Ports zugeordnet werden können
oder falls ihr nicht Ports zugehören würden,
welche eine logisch abgegrenzte Gruppe von limitiertem
öffentlichem Interesse zugehören würden
(zum Beispiel neue Sprachkategorien) oder vorzugsweise
beides.</para>
<para>Die Erklärung dafür ist, dass eine Neuanlage
einer physischen Kategorie einen <ulink
url="&url.articles.committers-guide;/article.html#PORTS">erheblichen
Arbeitsaufwand</ulink> sowohl für die Committer als
auch diejenigen Nutzer bedeutet, welche die Änderungen
der Ports-Sammlung nachvollziehen. Zusätzlich
verursachen Vorschläge für neue Kategorien oftmals
Kontroversen (natürlich deswegen, weil es keinen klaren
Konsens darüber gibt, welche Kategorie als <quote>zu
groß</quote> betrachtet werden muss noch ob sich
bestimmte Kategorien zur einfachen Suche eignen (und wie
viele Kategorien überhaupt ideal wären) und so
weiter).</para>
<para>Hier ist das Prozedere:</para>
<procedure>
<step>
<para>Schlagen Sie die neue Kategorie auf &a.ports; vor.
Sie sollten eine detaillierte Begründung für
die neue Kategorie beifügen einschließlich
einer Erklärung, warum Sie meinen, die
existierenden Kategorien seien nicht ausreichend.
Zeigen Sie außerdem eine Liste der zu
verschiebenden Ports (falls neue Ports in
<application>GNATS</application> auf ihren commit
warten, die in diese Kategorie passen würden.
Listen Sie diese bitte auch mit auf). Sind Sie der
Maintainer oder Einreicher dieser Ports, erwähnen
Sie es bitte. Es verleiht Ihrem Vorschlag mehr
Gewicht.</para>
</step>
<step>
<para>Nehmen Sie an der Diskussion teil.</para>
</step>
<step>
<para>Falls es Unterstützung für Ihren Vorschlag
geben sollte, reichen Sie bitte einen PR ein, welcher
die Begründung und die Liste der betroffenen Ports
enthält, die verschoben werden müssen.
Idealerweise sollte der PR Patches für Folgendes
enthalten:</para>
<itemizedlist>
<listitem>
<para><filename>Makefile</filename>s für die
neuen Ports nach dem Repocopy</para>
</listitem>
<listitem>
<para><filename>Makefile</filename> für die neue
Kategorie</para>
</listitem>
<listitem>
<para><filename>Makefile</filename> für die alten
Kategorien der betroffenen Ports</para>
</listitem>
<listitem>
<para><filename>Makefile</filename>s für Ports,
welche von den alten Ports abhängen</para>
</listitem>
<listitem>
<para>Für zusätzliches Ansehen sorgen Sie,
wenn Sie die anderen Dateien, die geändert
werden müssen, beifügen wie in der
Direktive des Committer's Guide beschrieben.</para>
</listitem>
</itemizedlist>
</step>
<step>
<para>Da es die Ports-Infrastruktur beeinflusst und nicht
nur die Durchführung von Repocopies und
möglicherweise sogar Regressionstests auf dem Build
Cluster durchgeführt werden müssen, sollte der
PR dem Ports Management Team &a.portmgr; zugeordnet
werden.</para>
</step>
<step>
<para>Sobald der PR bestätigt wurde muss ein
Committer den Rest der Prozedur durchführen, welche
im <ulink url="&url.articles.committers-guide;/#ports">
Committers Guide</ulink> beschrieben ist.</para>
</step>
</procedure>
<para>Das Vorschlagen einer neuen virtuellen Kategorie ist
ähnlich, aber wesentlich weniger aufwendig, weil
keine Ports verschoben werden müssen. In diesem Falle
müssen nur die Patches an den PR beigefügt werden,
welche die neue Kategorie zur Variable
<makevar>CATEGORIES</makevar> der betroffenen Ports
hinzufügen.</para>
</sect2>
<sect2 id="proposing-reorg">
<title>Vorschlagen einer Neuorganisation aller
Kategorien</title>
<para>Von Zeit zu Zeit schlägt jemand eine komplette
Neuorganisation aller Ports, entweder mit einer zweistufigen
Struktur oder irgendeiner Art von
Schlüsselwörtern, vor. Bis heute wurde keiner
dieser Vorschläge umgesetzt, weil sie zwar einfach
zu machen sind, aber der Aufwand zur Umsetzung und
Reorganisation der kompletten Ports-Sammlung schlichtweg
mörderisch wäre. Bitte lesen Sie die Geschichte
dieser Vorschläge in den Archiven der Mailinglisten
nach, bevor Sie diese Ideen nochmals unterbreiten. Zudem
sollten Sie gewappnet sein, dass man Sie auffordert, einen
arbeitsfähigen Prototyp vorzulegen.</para>
</sect2>
</sect1>
<sect1 id="makefile-distfiles">
<title>Die Distributionsdateien</title>
<para>Der zweite Teil des <filename>Makefile</filename>
beschreibt die Dateien, welche heruntergeladen werden
müssen, um den Port zu bauen und wo diese Dateien zu
finden sind.</para>
<sect2>
<title><makevar>DISTVERSION/DISTNAME</makevar></title>
<para><makevar>DISTNAME</makevar> ist der Name der Applikation
wie er von den Autoren vergeben wurde.
<makevar>DISTNAME</makevar> hat als Vorgabe
<literal>${PORTNAME}-${PORTVERSION}</literal> also
überschreiben Sie diese Vorgabe nur, wenn es notwendig
ist. <makevar>DISTNAME</makevar> wird nur an zwei Stellen
genutzt. Erstens: (<makevar>DISTFILES</makevar>) hat als
Vorgabe
<makevar>${DISTNAME}</makevar><makevar>${EXTRACT_SUFX}</makevar>.
Zweitens: Die Distributionsdatei soll in einem
Unterverzeichnis namens <makevar>WRKSRC</makevar>
extrahiert werden, dessen Vorgabe
<filename>work/<makevar>${DISTNAME}</makevar></filename>
ist.</para>
<para>Manche Drittanbieter-Namen, welche nicht in das Schema
<literal>${PORTNAME}-${PORTVERSION}</literal> passen,
können durch Setzen von <makevar>DISTVERSION</makevar>
automatisch behandelt werden. <makevar>PORTVERSION</makevar>
und <makevar>DISTNAME</makevar> werden automatisch
abgeleitet, können aber natürlich manuell
überschrieben werden. Die folgende Tabelle führt
einige Beispiele auf:</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry><makevar>DISTVERSION</makevar></entry>
<entry><makevar>PORTVERSION</makevar></entry>
</row>
</thead>
<tbody>
<row>
<entry>0.7.1d</entry>
<entry>0.7.1.d</entry>
</row>
<row>
<entry>10Alpha3</entry>
<entry>10.a3</entry>
</row>
<row>
<entry>3Beta7-pre2</entry>
<entry>3.b7.p2</entry>
</row>
<row>
<entry>8:f_17</entry>
<entry>8f.17</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para><makevar>PKGNAMEPREFIX</makevar> und
<makevar>PKGNAMESUFFIX</makevar> beeinflussen
<makevar>DISTNAME</makevar> nicht. Beachten Sie bitte
auch, dass Sie <makevar>DISTNAME</makevar>
unverändert lassen sollten, falls
<makevar>WRKSRC</makevar> denselben Wert hat wie
<filename>work/<makevar>${PORTNAME}-${PORTVERSION}</makevar></filename>
und gleichzeitig dass Archiv des originalen Quelltextes
anders benannt ist als
<makevar>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</makevar>.
Es ist einfacher
<makevar>DISTFILES</makevar> zu definieren, als
<makevar>DISTNAME</makevar> und <makevar>WRKSRC</makevar>
(und möglicherweise <makevar>EXTRACT_SUFX</makevar>)
zu setzen.</para>
</note>
</sect2>
<sect2>
<title><makevar>MASTER_SITES</makevar></title>
<para>Dokumentieren Sie das Verzeichnis der FTP/HTTP-URL,
welche auf den originalen Tarball zeigt, in der Variable
<makevar>MASTER_SITES</makevar>. Bitte vergessen Sie
niemals den Schrägstrich (<filename>/</filename>)
am Ende!</para>
<para>Die <command>make</command>-Makros werden versuchen,
diese Festlegung für die Aufbereitung der
Distributionsdateien mittels <makevar>FETCH</makevar> zu
benutzen, falls sie diese nicht schon auf dem System
finden.</para>
<para>Es wird empfohlen, mehrere Webseiten in dieser Liste
aufzuführen, vorzugsweise auf verschiedenen
Kontinenten. Dies ist ein Schutz gegen Probleme bei
größeren Ausfällen im Internet.
Wir planen sogar Unterstützung einzubauen,
die automatisch einen Server in der Nähe zum
Herunterladen bestimmt. Die Verfügbarkeit von
vielen Webseiten wird dieses Vorhaben beträchtlich
erleichtern.</para>
<para>Falls der originale Tarball Teil eines populären
Archivs ist, wie SourceForge, GNU oder Perl CPAN, können
Sie möglicherweise auf diese Seiten in einer einfachen
und kompakten Form mittels
<makevar>MASTER_SITE_<replaceable>*</replaceable></makevar>
(d.h., <makevar>MASTER_SITE_SOURCEFORGE</makevar>,,
<makevar>MASTER_SITE_GNU</makevar> und
<makevar>MASTER_SITE_PERL_CPAN</makevar>) referenzieren.
Setzen Sie einfach <makevar>MASTER_SITES</makevar> auf eine
dieser Variablen und <makevar>MASTER_SITE_SUBDIR</makevar>
auf den Pfad innerhalb des Archivs. Hier ist ein
Beispiel:</para>
<programlisting>MASTER_SITES= ${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR= make</programlisting>
<para>Oder verwenden Sie ein kondensiertes Format:</para>
<programlisting>MASTER_SITES= GNU/make</programlisting>
<para>Diese Variablen werden in
<filename>/usr/ports/Mk/bsd.sites.mk</filename> definiert.
Es werden ständig neue Einträge hinzugefügt,
daher stellen Sie bitte unbedingt sicher, dass Sie die
neueste Version verwenden, bevor Sie einen Port
einschicken.</para>
<para>Für beliebte Seiten existieren sogenannte
<emphasis>magic</emphasis>-Makros, die eine bestimmte
Verzeichnisstruktur erstellen. Um eines dieser Makros zu
verwenden, geben Sie dessen Abkürzung an und Ihr System
wird versuchen, das korrekte Unterverzeichnis automatisch
zu bestimmen.</para>
<programlisting>MASTER_SITES= SF</programlisting>
<para>Ist das Ergebnis nicht korrekt, können Sie diesen
Wert auch überschreiben.</para>
<programlisting>MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}</programlisting>
<table frame="none">
<title>Beliebte magic <makevar>MASTER_SITES</makevar>-Makros</title>
<tgroup cols="2">
<thead>
<row>
<entry>Makro</entry>
<entry>Erwartetes Unterverzeichnis</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>APACHE_JAKARTA</makevar></entry>
<entry><makevar>/dist/jakarta/${PORTNAME:S,-,,/,}/source</makevar></entry>
</row>
<row>
<entry><makevar>BERLIOS</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>CHEESESHOP</makevar></entry>
<entry><makevar>/packages/source/source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}</makevar></entry>
</row>
<row>
<entry><makevar>DEBIAN</makevar></entry>
<entry><makevar>/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>GCC</makevar></entry>
<entry><makevar>/pub/gcc/releases/${DISTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>GNOME</makevar></entry>
<entry><makevar>/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}</makevar></entry>
</row>
<row>
<entry><makevar>GNU</makevar></entry>
<entry><makevar>/gnu/${PORTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>MOZDEV</makevar></entry>
<entry><makevar>/pub/mozdev/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>PERL_CPAN</makevar></entry>
<entry><makevar>/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}</makevar></entry>
</row>
<row>
<entry><makevar>PYTHON</makevar></entry>
<entry><makevar>/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}</makevar></entry>
</row>
<row>
<entry><makevar>RUBYFORGE</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>SAVANNAH</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>SF</makevar></entry>
<entry><makevar>/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}</makevar></entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2>
<title><makevar>EXTRACT_SUFX</makevar></title>
<para>Falls Sie eine Distributionsdatei haben, die ein
eigentümliches Suffix nutzt, um die Art der
Kompression anzuzeigen, dann setzen Sie
<makevar>EXTRACT_SUFX</makevar>.</para>
<para>Ist die Distributionsdatei zum Beispiel im Stil von
<filename>foo.tgz</filename> anstatt des normalen
<filename>foo.tar.gz</filename> benannt, würden Sie
schreiben:</para>
<programlisting>DISTNAME= foo
EXTRACT_SUFX= .tgz</programlisting>
<para>Falls erforderlich, setzen die Variablen
<makevar>USE_BZIP2</makevar> und <makevar>USE_ZIP</makevar>
automatisch <makevar>EXTRACT_SUFX</makevar> auf
<literal>.tar.bz2</literal> oder <literal>.zip</literal>.
Falls keine der beiden gesetzt ist, dann verwendet
<makevar>EXTRACT_SUFX</makevar> die Vorgabe
<literal>.tar.gz</literal>.</para>
<note>
<para>Sie müssen niemals beide Variablen
<makevar>EXTRACT_SUFX</makevar> und
<makevar>DISTFILES</makevar> setzen.</para>
</note>
</sect2>
<sect2>
<title><makevar>DISTFILES</makevar></title>
<para>Manchmal haben die zu ladenden Dateien keinerlei
Ähnlichkeit mit dem Namen des Ports. Es könnte
z.B. <filename>source.tar.gz</filename> oder ähnlich
heißen. In anderen Fällen könnte der
Quelltext in mehreren Archiven sein und alle müssen
heruntergeladen werden.</para>
<para>Falls dies der Fall ist, setzen Sie
<makevar>DISTFILES</makevar> als eine durch Leerzeichen
getrennte Liste aller Dateien, die geladen werden
müssen.</para>
<programlisting>DISTFILES= source1.tar.gz source2.tar.gz</programlisting>
<para>Wenn nicht ausdrücklich gesetzt, verwendet
<makevar>DISTFILES</makevar> als Vorgabe
<literal>${DISTNAME}${EXTRACT_SUFX}</literal>.</para>
</sect2>
<sect2>
<title><makevar>EXTRACT_ONLY</makevar></title>
<para>Falls nur einige der <makevar>DISTFILES</makevar>
extrahiert werden müssen (z.B. eine Datei ist der
Quelltext und eine andere ist ein unkomprimiertes Dokument),
dann listen Sie die zu extrahierenden Dateien in
<makevar>EXTRACT_ONLY</makevar> auf.</para>
<programlisting>DISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gz</programlisting>
<para>Falls <emphasis>keine</emphasis> der
<makevar>DISTFILES</makevar> unkomprimiert sein sollte,
dann setzen Sie <makevar>EXTRACT_ONLY</makevar> auf einen
leeren String.</para>
<programlisting>EXTRACT_ONLY=</programlisting>
</sect2>
<sect2 id="porting-patchfiles">
<title><makevar>PATCHFILES</makevar></title>
<para>Falls Ihr Port zusätzliche Patches benötigt,
welche per FTP oder HTTP verfügbar sind, dann setzen
Sie <makevar>PATCHFILES</makevar> auf den Namen der Dateien
und <makevar>PATCH_SITES</makevar> auf die URL des
Verzeichnisses, das diese Patches enthält (das Format
ist das gleiche wie <makevar>MASTER_SITES</makevar>).</para>
<para>Falls ein Patch wegen einiger zusätzlicher
Pfadnamen nicht relativ zum Anfang des Quelltextbaumes
(d.h., <makevar>WRKSRC</makevar>) liegt, dann setzen Sie
bitte <makevar>PATCH_DIST_STRIP</makevar> entsprechend.
Wenn z.B. alle Pfadnamen in diesem Patch ein
zusätzliches <literal>foozolix-1.0/</literal> vor ihren
Dateinamen aufweisen, dann setzen Sie bitte
<literal>PATCH_DIST_STRIP=-p1</literal>.</para>
<para>Kümmern Sie sich nicht darum, ob die Patches
komprimiert sind. Sie werden automatisch dekomprimiert,
wenn die Dateinamen auf <filename>.gz</filename> oder
<filename>.Z</filename> enden.</para>
<para>Falls der Patch zusammen mit anderen Dateien in einem
gezippten Tarball verteilt wird (z.B. mit Dokumentation),
dann können Sie nicht <makevar>PATCHFILES</makevar>
verwenden. In diesem Fall fügen Sie den Namen und den
Ort dieses Tarballs zu <makevar>DISTFILES</makevar> und
<makevar>MASTER_SITES</makevar>. Benutzen Sie dann die
<makevar>EXTRA_PATCHES</makevar>-Variable, um auf diese
Dateien zu zeigen und <filename>bsd.port.mk</filename>
wird automatisch diese Dateien nutzen. Kopieren Sie
<emphasis>niemals</emphasis> Patch-Dateien in das
<makevar>PATCHDIR</makevar>-Verzeichnis, weil es
möglicherweise nicht beschreibbar ist.</para>
<note>
<para>Der Tarball wird zusammen mit dem anderen Quelltext
extrahiert werden. Eine ausdrückliche Dekomprimierung
eines mit gzip oder compress erzeugten Tarball ist nicht
notwendig. Sollten Sie dies dennoch vorgeben, so beachten
Sie bitte peinlich genau, dass Sie nichts
überschreiben, was bereits im Verzeichnis vorhanden
ist. Vergessen Sie auch nicht den kopierten Patch im
Target von <maketarget>pre-clean</maketarget> zu
entfernen.</para>
</note>
</sect2>
<sect2 id="porting-master-sites-n">
<title>Verschiedene Distributionsdateien oder Patches von
verschiedenen Seiten und Verzeichnissen
(<literal>MASTER_SITES:n</literal>)</title>
<para>(Betrachten Sie es als in irgendeiner Form
<quote>fortgeschrittenes Thema</quote>.
Neulinge sollten möglicherweise diesen Abschnitt
beim ersten Lesen überspringen).</para>
<para>Dieser Abschnitt stellt Informationen über
die Mechanismen zum Herunterladen von Dateien zur
Verfügung und behandelt die Variablen
<literal>MASTER_SITES:n</literal> und
<literal>MASTER_SITES_NN</literal>.
Wir beziehen uns im weiteren Text auf diese Variablen
als <literal>MASTER_SITES:n</literal>.</para>
<para>Etwas Hintergrundinformation zu Beginn: OpenBSD
verfügt über eine sehr elegante Option
innerhalb der Variablen <makevar>DISTFILES</makevar> und
<makevar>PATCHFILES</makevar>. Sowohl Dateien als auch
Patches können mit angehängten
<literal>:n</literal>-Bezeichnern versehen werden wobei
<literal>n</literal> in beiden Fällen
<literal>[0-9]</literal> sein kann und eine
Gruppenzugehörigkeit anzeigt. Ein Beispiel
hierfür ist:</para>
<programlisting>DISTFILES= alpha:0 beta:1</programlisting>
<para>In OpenBSD wird die Datei <filename>alpha</filename>
mit der Variable <makevar>MASTER_SITES0</makevar>
verknüpft anstatt dem in FreeBSD gebräuchlichen
<makevar>MASTER_SITES</makevar> und
<filename>beta</filename> mit
<makevar>MASTER_SITES1</makevar>.</para>
<para>Das ist eine sehr interessante Möglichkeit,
die endlose Suche nach der richtigen Download-Seite zu
verkürzen.</para>
<para>Stellen Sie sich zwei Dateien in
<makevar>DISTFILES</makevar> und 20 Webseiten in der
Variable <makevar>MASTER_SITES</makevar> vor. Alle Seiten
sind erschreckend langsam, <filename>beta</filename>
findet sich auf allen Seiten in
<makevar>MASTER_SITES</makevar> und
<filename>alpha</filename> kann nur auf der zwanzigsten
Seite gefunden werden. Wäre es nicht reine
Verschwendung, wenn der Maintainer alle Seiten zuvor
überprüfen müsste? Kein guter
Start für das wundervolle Wochenende!</para>
<para>Übertragen Sie diesen Umstand auf noch mehr
<makevar>DISTFILES</makevar> und mehr
<makevar>MASTER_SITES</makevar>. Ganz sicher würde
unser <quote>distfiles survey master</quote> die
Erleichterung sehr zu schätzen wissen, die eine
solche Verringerung der Netzwerkbelastung bringen
würde.</para>
<para>In den nächsten Abschnitten sehen Sie die
Implementierung dieser Idee durch FreeBSD. Dabei wurde das
Konzept von OpenBSD ein wenig verbessert.</para>
<sect3>
<title>Prinzipielle Information</title>
<para>Dieser Abschnitt informiert Sie, wie Sie schnell
ein fein granuliertes Herunterladen von vielen Dateien
und Fehlerbereinigungen von verschiedenen Webseiten und
Unterverzeichnissen bewerkstelligen. Wir beschreiben
hier den Fall der vereinfachten Nutzung von
<literal>MASTER_SITES:n</literal>. Das ist für die
meisten Szenarien ausreichend. Falls Sie weitere
Informationen benötigen, sollten Sie den
nächsten Abschnitt lesen.</para>
<para>Einige Programme bestehen aus mehreren Dateien,
welche von verschiedenen Webseiten heruntergeladen werden
müssen. Zum Beispiel besteht
<application>Ghostscript</application> aus dem Kern des
Programms und einer großen Zahl von Treiberdateien,
die vom Drucker des Benutzers abhängen. Einige dieser
Treiberdateien werden mit der Kernapplikation mitgeliefert
aber viele müssen von verschiedenen Webseiten
heruntergeladen werden.</para>
<para>Um das zu unterstützen, muss jeder Eintrag in
<makevar>DISTFILES</makevar> mit einem Komma und
einem <quote>tag name</quote> abgeschlossen werden.
Jeder in <makevar>MASTER_SITES</makevar> aufgeführte
Webseite folgt ein Komma und eine Marke (tag), die
anzeigt, welche Datei von dieser Webseite heruntergeladen
werden kann.</para>
<para>Stellen Sie sich bitte eine Applikation vor, deren
Quelltext in zwei Teile aufgeteilt ist,
<filename>source1.tar.gz</filename>
und <filename>source2.tar.gz</filename>, welche von zwei
verschiedenen Webseiten heruntergeladen werden
müssen. Das <filename>Makefile</filename> des Port
würde Zeilen enthalten wie in
<xref
linkend="ports-master-sites-n-example-simple-use-one-file-per-site"/>.</para>
<example
id="ports-master-sites-n-example-simple-use-one-file-per-site">
<title>Vereinfachtes Beispiel für den Gebrauch von
<literal>MASTER_SITES:n</literal> mit einer Datei pro
Webseite</title>
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2</programlisting>
</example>
<para>Verschiedene Dateien können die gleiche Marke
aufweisen. Ausgehend vom vorherigen Beispiel nehmen wir
an, dass es noch eine dritte Datei gibt
(<filename>source3.tar.gz</filename>), welche von
<hostid>ftp.example2.com</hostid> heruntergeladen werden
soll. Das <filename>Makefile</filename> würde dann
aussehen wie <xref
linkend="ports-master-sites-n-example-simple-use-more-than-one-file-per-site"/>.</para>
<example
id="ports-master-sites-n-example-simple-use-more-than-one-file-per-site">
<title>Vereinfachtes Beispiel für den Gebrauch von
<literal>MASTER_SITES:n</literal> mit mehr als einer
Datei pro Webseite</title>
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2</programlisting>
</example>
</sect3>
<sect3>
<title>Ausführliche Information</title>
<para>In Ordnung, das vorherige Beispiel reicht nicht
für Ihre Bedürfnisse? In diesem Abschnitt
werden wir im Detail erklären, wie der fein
granulierte Mechanismus zum Herunterladen
(<literal>MASTER_SITES:n</literal>) funktioniert
und wie Sie Ihre Ports modifizieren, um ihn zu
nutzen.</para>
<orderedlist>
<listitem>
<para>Elemente können nachstehend bezeichnet werden
mit <literal>:<replaceable>n</replaceable></literal>
wobei <replaceable>n</replaceable> in diesem Falle
<literal>[^:,]+</literal> ist. Das heißt
<replaceable>n</replaceable> könnte theoretisch
jede alphanumerische Zeichenkette sein, aber wir
beschränken sie auf
<literal>[a-zA-Z_][0-9a-zA-Z_]+</literal> für
diesen Moment.</para>
<para>Zudem ist die Zeichenkette case sensitive; d.h.
<literal>n</literal> unterscheidet sich von
<literal>N</literal>.</para>
<para>Allerdings dürfen die folgenden Wörter
nicht gebraucht werden, da sie spezielle Bedeutungen
haben: <literal>default</literal>,
<literal>all</literal> und <literal>ALL</literal>
(diese Wörter werden intern genutzt in Punkt
<xref linkend="porting-master-sites-n-what-changes-in-port-targets"/>).
Ausserdem ist <literal>DEFAULT</literal> ein
reserviertes Wort (beachten Sie <xref
linkend="porting-master-sites-n-DEFAULT-group"/>).</para>
</listitem>
<listitem>
<para>Elemente mit angehängtem
<literal>:n</literal> gehören zur Gruppe
<literal>n</literal>, <literal>:m</literal>
gehört zur Gruppe <literal>m</literal>
und so weiter.</para>
</listitem>
<listitem id="porting-master-sites-n-DEFAULT-group">
<para>Elemente ohne Anhängsel sind gruppenlos,
d.h. sie gehören alle zu der speziellen Gruppe
<literal>DEFAULT</literal>. Falls sie an irgendeinem
Element <literal>DEFAULT</literal> hängen, ist
dies überflüssig, es sei denn Sie wollen,
dass ein Element sowohl zu <literal>DEFAULT</literal>
als auch anderen Gruppen gleichzeitig gehört
(beachten Sie <xref
linkend="porting-master-sites-n-comma-operator"/>).</para>
<para>Die folgenden Beispiele sind gleichwertig, aber
das erste Beispiel ist vorzuziehen:</para>
<programlisting>MASTER_SITES= alpha
MASTER_SITES= alpha:DEFAULT</programlisting>
</listitem>
<listitem>
<para>Gruppen sind nicht ausschliessend, d.h. ein
Element kann mehreren Gruppen gleichzeitig
angehören und eine Gruppe wiederum kann entweder
mehrere Elemente oder überhaupt keine aufweisen.
Wiederholte Elemente sind schlicht nur wiederholte
Elemente.</para>
</listitem>
<listitem id="porting-master-sites-n-comma-operator">
<para>Wenn Sie wollen, dass ein Element gleichzeitig zu
mehreren Gruppen gehört, dann können Sie
diese durch ein Komma (<literal>,</literal>)
trennen.</para>
<para>Anstatt jedes Mal ein anderes Anhängsel zu
verwenden und Wiederholungen aufzuführen,
können Sie mehrere Gruppen auf einmal in einem
einzigen Anhängsel bestimmen. Zum Beispiel
markiert <literal>:m,n,o</literal> ein Element,
welches zu den Gruppen <literal>m</literal>,
<literal>n</literal> und <literal>o</literal>
gehört.</para>
<para>Alle folgenden Beispiele sind gleichwertig,
aber das erste Beispiel ist vorzuziehen:</para>
<programlisting>MASTER_SITES= alpha alpha:SOME_SITE
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
MASTER_SITES= alpha:SOME_SITE,DEFAULT
MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting>
</listitem>
<listitem>
<para>Alle Webseiten in einer Gruppe werden
gemäß <makevar>MASTER_SORT_AWK</makevar>
sortiert. Alle Gruppen innerhalb von
<makevar>MASTER_SITES</makevar> und
<makevar>PATCH_SITES</makevar> werden genauso
sortiert.</para>
</listitem>
<listitem id="porting-master-sites-n-group-semantics">
<para>Gruppensemantik kann benutzt werden in den
folgenden Variablen: <makevar>MASTER_SITES</makevar>,
<makevar>PATCH_SITES</makevar>,
<makevar>MASTER_SITE_SUBDIR</makevar>,
<makevar>PATCH_SITE_SUBDIR</makevar>,
<makevar>DISTFILES</makevar> und
<makevar>PATCHFILES</makevar> entsprechend der
folgenden Syntax:</para>
<orderedlist>
<listitem>
<para>Elemente mit <makevar>MASTER_SITES</makevar>,
<makevar>PATCH_SITES</makevar>,
<makevar>MASTER_SITE_SUBDIR</makevar> und
<makevar>PATCH_SITE_SUBDIR</makevar> müssen
mit einem Schrägstrich beendet werden (
<literal>/</literal>). Falls Elemente zu
irgendwelchen Gruppen gehören, muss
<literal>:<replaceable>n</replaceable></literal>
direkt nach dem Trenner <literal>/</literal>
stehen. Der
<literal>MASTER_SITES:n</literal>-Mechanismus
verlässt sich auf das Vorhandensein des
Trennzeichens <literal>/</literal>, um verwirrende
Elemente zu vermeiden in denen
<literal>:n</literal> ein zulässiger
Bestandteil des Elementes ist und das Auftreten
von <literal>:n</literal> die Gruppe
<literal>n</literal> anzeigt. Aus
Kompatibilitätsgründen (da der
<literal>/</literal>-Trenner sowohl in
<makevar>MASTER_SITE_SUBDIR</makevar> als auch
<makevar>PATCH_SITE_SUBDIR</makevar>-Elementen
nicht erforderlich ist) wird, falls das auf das
Anhängsel folgende nächste Zeichen kein
<literal>/</literal> ist, auch
<literal>:n</literal> als gültiger Teil des
Elementes behandelt anstatt als Gruppenzusatz,
selbst wenn ein Element ein angehängtes
<literal>:n</literal> aufweist. Beachten Sie
sowohl <xref
linkend="ports-master-sites-n-example-detailed-use-master-site-subdir"/>
als auch <xref
linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para>
<example
id="ports-master-sites-n-example-detailed-use-master-site-subdir">
<title>Ausführliches Beispiel von
<literal>MASTER_SITES:n</literal> in
<makevar>MASTER_SITE_SUBDIR</makevar></title>
<programlisting>MASTER_SITE_SUBDIR= old:n new/:NEW</programlisting>
<itemizedlist>
<listitem>
<para>Verzeichnisse innerhalb der Gruppe
<literal>DEFAULT</literal> -&gt;
old:n</para>
</listitem>
<listitem>
<para>Verzeichnisse innerhalb der Gruppe
<literal>NEW</literal> -&gt; new</para>
</listitem>
</itemizedlist>
</example>
<example
id="ports-master-sites-n-example-detailed-use-complete-example-master-sites">
<title>Ausführliches Beispiel von
<literal>MASTER_SITES:n</literal> mit
Komma-Operator, mehreren Dateien, mehreren
Webseiten und mehreren
Unterverzeichnissen</title>
<programlisting>MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
http://site3/:group3 http://site4/:group4 \
http://site5/:group5 http://site6/:group6 \
http://site7/:DEFAULT,group6 \
http://site8/%SUBDIR%/:group6,group7 \
http://site9/:group8
DISTFILES= file1 file2:DEFAULT file3:group3 \
file4:group4,group5,group6 file5:grouping \
file6:group7
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
directory-one/:group6,DEFAULT \
directory</programlisting>
<para>Das vorstehende Beispiel führt zu
einem fein granulierten Herunterladen.
Die Webseiten werden in der exakten Reihenfolge
ihrer Nutzung aufgelistet.</para>
<itemizedlist>
<listitem>
<para><filename>file1</filename> wird
heruntergeladen von</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para>http://site1/directory-trial:1/</para>
</listitem>
<listitem>
<para>http://site1/directory-one/</para>
</listitem>
<listitem>
<para>http://site1/directory/</para>
</listitem>
<listitem>
<para>http://site2/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file2</filename> wird genauso
heruntergeladen wie
<filename>file1</filename>, da sie zur
gleichen Gruppe gehören</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para>http://site1/directory-trial:1/</para>
</listitem>
<listitem>
<para>http://site1/directory-one/</para>
</listitem>
<listitem>
<para>http://site1/directory/</para>
</listitem>
<listitem>
<para>http://site2/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file3</filename> wird
heruntergeladen von</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para>http://site3/</para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file4</filename> wird
heruntergeladen von</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para>http://site4/</para>
</listitem>
<listitem>
<para>http://site5/</para>
</listitem>
<listitem>
<para>http://site6/</para>
</listitem>
<listitem>
<para>http://site7/</para>
</listitem>
<listitem>
<para>http://site8/directory-one/</para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file5</filename> wird
heruntergeladen von</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><filename>file6</filename> wird
heruntergeladen von</para>
<itemizedlist>
<listitem>
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
</listitem>
<listitem>
<para>http://site8/</para>
</listitem>
<listitem>
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</example>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Wie gruppiere ich eine der speziellen Variablen
aus <filename>bsd.sites.mk</filename>, d.h.
<makevar>MASTER_SITE_SOURCEFORGE</makevar>?</para>
<para>Lesen Sie <xref
linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>.</para>
<example
id="ports-master-sites-n-example-detailed-use-master-site-sourceforge">
<title>Ausführliches Beispiel von
<literal>MASTER_SITES:n</literal> mit
<makevar>MASTER_SITE_SOURCEFORGE</makevar></title>
<programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforge</programlisting>
</example>
<para><filename>something.tar.gz</filename> wird von
allen Webseiten innerhalb von
<makevar>MASTER_SITE_SOURCEFORGE</makevar>
heruntergeladen.</para>
</listitem>
<listitem>
<para>Wie nutze ich dies mit
<makevar>PATCH*</makevar>-Variablen.</para>
<para>In allen Beispielen wurden
<makevar>MASTER*</makevar>-Variablen genutzt,
aber sie funktionieren exakt genauso mit
<makevar>PATCH*</makevar>-Variablen, wie Sie an
<xref
linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>.
sehen können.</para>
<example
id="ports-master-sites-n-example-detailed-use-patch-sites">
<title>Vereinfachte Nutzung von
<literal>MASTER_SITES:n</literal> mit
<makevar>PATCH_SITES</makevar>.</title>
<programlisting>PATCH_SITES= http://site1/ http://site2/:test
PATCHFILES= patch1:test</programlisting>
</example>
</listitem>
</orderedlist>
</sect3>
<sect3>
<title>Was ändert sich für die Ports?
Was ändert sich nicht?</title>
<orderedlist numeration="lowerroman">
<listitem>
<para>Alle bestehenden Ports bleiben gleich. Der Code
für <literal>MASTER_SITES:n</literal> wird nur
aktiviert, falls es Elemente mit angehängtem
<literal>:<replaceable>n</replaceable></literal>
entsprechend den zuvor erwähnten Syntax-Regeln
wie in <xref
linkend="porting-master-sites-n-group-semantics"/>
gezeigt gibt.</para>
</listitem>
<listitem
id="porting-master-sites-n-what-changes-in-port-targets">
<para>Das Target des Port bleibt gleich:
<maketarget>checksum</maketarget>,
<maketarget>makesum</maketarget>,
<maketarget>patch</maketarget>,
<maketarget>configure</maketarget>,
<maketarget>build</maketarget> etc.
Mit der offensichtlichen Ausnahme von
<maketarget>do-fetch</maketarget>,
<maketarget>fetch-list</maketarget>,
<maketarget>master-sites</maketarget>
und <maketarget>patch-sites</maketarget>.</para>
<itemizedlist>
<listitem>
<para><maketarget>do-fetch</maketarget>: nutzt die
neue Gruppierung <makevar>DISTFILES</makevar> und
<makevar>PATCHFILES</makevar> mit ihren darauf
zutreffenden Gruppenelementen in
<makevar>MASTER_SITES</makevar> und
<makevar>PATCH_SITES</makevar> welche zutreffende
Gruppenelemente sowohl in
<makevar>MASTER_SITE_SUBDIR</makevar> als auch
<makevar>PATCH_SITE_SUBDIR</makevar> aufweisen.
Sehen Sie hierzu <xref
linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para>
</listitem>
<listitem>
<para><maketarget>fetch-list</maketarget>: arbeitet
wie das alte <maketarget>fetch-list</maketarget>
mit der Ausnahme, dass es nur wie
<maketarget>do-fetch</maketarget>
gruppiert.</para>
</listitem>
<listitem>
<para><maketarget>master-sites</maketarget>
und <maketarget>patch-sites</maketarget>:
(inkompatibel zu älteren Versionen) geben
nur die Elemente der Gruppe
<literal>DEFAULT</literal> zurück.
Beziehungsweise sie führen genau genommen
die Targets von
<maketarget>master-sites-default</maketarget> und
<maketarget>patch-sites-default</maketarget>
aus.</para>
<para>Weiterhin ist der Gebrauch des Target entweder
von <maketarget>master-sites-all</maketarget> oder
<maketarget>patch-sites-all</maketarget> der
direkten Überprüfung von
<maketarget>MASTER_SITES</maketarget> oder
<maketarget>PATCH_SITES</maketarget> vorzuziehen.
Zudem ist nicht garantiert, dass das direkte
Überprüfen in zukünftigen Versionen
funktionieren wird. Sehen Sie <xref
linkend="porting-master-sites-n-new-port-targets-master-sites-all"/>
für weitere Informationen zu diesen neuen
Port-Targets.</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Neue Port-Targets</para>
<orderedlist>
<listitem>
<para>Es gibt
<maketarget>master-sites-<replaceable>n</replaceable></maketarget>
und
<maketarget>patch-sites-<replaceable>n</replaceable></maketarget>-Targets,
welche die Elemente der jeweiligen Gruppe
<replaceable>n</replaceable> innerhalb von
<makevar>MASTER_SITES</makevar> und
<makevar>PATCH_SITES</makevar> auflisten.
Beispielweise werden sowohl
<maketarget>master-sites-DEFAULT</maketarget> als
auch <maketarget>patch-sites-DEFAULT</maketarget>
die Elemente der Gruppe
<literal>DEFAULT</literal>,
<maketarget>master-sites-test</maketarget> und
<maketarget>patch-sites-test</maketarget> der
Gruppe <literal>test</literal> usw.
zurückgeben.</para>
</listitem>
<listitem
id="porting-master-sites-n-new-port-targets-master-sites-all">
<para>Es gibt das neue Target
<maketarget>master-sites-all</maketarget> und
<maketarget>patch-sites-all</maketarget>,
welche die Arbeit der alten Targets
<maketarget>master-sites</maketarget> und
<maketarget>patch-sites</maketarget>
übernehmen. Sie geben die Elemente aller
Gruppen zurück,als würden sie zur
gleichen Gruppe gehören - mit dem Vorbehalt,
dass sie so viele
<makevar>MASTER_SITE_BACKUP</makevar> und
<makevar>MASTER_SITE_OVERRIDE</makevar> auflisten
wie Gruppen mittels
<makevar>DISTFILES</makevar> oder
<makevar>PATCHFILES</makevar> definiert sind.
Das gleiche gilt entsprechend für
<maketarget>master-sites-all</maketarget> und
<maketarget>patch-sites-all</maketarget>.</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</sect3>
</sect2>
<sect2>
<title><makevar>DIST_SUBDIR</makevar></title>
<para>Verhindern Sie, dass Ihr Port das Verzeichnis
<filename>/usr/ports/distfiles</filename> in Unordnung
bringt. Falls Ihr Port eine ganze Reihe von Dateien
herunterladen muss oder eine Datei enthält,
die einen Namen hat, der möglicherweise mit
anderen Ports in Konflikt stehen könnte
(d.h.<filename>Makefile</filename>), dann setzen Sie die
Variable <makevar>DIST_SUBDIR</makevar> auf den Namen des
Ports (<literal>${PORTNAME}</literal> oder
<literal>${PKGNAMEPREFIX}${PORTNAME}</literal>
sollte hervorragend funktionieren). Dies wird
<makevar>DISTDIR</makevar> von der Vorgabe
<filename>/usr/ports/distfiles</filename> auf
<filename>/usr/ports/distfiles/<makevar>DIST_SUBDIR</makevar>
</filename> ändern und stellt tatsächlich alle
für Ihren Port benötigten Dateien in dieses
Unterverzeichnis.</para>
<para>Es wird zusätzlich nach dem Unterverzeichnis mit
dem gleichen Namen auf der Sicherung der Hauptseite auf
<filename>ftp.FreeBSD.org</filename> suchen (das
ausdrückliche Setzen von <makevar>DISTDIR</makevar>
in Ihrem <makevar>Makefile</makevar> wird dies nicht
gewährleisten, also nutzen Sie bitte
<makevar>DIST_SUBDIR</makevar>).</para>
<note>
<para>Dies hat keine Auswirkungen auf die Variable
<makevar>MASTER_SITES</makevar>, die Sie in Ihrem
<filename>Makefile</filename> definieren.</para>
</note>
</sect2>
<sect2>
<title><makevar>ALWAYS_KEEP_DISTFILES</makevar></title>
<para>Falls Ihr Port binäre Distfiles benutzt und eine
Lizenz aufweist, die verlangt, dass das der Quelltext in
Form binärer Pakete verteilt werden muss, z.B. GPL,
dann wird <makevar>ALWAYS_KEEP_DISTFILES</makevar> den
&os; Build Cluster anweisen eine Kopie der Dateien in
<makevar>DISTFILES</makevar> vorzuhalten. Nutzer dieser
Ports benötigen generell diese Dateien nicht, daher
ist es ein gutes Konzept, nur dann die Distfiles zu
<makevar>DISTFILES</makevar> hinzuzufügen, wenn
<makevar>PACKAGE_BUILDING</makevar> definiert ist.</para>
<example
id="ports-master-sites-n-example-always-keep-distfiles">
<title>Nutzung von
<makevar>ALWAYS_KEEP_DISTFILES</makevar>.</title>
<programlisting>.if defined(PACKAGE_BUILDING)
DISTFILES+= <replaceable>foo.tar.gz</replaceable>
ALWAYS_KEEP_DISTFILES= yes
.endif</programlisting>
</example>
<para>Wenn Sie zusätzliche Dateien zu
<makevar>DISTFILES</makevar> hinzufügen,
dann beachten Sie bitte, dass Sie diese auch in
<filename>distinfo</filename> aufführen.
Zudem werden die zusätzlichen Dateien normalerweise
ebenso in <makevar>WRKDIR</makevar> extrahiert,
was für einige Ports zu unbeabsichtigten
Seiteneffekten führen mag und spezielle
Behandlung erfordert.</para>
</sect2>
</sect1>
<sect1 id="makefile-maintainer">
<title><makevar>MAINTAINER</makevar></title>
<para>Fügen Sie hier Ihre E-Mailadresse ein. Bitte.
<!-- smiley --><emphasis>:-)</emphasis></para>
<para>Beachten Sie bitte, dass nur eine einzelne E-Mailadresse
ohne Kommentar in der Variable <makevar>MAINTAINER</makevar>
zulässig ist. Das Format sollte
<literal>user@hostname.domain</literal> sein.
Bitte fügen Sie keinen beschreibenden Text wie z.B. Ihren
wirklichen Namen ein, dies verwirrt lediglich
<filename>bsd.port.mk</filename>.</para>
<para>Der Maintainer ist dafür verantwortlich, dass der
Port aktuell gehalten wird und er sorgt dafür, dass der
Port korrekt arbeitet. Für eine detaillierte Beschreibung
der Verantwortlichkeiten eines Maintainers beachten Sie bitte
den Abschnitt <ulink
url="&url.articles.contributing-ports;/maintain-port.html">
Die Herausforderung für einen
Port-Maintainer</ulink>.</para>
<para>Änderungen am Port werden dem Maintainer zur
Begutachtung und Zustimmung vorgelegt, bevor sie committed
werden. Falls der Maintainer einem Aktualisierungs-Wunsch
nicht binnen 2 Wochen (ausgenommen wichtige öffentliche
Feiertage) zustimmt, dann wird dies als Maintainer-Timeout
betrachtet und eine Aktualisierung kann ohne
ausdrückliche Zustimmung des Maintainers erfolgen.
Falls der Maintainer nicht binnen 3 Monaten zustimmt, wird er
als abwesend ohne Grund betrachtet und kann als Maintainer
des fraglichen Ports durch eine andere Person ersetzt werden.
Ausgenommen davon ist alles, was durch das &a.portmgr; oder
das &a.security-officer; betreut wird. Es dürfen niemals
committs ohne vorherige Zustimmung an solchen Ports
vorgenommen werden!</para>
<para>Wir behalten uns das Recht vor, die Einreichungen eines
Maintainers ohne ausdrückliche Zustimmung zu ändern,
falls wir der Auffassung sind, dass dadurch die Einhaltung von
Richtlinien und stilistischen Vorgaben für die
Ports-Sammlung besser erfüllt wird. Zudem können
größere Änderungen an der Infrastruktur der
Ports zu Änderungen an einem bestimmten Port ohne
Zustimmung des Maintainers führen.
Diese Änderungen beeinflussen niemals die
Funktionalität eines Ports.</para>
<para>Das &a.portmgr; behält sich das Recht vor, die
Maintainerschaft jedem aus irgendeinem Grund zu entziehen oder
ausser Kraft zu setzen, und das Security Officer Team
&a.security-officer; behält sich das Recht vor, jede
Maintainerschaft aus Sicherheitsgründen aufzuheben oder
ausser Kraft zu setzen.</para>
</sect1>
<sect1 id="makefile-comment">
<title><makevar>COMMENT</makevar></title>
<para>Dies ist eine einzeilige Beschreibung des Ports.
<emphasis>Bitte</emphasis> fügen Sie nicht den Paketnamen
(oder die Version der Software) in den Kommentar ein.
Der Kommentar soll mit einem Großbuchstaben beginnen
und ohne Punkt enden. Hier ist ein Beispiel:</para>
<programlisting>COMMENT= A cat chasing a mouse all over the screen</programlisting>
<para>Die COMMENT-Variable soll unmittelbar nach der
MAINTAINER-Variable im <filename>Makefile</filename>
stehen.</para>
<para>Bitte versuchen Sie die COMMENT-Zeile auf weniger als 70
Zeichen zu begrenzen, da &man.pkg.info.1; diese zur Anzeige
einer kurzen, einzeiligen Zusammenfassung des Ports
verwendet.</para>
</sect1>
<sect1 id="makefile-depend">
<title>Abhängigkeiten (dependencies)</title>
<para>Viele Ports hängen von anderen Ports ab.
Dies ist ein sehr praktisches und nettes Feature der meisten
Unix-ähnlichen Betriebssysteme, &os; nicht
ausgeschlossen. Es erlaubt, dass häufig vorkommende
Abhängigkeiten nicht mit jedem Port oder Paket zusammen
ausgeliefert werden müssen, da viele Ports diese
gemeinsam benutzen.
Es gibt sieben Variablen, die benutzt werden können,
um sicherzustellen, dass alle benötigten Teile auf dem
Rechner des Nutzers sind. Zusätzlich gibt es einige
vordefinierte Variablen für Abhängigkeiten in
häufigen Fällen und einige, welche das Verhalten
der Abhängigkeiten bestimmen.</para>
<sect2>
<title><makevar>LIB_DEPENDS</makevar></title>
<para>Diese Variable spezifiziert die Shared-Libraries,
von denen der Port abhängt. Es ist eine Liste von
<replaceable>lib</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln
wobei <replaceable>lib</replaceable> den Name der gemeinsam
genutzten Bibliothek, <replaceable>dir</replaceable> das
Verzeichnis, in welchem sie zu finden ist, falls nicht
verfügbar, und <replaceable>target</replaceable> das
Target in diesem Verzeichnis angeben. Zum Beispiel wird
<programlisting>LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg</programlisting>
auf eine jpeg-Bibliothek mit der Hauptversionsnummer 9
prüfen, in das
<filename>graphics/jpeg</filename>-Unterverzeichnis Ihrer
Ports-Sammlung wechseln, es bauen und installieren, falls
es nicht gefunden wird.
Der <replaceable>target</replaceable>-Teil kann weggelassen
werden, falls er identisch mit
<makevar>DEPENDS_TARGET</makevar> ist (Vorgabe hierfür
ist <literal>install</literal>).</para>
<note>
<para>Der <replaceable>lib</replaceable>-Teil ist ein
regulärer Ausdruck, welcher die Ausgabe von
<command>ldconfig -r</command> ausgewertet. Werte wie
<literal>intl.[5-7]</literal> und <literal>intl</literal>
sind zulässig. Das erste Muster,
<literal>intl.[5-7]</literal>, stimmt überein mit:
<literal>intl.5</literal>, <literal>intl.6</literal> oder
<literal>intl.7</literal>. Das zweite Muster,
<literal>intl</literal>, stimmt überein mit jeder
Version der <literal>intl</literal>-Bibliothek.</para>
</note>
<para>Die Abhängigkeit wird zwei Mal überprüft,
einmal innerhalb des <maketarget>extract</maketarget>-Target
und dann innerhalb des
<maketarget>install</maketarget>-Target.
Zudem wird der Name der Abhängigkeit in das Paket
eingefügt, damit &man.pkg.add.1; es automatisch
installiert, falls es nicht auf dem Rechner des Nutzers
ist.</para>
</sect2>
<sect2>
<title><makevar>RUN_DEPENDS</makevar></title>
<para>Diese Variable legt Binärdateien oder Dateien,
von denen der Port abhängt, für die Laufzeit fest.
Es ist eine Liste von
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln,
wobei <replaceable>path</replaceable> der Name der
Binärdatei oder Datei, <replaceable>dir</replaceable>
das Verzeichnis, in welchem sie gefunden werden kann, falls
nicht vorhanden, und <replaceable>target</replaceable> das
Target in diesem Verzeichnis angeben.
Falls <replaceable>path</replaceable> mit einem Slash
(<literal>/</literal>) beginnt, wird es als Datei behandelt
und deren Vorhandensein wird mit <command>test -e</command>;
überprüft. Andernfalls wird angenommen, dass es
eine Binärdatei ist und <command>which -s</command>
wird benutzt, um zu überprüfen, ob das Programm im
Pfad vorhanden ist.</para>
<para>Zum Beispiel wird</para>
<programlisting>RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr</programlisting>
<para>überprüfen, ob die Datei oder das Verzeichnis
<filename>/usr/local/etc/innd</filename> existiert und es
erstellen und installieren aus dem
<filename>news/inn</filename>-Unterverzeichnis der
Ports-Sammlung, falls es nicht gefunden wird. Es wird zudem
überprüft, ob die Binärdatei namens
<command>xmlcatmgr</command> im Suchpfad vorhanden ist und
danach zum Unterverzeichnis
<filename>textproc/xmlcatmgr</filename> in Ihrer
Ports-Sammlung wechseln, es bauen und installieren,
falls es nicht gefunden wird.</para>
<note>
<para>In diesem Fall ist <command>innd</command> eine
Binärdatei. Falls sich eine Binärdatei an
einem ungewöhnlichen Platz befindet, der nicht
im Suchpfad ist, dann sollten Sie die volle Pfadangabe
verwenden.</para>
</note>
<note>
<para>Der offizielle Suchpfad <envar>PATH</envar>,
welcher im Ports Cluster benutzt wird, ist</para>
<programlisting>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin</programlisting>
</note>
<para>Die Abhängigkeit wird innerhalb des
<maketarget>install</maketarget>-Target
überprüft. Zudem wird der Name der
Abhängigkeit in das Paket übernommen,
damit &man.pkg.add.1; es automatisch installieren wird,
falls es auf dem System des Nutzers nicht vorhanden ist.
Der <replaceable>target</replaceable>-Teil kann
weggelassen werden, wenn er der gleiche ist wie in der
Variable <makevar>DEPENDS_TARGET</makevar>.</para>
<para>Es kommt recht häufig vor, dass
<makevar>RUN_DEPENDS</makevar> genau dasselbe enthält
wie <makevar>BUILD_DEPENDS</makevar>, gerade dann, wenn die
portierte Software in einer Skriptsprache geschrieben ist
oder dieselbe Umgebung, die zum Bau verwendet wurde, zur
Laufzeit gebraucht wird. In diesem Fall ist es sowohl
verlockend als auch intuitiv, den Wert der einen
Variable der anderen direkt zuzuweisen:</para>
<programlisting>RUN_DEPENDS= ${BUILD_DEPENDS}</programlisting>
<para>Jedoch kann eine solche Zuweisung dazu führen, dass
die Liste der Laufzeitabhängigkeiten mit
überflüssigen Einträgen belastet wird, die
sich nicht in der ursprünglichen Liste
<makevar>BUILD_DEPENDS</makevar> des Ports befanden, da sich
&man.make.1; bei
der Auswertung solcher Zuweisungen träge verhält.
Stellen Sie sich ein <filename>Makefile</filename> mit
<makevar>USE_<replaceable>*</replaceable></makevar>-Variablen
vor, die von <filename>ports/Mk/bsd.*.mk</filename> verarbeitet
werden, um initiale Bauabhängigkeiten zusammenzutragen.
Zum Beispiel fügt <literal>USE_GMAKE=yes</literal>
<filename role="package">devel/gmake</filename> zu
<makevar>BUILD_DEPENDS</makevar> hinzu. Um zu verhindern,
dass solche zusätzlichen Abhängigkeiten
<makevar>RUN_DEPENDS</makevar> belasten, achten Sie darauf,
bei gleichzeitiger Auswertung zuzuweisen, d.h. der
Ausdruck wird ausgewertet, bevor er als Wert der Variablen
zugewiesen wird:</para>
<programlisting>RUN_DEPENDS:= ${BUILD_DEPENDS}</programlisting>
</sect2>
<sect2>
<title><makevar>BUILD_DEPENDS</makevar></title>
<para>Diese Variable legt Binärdateien oder Dateien fest,
die dieser Port zur Erstellung benötigt. Wie
<makevar>RUN_DEPENDS</makevar> ist es eine Liste von
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln.
Zum Beispiel wird
<programlisting> BUILD_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip</programlisting>
überprüfen, ob eine Binärdatei
<command>unzip</command> vorhanden ist und in das
Unterverzeichnis <filename>archivers/unzip</filename>
Ihrer Ports-Sammlung wechseln und sie erstellen und
installieren, falls sie nicht gefunden wird.</para>
<note>
<para><quote>Erstellen</quote> bedeutet hier alles von der
Extraktion bis zur Kompilierung. Die Abhängigkeit
wird im <maketarget>extract</maketarget>-Target
überprüft.
Der <replaceable>target</replaceable>-Teil kann
weggelassen werden, falls er identisch mit der Variable
<makevar>DEPENDS_TARGET</makevar> ist.</para>
</note>
</sect2>
<sect2>
<title><makevar>FETCH_DEPENDS</makevar></title>
<para>Diese Variable legt eine Binärdatei oder Datei
fest, welche der Port benötigt, um heruntergeladen
werden zu können. Wie die vorherigen beiden Variablen
ist er eine Liste von
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln.
Zum Beispiel wird
<programlisting> FETCH_DEPENDS=
ncftp2:${PORTSDIR}/net/ncftp2</programlisting>
überprüfen, ob eine Binärdatei namens
<command>ncftp2</command> vorhanden ist, in das
Unterverzeichnis <filename>net/ncftp2</filename> Ihrer
Ports-Sammlung wechseln, sie erstellen und installieren,
falls sie nicht gefunden wird.</para>
<para>Die Abhängigkeit wird innerhalb des
<maketarget>fetch</maketarget>-Target überprüft.
Der <replaceable>target</replaceable>-Teil kann weggelassen
werden, falls er identisch mit der Variable
<makevar>DEPENDS_TARGET</makevar> ist.</para>
</sect2>
<sect2>
<title><makevar>EXTRACT_DEPENDS</makevar></title>
<para>Diese Variable spezifiziert eine Binärdatei oder
eine Datei, welche dieser Port für die Extraktion
benötigt. Wie die vorherigen Variablen ist er eine
Liste von
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln.
Zum Beispiel wird
<programlisting>EXTRACT_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip</programlisting>
überprüfen, ob eine Binärdatei namens
<command>unzip</command> vorhanden ist, in das
Unterverzeichnis <filename>archivers/unzip</filename>
Ihrer Ports-Sammlung wechseln, sie erstellen und
installieren, falls sie nicht gefunden wird.</para>
<para>Die Abhängigkeit wird innerhalb des
<maketarget>extract</maketarget>-Target überprüft.
Der <replaceable>target</replaceable>-Teil kann weggelassen
werden, falls er identisch mit der Variable
<makevar>DEPENDS_TARGET</makevar> ist.</para>
<note>
<para>Nutzen Sie diese Variable nur, wenn die Extraktion
nicht funktioniert (die Vorgabe nimmt
<command>gzip</command> an) und nicht mit
<makevar>USE_ZIP</makevar> oder
<makevar>USE_BZIP2</makevar> wie in <xref
linkend="use-vars"/> beschrieben zum Laufen gebracht
werden kann.</para>
</note>
</sect2>
<sect2>
<title><makevar>PATCH_DEPENDS</makevar></title>
<para>Diese Variable legt eine Binärdatei oder eine
Datei fest, welche dieser Port zum Patchen benötigt.
Wie die vorhergehenden Variablen ist diese eine Liste von
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>-Tupeln.
Zum Beispiel wird
<programlisting> PATCH_DEPENDS=
${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
</programlisting>
in das Unterverzeichnis <filename>java/jfc</filename> Ihrer
Ports-Sammlung wechseln, um es zu entpacken.</para>
<para>Die Abhängigkeit wird innerhalb des
<maketarget>patch</maketarget>-Target überprüft.
Der <replaceable>target</replaceable>-Teil kann entfallen,
falls er identisch mit der Variable
<makevar>DEPENDS_TARGET</makevar> ist.</para>
</sect2>
<sect2 id="use-vars">
<title><makevar>USE_<replaceable>*</replaceable></makevar>
</title>
<para>Es gibt eine Reihe von Variablen, um gebräuchliche
Abhängigkeiten einzukapseln, die viele Ports aufweisen.
Obwohl Ihre Verwendung optional ist, können sie helfen
die Übersichtlichkeit des <filename>Makefile</filename>
eines Ports zu erhöhen. Jede von ihnen ist im Stil von
<makevar>USE_<replaceable>*</replaceable></makevar>.
Der Gebrauch dieser Variablen ist beschränkt auf das
<filename>Makefile</filename> eines Ports und
<filename>ports/Mk/bsd.*.mk</filename>. Es ist nicht
entworfen worden, um durch den Nutzer setzbare Optionen
einzukapseln; benutzen Sie
<makevar>WITH_<replaceable>*</replaceable></makevar> und
<makevar>WITHOUT_<replaceable>*</replaceable></makevar>
für diese Zwecke.</para>
<note>
<para>Es ist <emphasis>immer</emphasis> falsch, irgendeine
<makevar>USE_<replaceable>*</replaceable></makevar>-Variable
in der <filename>/etc/make.conf</filename> zu setzen.
Zum Beispiel würde das Setzen von
<programlisting>USE_GCC=3.4</programlisting>
eine Abhängigkeit für GCC34 für jeden Port
einschliesslich GCC34 selbst hinzufügen!</para>
</note>
<table frame="none">
<title>Die
<makevar>USE_<replaceable>*</replaceable></makevar>-Varibalen
</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_BZIP2</makevar></entry>
<entry>Der Tarball dieses Ports wird mit
<command>bzip2</command> komprimiert.</entry>
</row>
<row>
<entry><makevar>USE_ZIP</makevar></entry>
<entry>Der Tarball des Ports wird mit
<command>zip</command> komprimiert.</entry>
</row>
<row>
<entry><makevar>USE_BISON</makevar></entry>
<entry>Der Port benutzt <command>bison</command>
für die Erstellung.</entry>
</row>
<row>
<entry><makevar>USE_CDRTOOLS</makevar></entry>
<entry>Der Port erfordert
<application>cdrecord</application> entweder von
<filename role="package">sysutils/cdrtools
</filename> oder <filename
role="package">sysutils/cdrtools-cjk</filename>,
abhängig davon, was der Nutzer vorgibt.
</entry>
</row>
<row>
<entry><makevar>USE_GCC</makevar></entry>
<entry>Dieser Port benötigt eine bestimmte
Version von <command>gcc</command> zur Erstellung.
Die genaue Version kann festgelegt werden mit
Werten wie <literal>3.4</literal>.
Mit <literal>3.4+</literal> kann die mindestens
erforderliche Version spezifiziert werden.
Der <command>gcc</command> aus
dem Basissystem wird genutzt, wenn er die
erforderliche Version erfüllt, andernfalls wird
eine geeignete Version des <command>gcc</command>
aus den Ports kompiliert und die Variablen
<makevar>CC</makevar> und <makevar>CXX</makevar>
werden angepasst.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Variablen zugehörig zu
<application>gmake</application> und dem
<filename>configure</filename>-Skript werden in
<xref linkend="building"/> beschrieben, währenddessen
<application>autoconf</application>,
<application>automake</application> und
<application>libtool</application> in
<xref linkend="using-autotools"/> beschrieben sind.
<application>Perl</application>-spezifische Variablen
werden in <xref linkend="using-perl"/> behandelt.
X11-Variablen sind aufgelistet in
<xref linkend="using-x11"/>. <xref linkend="using-gnome"/>
behandelt GNOME-bezogene Variablen und <xref
linkend="using-kde"/> KDE-bezogene Variablen.
<xref linkend="using-java"/> dokumentiert Java-Variablen,
während <xref linkend="using-php"/>Informationen zu
<application>Apache</application>,
<application>PHP</application> und PEAR-Modulen
enthält.
<application>Python</application> wird in
<xref linkend="using-python"/> und
<application>Ruby</application> in
<xref linkend="using-ruby"/> erörtert.
<xref linkend="using-sdl"/> stellt Variablen für
<application>SDL</application>-Programme zur Verfügung
und <xref linkend="using-xfce"/> enthält schliesslich
Variablen für <application>Xfce</application>.</para>
</sect2>
<sect2>
<title>Minimale Version einer Abhängigkeit</title>
<para>Eine minimale Version einer Abhängigkeit kann in
jeder <makevar>*_DEPENDS</makevar>-Variable festgelegt
werden mit Ausnahme von <makevar>LIB_DEPENDS</makevar>
durch Anwendung folgender Syntax:</para>
<programlisting>p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy</programlisting>
<para>Das erste Feld enthält einen abhängigen
Paketnamen, welcher einem Eintrag in der Paketdatenbank
entsprechen muss und einen Vergleich mit einer
Paketversion. Die Abhängigkeit wird erfüllt,
wenn p5-Spiffy-0.26 oder eine neuere Version
auf dem System installiert ist.</para>
</sect2>
<sect2>
<title>Anmerkungen zu Abhängigkeiten</title>
<para>Wie vorstehend beschrieben ist das Vorgabe-Target
<maketarget>DEPENDS_TARGET</maketarget>, wenn eine
Abhängigkeit benötigt wird.
Die Vorgabe hierfür ist <literal>install</literal>.
Dies ist eine Nutzer-Variable; sie wird niemals im
<filename>Makefile</filename> eines Ports definiert.
Falls Ihr Port einen besonderen Weg benötigt,
um mit einer Abhängigkeit umzugehen, dann benutzen
Sie bitte den <literal>:target</literal>-Teil der
<makevar>*_DEPENDS</makevar>-Variablen, anstatt
<makevar>DEPENDS_TARGET</makevar> zu ändern.</para>
<para>Falls Sie <command>make clean</command> schreiben,
werden dessen Abhängigkeiten auch gesäubert.
Falls Sie dies nicht wollen, definieren Sie die Variable
<makevar>NOCLEANDEPENDS</makevar> in Ihrer Umgebung.
Dies kann besonders erstrebenswert sein, wenn der Port
etwas in seiner Liste von Abhängigkeiten hat,
das sehr viel Zeit für einen rebuild benötigt
wie KDE, GNOME oder Mozilla.</para>
<para>Um von einem anderen Port bedingungslos abhängig
zu sein, benutzen Sie bitte die Variable
<makevar>${NONEXISTENT}</makevar> als erstes Feld von
<makevar>BUILD_DEPENDS</makevar> oder
<makevar>RUN_DEPENDS</makevar>. Benutzen Sie dies nur,
wenn Sie den Quelltext eines anderen Port benötigen.
Sie können auch oft Kompilierzeit sparen, wenn Sie das
Target festlegen. Zum Beispiel wird
<programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting>
immer zum <literal>jpeg</literal>-Port wechseln und ihn
extrahieren.</para>
</sect2>
<sect2>
<title>Zirkuläre Abhängigkeiten sind fatal</title>
<important>
<para>Führen Sie niemals irgendwelche zirkulären
Abhängigkeiten in der Ports-Sammlung ein!</para>
</important>
<para>Die Struktur für die Erstellung von Ports dulde
keinerlei zirkuläre Abhängigkeiten. Falls Sie
dennoch eine verwenden, wird es irgendjemanden irgendwo auf
der Welt geben, dessen FreeBSD-Installation nahezu sofort
zusammenbricht und vielen anderen wird es sehr schnell
genauso ergehen.
So etwas kann extrem schwer festzustellen sein.
Falls Sie Zweifel haben vor einer Änderung,
dann vergewissern Sie sich, dass Sie folgendes getan haben:
<command>cd /usr/ports; make index</command>.
Dieser Prozess kann auf alten Maschinen sehr langsam sein,
aber Sie ersparen sich und einer Vielzahl von Menschen
möglicherweise eine Menge Ärger.</para>
</sect2>
</sect1>
<sect1 id="makefile-masterdir">
<title><makevar>MASTERDIR</makevar></title>
<para>Falls Ihr Port wegen einer Variable, die verschiedene
Werte annimmt (z.B. Auflösung oder
Papiergröße), leicht unterschiedliche Versione
von Paketen erzeugen muss, dann legen Sie bitte ein
Unterverzeichnis pro Paket an, um es für den Nutzer
einfacher begreiflich zu machen, was zu machen ist.
Aber versuchen Sie dabei so viele Dateien wie möglich
zwischen diesen Ports gemeinsam zu nutzen.
Normalerweise benötigen Sie nur ein sehr kurzes
<filename>Makefile</filename> in allen ausser einem
Unterverzeichnis, wenn Sie Variablen intelligent nutzen.
In diesem einzigen <filename>Makefile</filename> können
Sie <makevar>MASTERDIR</makevar> verwenden, um anzugeben,
wo der Rest der Dateien liegt. Benutzen Sie bitte auch eine
Variable für <link linkend="porting-pkgname">
<makevar>PKGNAMESUFFIX</makevar></link>, damit die Pakete
unterschiedliche Namen haben werden.</para>
<para>Wir demonstrieren dies am Besten an einem Beispiel. Es ist
Teil von
<filename>japanese/xdvi300/Makefile</filename>;</para>
<programlisting>PORTNAME= xdvi
PORTVERSION= 17
PKGNAMEPREFIX= ja-
PKGNAMESUFFIX= ${RESOLUTION}
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 &amp;&amp; ${RESOLUTION} != 240 &amp;&amp; \
${RESOLUTION} != 300 &amp;&amp; ${RESOLUTION} != 400
@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif</programlisting>
<para><filename role="package">japanese/xdvi300</filename>
verfügt ebenfalls über alle Patches, Paket-Dateien
usw. Wenn Sie <command>make</command> eintippen, wird der Port
die Standardvorgabe für die Auflösung nehmen (300)
und den Port ganz normal erstellen.</para>
<para>Genauso wie für alle anderen Auflösungen ist
dies das <emphasis>vollständige</emphasis>
<filename>xdvi118/Makefile</filename>:</para>
<programlisting>RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include "${MASTERDIR}/Makefile"</programlisting>
<para>(<filename>xdvi240/Makefile</filename> und
<filename>xdvi400/Makefile</filename> sind ähnlich).
Die <makevar>MASTERDIR</makevar>-Definition teilt dem
<filename>bsd.port.mk</filename> mit, dass die normalen
Unterverzeichnisse wie <makevar>FILESDIR</makevar> und
<makevar>SCRIPTDIR</makevar> unter
<filename>xdvi300</filename> gefunden werden können.
Die <literal>RESOLUTION=118</literal>-Zeile wird die
<literal>RESOLUTION=300</literal>-Zeile in
<filename>xdvi300/Makefile</filename> überschreiben
und der Port wird mit einer Auflösung von 118
erstellt.</para>
</sect1>
<sect1 id="makefile-manpages">
<title>Manualpages</title>
<para>Die Variablen <makevar>MAN[1-9LN]</makevar>
werden automatisch jede Manualpage zur
<filename>pkg-plist</filename> hinzufügen
(dies bedeutet, dass Sie Manualpages
<emphasis>nicht</emphasis> in der
<filename>pkg-plist</filename> auflisten dürfen,
lesen Sie bitte <link linkend="plist-sub">Erstellung
der PLIST</link> für weitere Details).
Sie veranlassen zudem den Installationsabschnitt
dazu, die Manualpages zu Komprimieren oder zu Dekomprimieren
abhängig vom gesetzten Wert der Variable
<makevar>NO_MANCOMPRESS</makevar> in
<filename>/etc/make.conf</filename>.</para>
<para>Falls Ihr Port versucht verschiedene Namen für
Manualpages unter Zuhilfenahme von Symlinks oder Hardlinks
zu installieren, müssen Sie die Variable
<makevar>MLINKS</makevar> nutzen, um diese zu identifizieren.
Der von Ihrem Port installierte Link wird von
<filename>bsd.port.mk</filename> gelöscht und wieder
eingefügt, um sicherzustellen, dass er auf die korrekte
Datei zeigt. Jede Manualpage, welche in
<makevar>MLINKS</makevar> aufgeführt ist, darf nicht in
der <filename>pkg-plist</filename> aufgenommen werden.</para>
<para>Falls die Manualpages während der Installation
komprimiert werden sollen, müssen Sie die Variable
<makevar>MANCOMPRESSED</makevar> setzen. Diese Variable kann
drei Werte annehmen, <literal>yes</literal>,
<literal>no</literal> und <literal>maybe</literal>.
<literal>yes</literal> bedeutet, dass Manualpages bereits
komprimiert installiert sind, bei <literal>no</literal> sind
sie es nicht und <literal>maybe</literal> bedeutet, dass die
Software bereits den Wert von <makevar>NO_MANCOMPRESS</makevar>
beachtet, damit <filename>bsd.port.mk</filename> nichts
Besonderes auszuführen hat.</para>
<para><makevar>MANCOMPRESSED</makevar> wird automatisch auf
<literal>yes</literal> gesetzt, wenn
<makevar>USE_IMAKE</makevar> vorgegeben ist und gleichzeitig
<makevar>NO_INSTALL_MANPAGES</makevar> nicht. Im umgekehrten
Falle ist <makevar>MANCOMPRESSED</makevar> auf
<literal>no</literal> gesetzt.
Sie müssen es nicht explizit angeben, außer die
Standardvorgabe ist für Ihren Port nicht passend.</para>
<para>Wenn Ihr Port den man tree irgendwo anders als in der
Variable <makevar>MANPREFIX</makevar> verankert, können
Sie ihn mit <makevar>MANPREFIX</makevar> bestimmen.
Sollten zudem Manualpages nur in bestimmten Abschnitten an
einem nicht-standardkonformen Platz liegen, wie z.B. bestimmte
<literal>Perl</literal>-Modul-Ports,
dann können Sie mittels der Variable
<makevar>MAN<replaceable>sect</replaceable>PREFIX</makevar>
(wobei <replaceable>sect</replaceable> ein Wert aus
<literal>1-9</literal>, <literal>L</literal> oder
<literal>N</literal> ist) individuelle Pfade zu den
Manualpages festlegen.</para>
<para>Wenn Ihre Manualpages in sprachspezifische
Unterverzeichnisse installiert werden, dann bestimmen Sie
bitte den Namen der Sprache mit der Variable
<makevar>MANLANG</makevar>. Der Wert dieser Variable ist
mit <literal>""</literal> vorgegeben (das bedeutet nur
Englisch).</para>
<para>Hier ist ein Beispiel, welches alles zusammenfasst.</para>
<programlisting>MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MLINKS= foo.1 alt-name.8
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes</programlisting>
<para>Dies zeigt an, dass sechs Dateien von diesem Port
installiert werden;</para>
<programlisting>${MANPREFIX}/man/man1/foo.1.gz
${MANPREFIX}/man/ja/man1/foo.1.gz
${PREFIX}/share/foobar/man/man3/bar.3.gz
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
${MANPREFIX}/man/man4/baz.4.gz
${MANPREFIX}/man/ja/man4/baz.4.gz</programlisting>
<para><filename>${MANPREFIX}/man/man8/alt-name.8.gz</filename>
kann zusätzlich von Ihrem Port installiert werden,
oder auch nicht. Unabhängig davon wird ein Symlink
erstellt, welcher die Manualpages foo(1) und alt-name(8)
einbindet.</para>
<para>Falls nur manche Manualpages übersetzt sind,
können Sie einige dynamisch vom
<makevar>MANLANG</makevar>-Inhalt erzeugte Variablen
nutzen:</para>
<programlisting>MANLANG= "" de ja
MAN1= foo.1
MAN1_EN= bar.1
MAN3_DE= baz.3</programlisting>
<para>Dies führt zu folgender Liste von Dateien:</para>
<programlisting>${MANPREFIX}/man/man1/foo.1.gz
${MANPREFIX}/man/de/man1/foo.1.gz
${MANPREFIX}/man/ja/man1/foo.1.gz
${MANPREFIX}/man/man1/bar.1.gz
${MANPREFIX}/man/de/man3/baz.3.gz</programlisting>
</sect1>
<sect1 id="makefile-info">
<title>Info-Dateien</title>
<para>Falls Ihr Paket GNU-Info-Dateien installiert, sollten
diese in der <makevar>INFO</makevar>-Variablen augelistet sein
(ohne das angehängte <literal>.info</literal>) mit einem
Eintrag für jedes Dokument. Von diesen Dateien wird
angenommen, dass sie nach
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename>
installiert werden. Sie können
<makevar>INFO_PATH</makevar> ändern, falls Ihr Paket
einen anderen Ort vorsieht. Jedoch wird dies nicht empfohlen.
Die Einträge enthalten nur den relativen Pfad zu
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename>.
Zum Beispiel installiert <filename
role="package">lang/gcc34</filename> Info-Dateien nach
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar>/gcc34</filename>,
wobei <makevar>INFO</makevar> etwa so aussieht:
<programlisting>INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...</programlisting>
Entsprechende Installations-/Deinstalltions-Codes werden vor
der Paket-Registrierung automatisch der vorläufigen
<filename>pkg-plist</filename> hinzugefügt.</para>
</sect1>
<sect1 id="makefile-options">
<title>Makefile-Optionen</title>
<para>Einige größere Applikationen können mit
einer Reihe von Konfigurationen, die zusätzliche
Funktionalitäten hinzufügen, erstellt werden,
falls eine oder mehrere Bibliotheken oder Applikationen
verfügbar sind. Dazu gehören die Auswahl von
natürlichen Sprachen, GUI versus Kommandozeilen-Versionen
oder die Auswahl aus mehreren Datenbank-Programmen.
Da nicht alle Nutzer diese Bibliotheken oder Applikationen
wollen, stellt das Ports-System hooks (Haken) zur
Verfügung, damit der Autor des Ports bestimmen kann,
welche Konfiguration erstellt werden soll.</para>
<sect2>
<title>KNOBS (Einstellungen)</title>
<sect3>
<title><makevar>WITH_<replaceable>*</replaceable></makevar>
und
<makevar>WITHOUT_<replaceable>*</replaceable></makevar>
</title>
<para>Diese Variablen sind entworfen worden, um vom
System-Administrator gesetzt zu werden. Es gibt viele,
die in <ulink
url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/KNOBS?rev=HEAD&amp;content-type=text/x-cvsweb-markup"><filename>ports/KNOBS</filename></ulink>
standardisiert sind.</para>
<para>Benennen Sie Schalter bei der Erstellung eines Ports
nicht programmspezifisch. Verwenden Sie zum Beispiel im
Avahi-Port <makevar>WITHOUT_MDNS</makevar> anstelle von
<makevar>WITHOUT_AVAHI_MDNS</makevar>.</para>
<note>
<para>Sie sollten nicht annehmen, dass ein
<makevar>WITH_<replaceable>*</replaceable></makevar>
notwendigerweise eine korrespondierende <makevar>
WITHOUT_<replaceable>*</replaceable></makevar>-Variable
hat oder umgekehrt. Im Allgemeinen wird diese
Vorgabe einfach unterstellt.</para>
</note>
<note>
<para>Falls nicht anderweitig festgelegt, werden diese
Variablen nur dahingehend überprüft, ob sie
gesetzt sind oder nicht&nbsp;&ndash;&nbsp;nicht darauf,
ob sie auf bestimmte Werte wie <literal>YES</literal>
oder <literal>NO</literal> gesetzt sind.</para>
</note>
<table frame="none">
<title>Häufige
<makevar>WITH_<replaceable>*</replaceable></makevar>
und <makevar>
WITHOUT_<replaceable>*</replaceable></makevar>-Variablen
</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row id="knobs-without-nls">
<entry><makevar>WITHOUT_NLS</makevar></entry>
<entry>Falls gesetzt, bedeutet sie, dass eine
Internationalisierung nicht benötigt wird,
was Kompilierzeit sparen kann. Als Vorgabe
wird Internationalisierung gebraucht.</entry>
</row>
<row>
<entry><makevar>WITH_OPENSSL_BASE</makevar></entry>
<entry>Nutze die Version von OpenSSL aus dem
Basissystem.</entry>
</row>
<row>
<entry><makevar>WITH_OPENSSL_PORT</makevar></entry>
<entry>Installiert die Version von OpenSSL aus
<filename
role="package">security/openssl</filename>, auch
wenn das Basissystem auf aktuellem Stand
ist.</entry>
</row>
<row>
<entry><makevar>WITHOUT_X11</makevar></entry>
<entry>Falls der Port mit oder ohne
Unterstützung für X erstellt werden
kann, dann sollte normalerweise mit
X-Unterstützung erstellt werden.
Falls die Variable gesetzt ist, soll die Version
ohne X-Unterstützung erstellt werden.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect3>
<sect3>
<title>Benennung von Knobs (Einstellungen)</title>
<para>Um die Anzahl der Knobs niedrig zu halten und zum
Vorteil des Anwenders, wird empfohlen, dass Porter
ähnliche Namen für Knobs verwenden.
Eine Liste der beliebtesten Knobs kann in der <ulink
url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/KNOBS?rev=HEAD&amp;content-type=text/x-cvsweb-markup">KNOBS-Datei</ulink>
eingesehen werden.</para>
<para>Knob-Namen sollten wiederspiegeln, was der Knob
bedeutet und was er bewirkt. Wenn ein Port einen
lib-Präfix im <makevar>PORTNAME</makevar> hat,
dann soll das lib-Präfix im Knob-Namen
entfallen.</para>
</sect3>
</sect2>
<sect2>
<title><makevar>OPTIONS</makevar></title>
<sect3>
<title>Hintergrund</title>
<para>Die <makevar>OPTIONS</makevar>-Variable gibt dem
Nutzer, der diesen Port installiert, einen Dialog mit
auswählbaren Optionen und speichert diese in
<filename>/var/db/ports/<replaceable>portname</replaceable>/options</filename>.
Bei der nächsten Neuerstellung des Ports werden
diese Einstellungen wieder verwandt.
Sie werden sich niemals mehr an all die zwanzig
<makevar>WITH_<replaceable>*</replaceable></makevar> und
<makevar>WITHOUT_<replaceable>*</replaceable></makevar>-Optionen
erinnern müssen, die Sie benutzt haben, um diesen
Port zu erstellen!</para>
<para>Wenn der Anwender <command>make config</command>
benutzt (oder ein <command>make build</command> das
erste Mal laufen lässt) wird das Framework auf
<filename>/var/db/ports/<replaceable>portname</replaceable>/options</filename>
die Einstellungen prüfen. Falls die Datei nicht
existiert, werden die Werte von
<makevar>OPTIONS</makevar> genutzt, um eine Dialogbox
zu erzeugen, in welcher die Optionen an- oder abgeschaltet
werden können. Dann wird die
<filename>options</filename>-Datei gespeichert und die
ausgewählten Variablen werden bei der Erstellung
des Ports benutzt.</para>
<para>Falls eine neue Version des Ports
<makevar>OPTIONS</makevar> hinzufügt, wird der
Dialog mit den gespeicherten Werten dem Nutzer
angezeigt.</para>
<para>Benutzen Sie <command>make showconfig</command>,
um die gespeicherte Konfiguration zu betrachten.
Benutzen Sie <command>make rmconfig</command>, um die
gespeicherte Konfiguration zu Löschen.</para>
</sect3>
<sect3>
<title>Syntax</title>
<para>Die Syntax für die
<makevar>OPTIONS</makevar>-Variable lautet:
<programlisting>OPTIONS= OPTION "descriptive text" default ...</programlisting>
Der Wert als Vorgabe ist entweder <literal>ON</literal>
oder <literal>OFF</literal>. Wiederholungen dieser drei
Felder sind erlaubt.</para>
<para><makevar>OPTIONS</makevar>-Definitionen
müssen vor der Einbindung von
<filename>bsd.port.options.mk</filename> erscheinen.
Die <makevar>WITH_*</makevar> und
<makevar>WITHOUT_*</makevar>-Variablen können
nur nach der Einbindung von
<filename>bsd.port.options.mk</filename> getestet
werden. <filename>bsd.port.pre.mk</filename> kann auch
stattdessen eingebunden werden und wird immer noch von
vielen Ports eingebunden, die vor der Einführung von
<filename>bsd.port.options.mk</filename> erstellt wurden.
Jedoch wirken manche Variablen nicht wie gewohnt nach der
Einbindung von <filename>bsd.port.pre.mk</filename>,
typischerweise <makevar>USE_*</makevar>-Optionen.</para>
<example id="ports-options-simple-use">
<title>Einfache Anwendung von
<makevar>OPTIONS</makevar></title>
<para><programlisting>OPTIONS= FOO "Enable option foo" On \
BAR "Support feature bar" Off
.include &lt;bsd.port.options.mk&gt;
.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+= --without-foo
.else
CONFIGURE_ARGS+= --with-foo
.endif
.if defined(WITH_BAR)
RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
.endif
.include &lt;bsd.port.mk&gt;</programlisting></para>
</example>
<example id="ports-options-old-style-use">
<title>Veraltete Anwendung von
<makevar>OPTIONS</makevar></title>
<para><programlisting>OPTIONS= FOO "Enable option foo" On
.include &lt;bsd.port.pre.mk&gt;
.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+= --without-foo
.else
CONFIGURE_ARGS+= --with-foo
.endif
.include &lt;bsd.port.post.mk&gt;</programlisting></para>
</example>
</sect3>
</sect2>
<sect2>
<title>Automatische Aktivierung von Funktionen</title>
<para>Wenn Sie ein GNU-Konfigurationsskript benutzen,
sollten Sie ein Auge darauf werfen, welche Funktionen
durch die automatische Erkennung aktiviert werden.
Schalten Sie Funktionen, die Sie nicht möchten,
ausdrücklich durch Verwendung von
<literal>--without-xxx</literal> oder
<literal>--disable-xxx</literal> in der Variable
<makevar>CONFIGURE_ARGS</makevar> einzeln ab.</para>
<example>
<title>Falsche Behandlung einer Option</title>
<programlisting>.if defined(WITH_FOO)
LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+= --enable-foo
.endif</programlisting>
</example>
<para>Stellen Sie sich vor im obigen Beispiel ist eine
Bibliothek libfoo auf dem System installiert. Der Nutzer
will nicht, dass diese Applikation libfoo benutzt, also
hat er die Option auf "off" im
<literal>make config</literal>-Dialog umgestellt.
Aber das Konfigurationsskript der Applikation hat
erkannt, dass die Bibliothek auf dem System vorhanden ist
und fügt ihre Funktionen in die Binärdatei ein.
Falls der Nutzer sich nun entschliesst libfoo von seinem
System zu entfernen, dann wird das Ports-System nicht
protestieren (es wurde keine Abhängigkeit von libfoo
eingetragen), aber die Applikation bricht ab.</para>
<example>
<title>Korrekte Behandlung einer Option</title>
<programlisting>.if defined(WITH_FOO)
LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+= --enable-foo
.else
CONFIGURE_ARGS+= --disable-foo
.endif</programlisting>
</example>
<para>Im zweiten Beispiel wird die Bibliothek libfoo explizit
abgeschaltet. Das Konfigurationsskript aktiviert die
entsprechenden Funktionen nicht in der Applikation trotz
der Anwesenheit der Bibliothek auf dem System.</para>
</sect2>
</sect1>
<sect1 id="makefile-wrkdir">
<title>Die Festlegung des Arbeitsverzeichnisses</title>
<para>Jeder Port wird extrahiert in ein Arbeitsverzeichnis,
welches beschreibbar sein muss. Das Ports-System gibt als
Standard vor, dass die <makevar>DISTFILES</makevar> in
einem Verzeichnis namens <literal>${DISTNAME}</literal>
entpackt werden. Mit anderen Worten, wenn Sie:</para>
<programlisting>PORTNAME= foo
PORTVERSION= 1.0</programlisting>
<para>festgelegt haben, dann enthalten die Distributions-Dateien
des Ports ein Verzeichnis auf oberster Ebene,
<filename>foo-1.0</filename>, und der Rest der Dateien
befindet sich unter diesem Verzeichnis.</para>
<para>Es gibt eine Reihe von Variablen, die Sie
überschreiben können, falls dies nicht der Fall
sein sollte.</para>
<sect2>
<title><makevar>WRKSRC</makevar></title>
<para>Diese Variable listet den Namen des Verzeichnisses,
welches erstellt wird, wenn die Distfiles der Applikation
extrahiert werden. Wenn unser vorheriges Beispiel in einem
Verzeichnis namens <filename>foo</filename> (und nicht
<filename>foo-1.0</filename>) extrahiert wurde,
würden Sie schreiben:</para>
<programlisting>WRKSRC= ${WRKDIR}/foo</programlisting>
<para>oder möglicherweise</para>
<programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}
</programlisting>
</sect2>
<sect2>
<title><makevar>NO_WRKSUBDIR</makevar></title>
<para>Wenn der Port überhaupt nicht in einem
Unterverzeichnis extrahiert wird, sollten Sie dies mit dem
Setzen von <makevar>NO_WRKSUBDIR</makevar> anzeigen.</para>
<programlisting>NO_WRKSUBDIR= yes</programlisting>
</sect2>
</sect1>
<sect1 id="conflicts">
<title>Konfliktbehandlung</title>
<para>Es gibt drei verschiedene Variablen, um einen
Konflikt zwischen Paketen und Ports zu dokumentieren:
<makevar>CONFLICTS</makevar>,
<makevar>CONFLICTS_INSTALL</makevar> sowie
<makevar>CONFLICTS_BUILD</makevar>.</para>
<note>
<para><makevar>CONFLICTS</makevar> setzt automatisch die
Variable <makevar>IGNORE</makevar>, die
ausführlicher in <xref
linkend="dads-noinstall"/> beschrieben wird.</para>
</note>
<para>Beim Entfernen eines von mehreren in Konflikt stehenden
Ports ist es ratsam, die
<makevar>CONFLICTS</makevar>-Einträge in den anderen
Ports für einige Monate beizubehalten, um Nutzer zu
unterstützen, die ihre Ports nur sporadisch
aktualisieren.</para>
<sect2>
<title><makevar>CONFLICTS_INSTALL</makevar></title>
<para>Falls Ihr Paket nicht mit anderen Paketen koexistieren
kann (wegen Dateikonflikten, Laufzeit-Inkompatibilitäten
usw.), führen Sie bitte die anderen Paketnamen in der
Variable <makevar>CONFLICTS_INSTALL</makevar> auf. Sie
können hier Shell-Globs wie <literal>*</literal> und
<literal>?</literal> verwenden. Paketnamen sollten in der
gleichen Weise aufgezählt werden, wie sie in
<filename>/var/db/pkg</filename> auftauchen. Bitte stellen
Sie sicher, dass <makevar>CONFLICTS</makevar> nicht mit dem
Paket des Ports selbst übereinstimmt, da ansonsten das
Erzwingen der Installation durch
<makevar>FORCE_PKG_REGISTER</makevar> nicht länger
funktionieren wird.</para>
</sect2>
<sect2>
<title><makevar>CONFLICTS_BUILD</makevar></title>
<para>Wenn Ihr Port nicht gebaut werden kann, wenn ein
bestimmter Port bereits installiert ist, geben Sie diesen in
der Variable <makevar>CONFLICTS_BUILD</makevar> an. Sie
können hier Shell-Globs wie <literal>*</literal> und
<literal>?</literal> verwenden. Paketnamen sollten in der
gleichen Weise aufgezählt werden, wie sie in
<filename>/var/db/pkg</filename> auftauchen. Die
CONFLICTS_BUILD-Prüfung erfolgt vor dem Bau des Ports.
Baukonflikte werden im erzeugten Paket nicht
verzeichnet.</para>
</sect2>
<sect2>
<title><makevar>CONFLICTS</makevar></title>
<para>Wenn Ihr Port nicht gebaut werden kann, wenn ein bestimmter
Port bereits installiert ist und das aus dem Port erzeugte
Paket nicht mit dem anderen Paket koexistieren kann, geben Sie
das andere Paket in der Variable <makevar>CONFLICTS</makevar>
an. Sie können hier Shell-Globs wie <literal>*</literal> und
<literal>?</literal> verwenden. Paketnamen sollten in der
gleichen Weise aufgezählt werden, wie sie in
<filename>/var/db/pkg</filename> auftauchen. Bitte stellen
Sie sicher, dass <makevar>CONFLICTS_INSTALL</makevar> nicht mit
dem Paket des Ports selbst übereinstimmt, da ansonsten das
Erzwingen der Installation durch
<makevar>FORCE_PKG_REGISTER</makevar> nicht länger
funktionieren wird. Die CONFLICTS-Prüfung erfolgt vor dem
Bau des Ports und vor der Installation des gebauten Ports.</para>
</sect2>
</sect1>
<sect1 id="install">
<title>Installation von Dateien</title>
<sect2 id="install-macros">
<title>INSTALL_* macros</title>
<para>Nutzen Sie die Makros in
<filename>bsd.port.mk</filename>, um korrekte
Modi und Eigentümer von Dateien in Ihren
<maketarget>*-install</maketarget>-Targets
sicherzustellen.</para>
<itemizedlist>
<listitem>
<para><makevar>INSTALL_PROGRAM</makevar> ist ein Befehl,
um binäre Binärdateien zu installieren.</para>
</listitem>
<listitem>
<para><makevar>INSTALL_SCRIPT</makevar> ist ein Befehl,
um ausführbare Skripte zu installieren.</para>
</listitem>
<listitem>
<para><makevar>INSTALL_LIB</makevar> ist ein Befehl
zur Installation Shared-Libraries.</para>
</listitem>
<listitem>
<para><makevar>INSTALL_KLD</makevar> ist ein Befehl, mit
dem Kernelmodule installiert werden können. Einige
Architekturen haben Probleme mit stripped-Modulen.
Daher sollten Sie diesen Befehl anstelle von
<makevar>INSTALL_PROGRAM</makevar> verwenden.</para>
</listitem>
<listitem>
<para><makevar>INSTALL_DATA</makevar> ist ein Befehl,
um gemeinsam nutzbare Daten zu installieren.</para>
</listitem>
<listitem>
<para><makevar>INSTALL_MAN</makevar> ist ein Befehl,
um Manualpages oder andere Dokumentation zu
installieren (es wird nichts komprimiert).</para>
</listitem>
</itemizedlist>
<para>Das sind grundsätzlich alle
<command>install</command>-Befehle mit
ihren passenden Flags.</para>
</sect2>
<sect2 id="install-strip">
<title>Zerlegen von Binärdateien und
Shared-Libraries</title>
<para>Zerlegen Sie keine Binärdateien manuell,
wenn Sie es nicht müssen. Alle Binaries sollten
gestripped werden; allerdings vermag das
<makevar>INSTALL_PROGRAM</makevar>-Makro gleichzeitig
eine Binärdatei zu installieren und zu strippen
(beachten Sie den nächsten Abschnitt). Das
Makro <makevar>INSTALL_LIB</makevar> erledigt das
gleiche für Shared-Libraries.</para>
<para>Wenn Sie eine Datei strippen müssen, aber weder
das <makevar>INSTALL_PROGRAM</makevar>- noch das
<makevar>INSTALL_LIB</makevar>-Makro nutzen wollen, dann
kann <makevar>${STRIP_CMD}</makevar> Ihr Programm strippen.
Dies wird typischerweise innerhalb des
<literal>post-install</literal>-Targets gemacht.
Zum Beispiel:</para>
<programlisting>post-install:
${STRIP_CMD} ${PREFIX}/bin/xdl</programlisting>
<para>Nutzen Sie &man.file.1; für die installierte
Applikation, um zu überprüfen, ob eine
Binärdatei gestripped ist oder nicht.
Wenn es nicht meldet <literal>not stripped</literal>,
dann ist es bereits gestripped. Zudem wird &man.strip.1;
nicht ein bereits gestripptes Programm nochmals versuchen
zu strippen, sondern wird stattdessen einfach sauber
beenden.</para>
</sect2>
<sect2 id="install-copytree">
<title>Installation eines ganzen Verzeichnisbaums
inklusive Dateien</title>
<para>Manchmal muss man eine große Zahl von Dateien
unter Erhalt ihrer hierarchischen Struktur installieren,
d.h. Kopieraktionen über einen ganzen Verzeichnisbaum
von <makevar>WRKSRC</makevar> zu einem Zielverzeichnis unter
<makevar>PREFIX</makevar>.</para>
<para>Für diesen Fall gibt es zwei Makros. Der Vorteil
der Nutzung dieser Makros anstatt <command>cp</command> ist,
dass sie korrekte Besitzer und Berechtigungen auf den
Zieldateien garantieren.
Das erste Makro, <makevar>COPYTREE_BIN</makevar>, wird alle
installierten Dateien ausführbar markieren und damit
passend für die Installation in
<filename><makevar>PREFIX</makevar>/bin</filename>
vorbereiten. Das zweite Makro,
<makevar>COPYTREE_SHARE</makevar>, setzt keine
Ausführungsberechtigungen auf Dateien und ist daher
geeignet für die Installation von Dateien im Target von
<filename><makevar>PREFIX</makevar>/share</filename>.</para>
<programlisting>post-install:
${MKDIR} ${EXAMPLESDIR}
(cd ${WRKSRC}/examples/ &amp;&amp; ${COPYTREE_SHARE} \* ${EXAMPLESDIR})</programlisting>
<para>Dieses Beispiel wird den Inhalt des
<filename>examples</filename>-Verzeichnisses im Distfile
des Drittanbieters in das Beispielverzeichnis Ihres Ports
kopieren.</para>
<programlisting>post-install:
${MKDIR} ${DATADIR}/summer
(cd ${WRKSRC}/temperatures/ &amp;&amp; ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)</programlisting>
<para>Und dieses Beispiel wird die Daten der Sommermonate in
das <filename>summer</filename>-Unterverzeichnis eines
<filename><makevar>DATADIR</makevar></filename>
installieren.</para>
<para>Zusätzliche <command>find</command>-Argumente
können mit dem dritten Argument an die
<makevar>COPYTREE_*</makevar>-Makros übergeben werden.
Um zum Beispiel alle Dateien aus dem 1. Beispiel ohne die
Makefiles zu installieren, kann man folgenden Befehl
benutzen.</para>
<programlisting>post-install:
${MKDIR} ${EXAMPLESDIR}
(cd ${WRKSRC}/examples/ &amp;&amp; \
${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")</programlisting>
<para>Beachten Sie bitte, dass diese Makros die installierten
Dateien nicht zur <filename>pkg-plist</filename>
hinzufügen, Sie müssen sie immer noch selbst
auflisten.</para>
</sect2>
<sect2 id="install-documentation">
<title>Installation zusätzlicher Dokumentation</title>
<para>Falls Ihre Software zusätzlich zu den üblichen
Manualpages und Info-Seiten weitere Dokumentation hat und
Sie diese für nützlich halten, dann installieren
Sie sie unter
<filename><makevar>PREFIX</makevar>/share/doc</filename>.
Dies kann wie vorstehend im Target des
<maketarget>post-install</maketarget> geschehen.</para>
<para>Legen Sie ein neues Verzeichnis für Ihren Port an.
Das Verzeichnis sollte wiederspiegeln, was der Port ist.
Das bedeutet normalerweise <makevar>PORTNAME</makevar>.
Wie auch immer, wenn Sie meinen, der Nutzer möchte
verschiedene Versionen des Ports zur gleichen Zeit
installiert haben, dann können Sie die gesamte Variable
<makevar>PKGNAME</makevar> nutzen.</para>
<para>Machen Sie die Installation von der Variablen
<makevar>NOPORTDOCS</makevar> abhängig, damit die
Nutzer sie in <filename>/etc/make.conf</filename> abschalten
können:</para>
<programlisting>post-install:
.if !defined(NOPORTDOCS)
${MKDIR} ${DOCSDIR}
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
.endif</programlisting>
<para>Hier einige praktische Variablen und wie sie
standardmässig bei Verwendung im
<filename>Makefile</filename> expandiert werden:</para>
<itemizedlist>
<listitem>
<para><makevar>DATADIR</makevar> wird expandiert zu
<filename><makevar>PREFIX</makevar>/share/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
<listitem>
<para><makevar>DATADIR_REL</makevar> wird expandiert zu
<filename>share/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
<listitem>
<para><makevar>DOCSDIR</makevar> wird expandiert zu
<filename><makevar>PREFIX</makevar>/share/doc/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
<listitem>
<para><makevar>DOCSDIR_REL</makevar> wird expandiert zu
<filename>share/doc/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
<listitem>
<para><makevar>EXAMPLESDIR</makevar> wird expandiert zu
<filename><makevar>PREFIX</makevar>/share/examples/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
<listitem>
<para><makevar>EXAMPLESDIR_REL</makevar> wird expandiert zu
<filename>share/examples/<makevar>PORTNAME</makevar></filename>.</para>
</listitem>
</itemizedlist>
<note>
<para><makevar>NOPORTDOCS</makevar> behandelt nur
zusätzliche Dokumentation, die in
<makevar>DOCSDIR</makevar> installiert ist.
Für normale Manualpages und Info-Seiten
wird die Variable benutzt.
Dinge, welche in <makevar>DATADIR</makevar>
und <makevar>EXAMPLESDIR</makevar> installiert werden,
legen die Variablen <makevar>NOPORTDATA</makevar> und
<makevar>NOPORTEXAMPLES</makevar> fest.</para>
</note>
<para>Die Variablen werden nach <makevar>PLIST_SUB</makevar>
exportiert. Ihre Werte erscheinen dort als Pfadnamen relativ
zu <filename><makevar>PREFIX</makevar></filename>,
falls möglich. Das bedeutet, dass
<filename>share/doc/<makevar>PORTNAME</makevar></filename>
standardmässig ersetzt wird durch
<literal>%%DOCSDIR%%</literal> in der Packliste usw.
(mehr zur Ersetzung durch die
<filename>pkg-plist</filename> finden Sie
<link linkend="plist-sub">hier</link>).</para>
<para>Alle installierten Dokumentationsdateien
und&nbsp;&ndash;Verzeichnisse
sollten in der <filename>pkg-plist</filename> dem
<literal>%%PORTDOCS%%</literal>-Präfix
enthalten sein, zum Beispiel:</para>
<programlisting>%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%</programlisting>
<para>Alternativ zur Auflistung der Dokumentationsdateien in
der <filename>pkg-plist</filename> kann in einem Port auch
die Variable <makevar>PORTDOCS</makevar> gesetzt werden
für eine Liste von Dateien und Shell-Globs, um diese
zur endgültigen Packliste hinzuzufügen. Die Namen
werden relativ zur Variable <makevar>DOCSDIR</makevar> sein.
Wenn Sie also einen Port haben, welcher
<makevar>PORTDOCS</makevar> benutzt, und Sie haben eine vom
Standard abweichenden Platz für seine Dokumentation,
dann müssen Sie die Variable <makevar>DOCSDIR</makevar>
entsprechend setzen. Wenn ein Verzeichnis in
<makevar>PORTDOCS</makevar> aufgeführt ist, oder von
einem Shell-Glob dieser Variable abgebildet wird, dann wird
der komplette Verzeichnisbaum inklusive Dateien und
Verzeichnissen in der endgültigen Packliste
aufgenommen. Wenn die Variable <makevar>NOPORTDOCS</makevar>
gesetzt ist, dann werden die Dateien und Verzeichnisse,
die in <makevar>PORTDOCS</makevar> aufgelistet sind,
nicht installiert und werden auch nicht zur Packliste des
Ports hinzugefügt. Wie oben gezeigt bleibt es dem Port
selbst überlassen, die Dokumentation in
<makevar>PORTDOCS</makevar> zu installieren. Ein typisches
Beispiel für den Gebrauch von
<makevar>PORTDOCS</makevar> sieht wie folgt aus:</para>
<programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting>
<note>
<para>Die Äquivalente zu <makevar>PORTDOCS</makevar>
für unter <makevar>DATADIR</makevar> und
<makevar>EXAMPLESDIR</makevar> installierte Dateien sind
<makevar>PORTDATA</makevar> beziehungsweise
<makevar>PORTEXAMPLES</makevar>.</para>
<para>Sie können auch <filename>pkg-message</filename>
benutzen, um Meldungen während der Installation
anzuzeigen. Lesen Sie <link
linkend="porting-message">diesen Abschnitt über den
Gebrauch von <filename>pkg-message</filename></link>
für weitere Details.
Die <filename>pkg-message</filename>-Datei muss nicht zur
<filename>pkg-plist</filename> hinzugefügt
werden.</para>
</note>
</sect2>
<sect2 id="install-subdirs">
<title>Unterverzeichnisse mit PREFIX</title>
<para>Lassen Sie den Port die Dateien in die richtigen
Unterverzeichnisse von <makevar>PREFIX</makevar> verteilen.
Einige Ports werfen alles in einen Topf und legen es im
Unterverzeichnis mit dem Namen des Ports ab, was falsch ist.
Ausserdem legen viele Ports alles ausser Binaries,
Header-Dateien und Manualpages in ein Unterverzeichnis
von <filename>lib</filename>, was natürlich auch nicht
der BSD-Philosophie entspricht und nicht gut funktioniert.
Viele der Dateien sollten in eines der folgenden
Verzeichnisse geschoben werden: <filename>etc</filename>
(Konfigurationsdateien), <filename>libexec</filename>
(intern gestartete Binärdateien),
<filename>sbin</filename> (Binärdateien für
Superuser/Manager), <filename>info</filename>
(Dokumentation für Info-Browser) oder
<filename>share</filename> (Architektur-unabhängige
Dateien). Lesen Sie hierzu &man.hier.7;; weitestgehend
greifen die Regeln für <filename>/usr</filename> auch
für <filename>/usr/local</filename>. Die Ausnahme sind
Ports, welche mit <quote>news</quote> aus dem USENET
arbeiten. In diesem Falle sollte
<filename><makevar>PREFIX</makevar>/news</filename>
als Zielort für die Dateien benutzt werden.</para>
</sect2>
</sect1>
</chapter>
<chapter id="special">
<title>Besonderheiten</title>
<para>Es gibt einige Dinge mehr, die zu beachten sind,
wenn man einen Port erstellt. Dieser Abschnitt
erklärt die wichtigsten.</para>
<sect1 id="porting-shlibs">
<title>Shared-Libraries</title>
<para>Wenn Ihr Port eine oder mehrere Shared-Libraries
installiert, dann definieren Sie bitte eine
<makevar>USE_LDCONFIG</makevar> make-Variable,
die <filename>bsd.port.mk</filename> anweisen wird,
<literal>&dollar;{LDCONFIG} -m</literal> auf das
Verzeichnis, in das die neue Library installiert wird
(normalerweise
<filename><makevar>PREFIX</makevar>/lib</filename>),
während des
<maketarget>post-install</maketarget>-Targets anzuwenden,
um sie im Shared-Library-Cache zu registrieren.
Diese Variable, wenn definiert, wird auch dafür sorgen,
dass ein entsprechendes
<literal>@exec /sbin/ldconfig -m</literal> und
<literal>@unexec /sbin/ldconfig -R</literal>-Paar zu Ihrer
<filename>pkg-plist</filename>-Datei hinzugefügt wird,
sodass ein Benutzer, der das Paket installiert, die
Bibliothek danach sofort benutzen kann und das System nach
deren Deinstallation nicht glaubt, die Bibliothek wäre
noch da.</para>
<programlisting>USE_LDCONFIG= yes</programlisting>
<para>Wenn nötig, können Sie das Standardverzeichnis
außer Kraft setzen, indem Sie den
<makevar>USE_LDCONFIG</makevar> Wert auf eine Liste von
Verzeichnissen setzen, in die Shared Libraries installiert
werden sollen. Wenn Ihr Port z.B. diese Bibliotheken nach
<filename><makevar>PREFIX</makevar>/lib/foo</filename> und
<filename><makevar>PREFIX</makevar>/lib/bar</filename>
installiert, könnten Sie folgendes in Ihrem
<filename>Makefile</filename> benutzen:</para>
<programlisting>USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar</programlisting>
<para>Bitte überprüfen Sie dies genau. Oft ist das
überhaupt nicht nötig oder kann durch
<literal>-rpath</literal> oder das Setzen von
<envar>LD_RUN_PATH</envar> während des Linkens umgangen
werden (s. <filename
role="package">lang/moscow_ml</filename> für ein
Beispiel), oder durch einen Shell-Wrapper, der
<makevar>LD_LIBRARY_PATH</makevar> setzt, bevor er die
Binärdatei ausführt, wie es <filename
role="package">www/seamonkey</filename> tut.</para>
<para>Wenn Sie 32-Bit Libraries auf 64-Bit Systemen
installieren, benutzen Sie stattdessen
<makevar>USE_LDCONFIG32</makevar>.</para>
<para>Versuchen Sie Shared-Library-Versionsnummern im
<filename>libfoo.so.0</filename> Format zu halten.
Unser Runtime-Linker kümmert sich nur um die Major
(erste) Nummer.</para>
<para>Wenn sich die Major-Library-Versionsnummer
während der Aktualisierung zu einer neuen
Portversion erhöht, sollte auch die
<makevar>PORTREVISION</makevar> aller Ports, die die
Shared-Library linken, erhöht werden, damit diese
mit der neuen Version der Bibliothek neu kompiliert
werden.</para>
</sect1>
<sect1 id="porting-restrictions">
<title>Ports mit beschränkter Verbreitung</title>
<para>Lizenzen variieren und manche geben Restriktionen vor,
wie die Applikation gepackt werden oder ob sie
gewinnorientiert verkauft werden kann, usw.</para>
<important>
<para>Es liegt in Ihrer Verantwortung als Porter die
Lizenzbestimmungen der Software zu lesen und
sicherzustellen, dass das FreeBSD-Projekt nicht haftbar
gemacht wird für Lizenzverletzungen durch
Weiterverbreitung des Quelltextes oder kompilierter
Binaries über FTP/HTTP oder CD-ROM. Im Zweifelsfall
kontaktieren Sie bitte die &a.ports;.</para>
</important>
<para>In solchen Situationen können die in den folgenden
Abschnitten beschriebenen Variablen gesetzt werden.</para>
<sect2>
<title><makevar>NO_PACKAGE</makevar></title>
<para>Diese Variable zeigt an, dass wir keine binären
Pakete dieser Applikation erzeugen dürfen - z.B. wenn
die Lizenz die Weiterverteilung von binären Paketen
oder Paketen verbietet, die aus verändertem Quelltext
erzeugt wurden.</para>
<para>Die <makevar>DISTFILES</makevar> des Ports dürfen
allerdings frei über FTP/HTTP Mirrors
weiterverbreitet werden. Sie dürfen auch auf CD-ROM
(oder ähnlichen Medien) weiterverbreitet werden - es
sei denn, <makevar>NO_CDROM</makevar> ist ebenfalls
gesetzt.</para>
<para><makevar>NO_PACKAGE</makevar> sollte auch benutzt
werden, wenn das binäre Paket nicht allgemein
brauchbar ist und die Applikation immer aus dem Quelltext
kompiliert werden sollte.
Zum Beispiel, wenn die Applikation konfigurierte
Informationen über den Rechner/Installationsort bei
der Installation einkompiliert bekommt, setzen Sie
<makevar>NO_PACKAGE</makevar>.</para>
<para><makevar>NO_PACKAGE</makevar> sollte auf eine
Zeichenkette gesetzt werden, die den Grund beschreibt,
warum kein Paket erzeugt werden soll.</para>
</sect2>
<sect2>
<title><makevar>NO_CDROM</makevar></title>
<para>Diese Variable gibt an, dassobwohl wir binäre
Pakete erzeugen dürfen&nbsp;&ndash;&nbsp;wir weder
diese Pakete noch die <makevar>DISTFILES</makevar> des
Ports auf einer CD-ROM (oder ähnlichen Medien)
verkaufen dürfen. Die <makevar>DISTFILES</makevar>
des Ports dürfen allerdings immer noch auf FTP/HTTP
Mirrors.</para>
<para>Wenn diese Variable und auch
<makevar>NO_PACKAGE</makevar> gesetzt ist, dann werden
nur die <makevar>DISTFILES</makevar> des Ports
erhältlich sein&nbsp;&ndash;&nbsp;und das nur
mittels FTP/HTTP.</para>
<para><makevar>NO_CDROM</makevar> sollte auf eine
Zeichenkette gesetzt werden, die den Grund beschreibt,
warum der Port nicht auf CD-ROM weiterverbreitet werden
kann. Das sollte z.B. gemacht werden, wenn die Lizenz
des Ports nur für
<quote>nichtkommerzielle Zwecke</quote> gilt.</para>
</sect2>
<sect2>
<title><makevar>NOFETCHFILES</makevar></title>
<para>Dateien, die in der Variable
<makevar>NOFETCHFILES</makevar> aufgelistet sind,
sind von keiner der <makevar>MASTER_SITES</makevar>
abrufbar. Ein Beispiel solch einer Datei ist eine selbige,
welche vom Anbieter auf CD-ROM bereitgestellt wird.</para>
<para>Werkzeuge, die das Vorhandensein dieser Dateien auf
den <makevar>MASTER_SITES</makevar>
überprüfen, sollten diese Dateien
ignorieren und sie nicht melden.</para>
</sect2>
<sect2>
<title><makevar>RESTRICTED</makevar></title>
<para>Setzen Sie diese Variable, wenn die Lizenz der
Applikation weder das Spiegeln der
<makevar>DISTFILES</makevar> der Applikation noch
das Weiterverbreiten von binären Paketen in
jedweder Art erlaubt.</para>
<para><makevar>NO_CDROM</makevar> oder
<makevar>NO_PACKAGE</makevar> sollten nicht zusammen
mit <makevar>RESTRICTED</makevar> gesetzt werden, weil
letztere Variable die anderen beiden impliziert.</para>
<para><makevar>RESTRICTED</makevar> sollte auf eine
Zeichenkette gesetzt werden, die den Grund beschreibt,
warum der Port nicht weiterverbreitet werden kann.
Typischerweise besagt dies, dass der Port proprietäre
Software enthält und der Benutzer die
<makevar>DISTFILES</makevar> manuell herunterladen
muss&nbsp;&ndash;&nbsp;möglicherweise erst nachdem
er sich für die Software registriert oder die
Bedingungen eines Endbenutzer-Lizenzvertrags
(<acronym>EULA</acronym>) akzeptiert hat.</para>
</sect2>
<sect2>
<title><makevar>RESTRICTED_FILES</makevar></title>
<para>Wenn <makevar>RESTRICTED</makevar> oder
<makevar>NO_CDROM</makevar> gesetzt ist, ist diese
Variable auf <literal>${DISTFILES}
${PATCHFILES}</literal> voreingestellt, sonst ist sie
leer. Wenn nicht jede dieser Dateien beschränkt ist,
dann führen Sie die betroffenen Dateien in dieser
Variable auf.</para>
<para>Beachten Sie, dass der Porter für jede
aufgeführte Distributionsdatei einen Eintrag zu
<filename>/usr/ports/LEGAL</filename> hinzufügen
sollte, der genau beschreibt, was die Beschränkung
mit sich bringt.</para>
</sect2>
</sect1>
<sect1 id="building">
<title>Build-Mechanismen</title>
<sect2 id="parallel-builds">
<title>Paralleles Bauen von Ports</title>
<para>Das Ports-Framework von &os; unterstützt das
parallele Bauen von Ports, indem es mehrere
<command>make</command>-Instanzen ausführt, damit
<acronym>SMP</acronym>-Systeme ihre gesamte
<acronym>CPU</acronym>-Rechenleistung ausnützen
können und so das Bauen von Ports schneller und
effektiver werden kann.</para>
<para>Dies ermöglicht der Parameter
<makevar>-jX</makevar> an &man.make.1;, wenn Code von
Drittanbietern kompiliert wird. Leider können nicht
alle Ports wirklich gut mit dem Parallelbau umgehen.
Deshalb ist es erforderlich, dass dieses Feature explizit
durch <literal>MAKE_JOBS_SAFE=yes</literal> irgendwo
unterhalb des Abschnitts für Abhängigkeiten im
<filename>Makefile</filename> aktiviert wird.</para>
<para>Eine weitere Möglichkeit im Umgang mit dieser
Option besteht für den Maintainer darin,
<makevar>MAKE_JOBS_UNSAFE=yes</makevar> zu setzen. Diese
Variable wird dann verwendet, wenn ein Port bekannterweise
mit <makevar>-jX</makevar> nicht gebaut werden kann, der
Benutzer jedoch für alle Ports den Mehrprozessorbau
durch <literal>FORCE_MAKE_JOBS=yes</literal> in
<filename>/etc/make.conf</filename> erzwingt.</para>
</sect2>
<sect2 id="using-make">
<title><command>make</command>, <command>gmake</command>
und <command>imake</command></title>
<para>Wenn Ihr Port <application>GNU make</application>
benutzt, dann setzen Sie bitte
<literal>USE_GMAKE=yes</literal>.</para>
<table frame="none">
<title>Port-Variablen im Zusammenhang mit
<application>gmake</application></title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_GMAKE</makevar></entry>
<entry>Der Port benötigt <command>gmake</command>
für den Build.</entry>
</row>
<row>
<entry><makevar>GMAKE</makevar></entry>
<entry>Der ganze Pfad zu <command>gmake</command>,
wenn es nicht im <envar>PATH</envar> ist.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Wenn Ihr Port eine X-Applikation ist, die
<filename>Makefile</filename>-Dateien aus
<filename>Imakefile</filename>-Dateien mit
<application>imake</application> erzeugt, dann setzen Sie
<literal>USE_IMAKE=yes</literal>. Das sorgt dafür,
dass die Konfigurationsphase automatisch ein
<command>xmkmf -a</command> ausführt.
Wenn das Flag <option>-a</option> ein Problem für
Ihren Port darstellt, setzen Sie
<literal>XMKMF=xmkmf</literal>. Wenn der Port
<application>imake</application> benutzt, aber das
<maketarget>install.man</maketarget>-Target nicht versteht,
dann sollte <literal>NO_INSTALL_MANPAGES=yes</literal>
gesetzt werden.</para>
<para>Wenn das <filename>Makefile</filename>
im Quelltext Ihres Ports etwas anderes als
<maketarget>all</maketarget> als Haupt-Build-Target
hat, setzen Sie <makevar>ALL_TARGET</makevar>
entsprechend. Das Gleiche gilt für
<maketarget>install</maketarget> und
<makevar>INSTALL_TARGET</makevar>.</para>
</sect2>
<sect2 id="using-configure">
<title><command>configure</command> Skript</title>
<para>Wenn Ihr Port ein <command>configure</command>-Skript
benutzt, um <filename>Makefile</filename>-Dateien aus
<filename>Makefile.in</filename>-Dateien zu erzeugen,
setzen Sie <literal>GNU_CONFIGURE=yes</literal>.
Wenn Sie dem <command>configure</command>-Skript
zusätzliche Argumente übergeben wollen (das
Vorgabeargument ist <literal>--prefix=&dollar;{PREFIX}
--infodir=&dollar;{PREFIX}/&dollar;{INFO_PATH}
--mandir=&dollar;{MANPREFIX}/man
--build=&dollar;{CONFIGURE_TARGET}</literal>), setzen Sie diese
zusätzlichen Argumente in
<makevar>CONFIGURE_ARGS</makevar>.
Zusätzliche Umgebungsvariablen können
überdie Variable <makevar>CONFIGURE_ENV</makevar>
übergeben werden.</para>
<table frame="none">
<title>Variablen für Ports, die
<command>configure</command> benutzen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>GNU_CONFIGURE</makevar></entry>
<entry>Der Port benutzt ein
<command>configure</command>-Skript, um das Bauen
vorzubereiten.</entry>
</row>
<row>
<entry><makevar>HAS_CONFIGURE</makevar></entry>
<entry>Wie <makevar>GNU_CONFIGURE</makevar>, nur
dass kein Standard-Konfigurations-Target zu
<makevar>CONFIGURE_ARGS</makevar> hinzugefügt
wird.</entry>
</row>
<row>
<entry><makevar>CONFIGURE_ARGS</makevar></entry>
<entry>Zusätzliche Argumente für das
<command>configure</command>-Skript.</entry>
</row>
<row>
<entry><makevar>CONFIGURE_ENV</makevar></entry>
<entry>Zusätzliche Umgebungsvariablen
für die Abarbeitung des
<command>configure</command>-Skriptes.</entry>
</row>
<row>
<entry><makevar>CONFIGURE_TARGET</makevar></entry>
<entry>Ersetzt das Standard-Konfigurations-Target.
Vorgabewert ist
<literal>&dollar;{MACHINE_ARCH}-portbld-freebsd&dollar;{OSREL}</literal>.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="using-scons">
<title>Benutzung von <command>scons</command></title>
<para>Wenn Ihr Port <application>SCons</application>
benutzt, definieren Sie
<literal>USE_SCONS=yes</literal>.</para>
<table frame="none">
<title>Variablen für Ports, die
<command>scons</command> benutzen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>SCONS_ARGS</makevar></entry>
<entry>Port-spezifische SCons-Argumente, die der
SCons-Umgebung übergeben werden.</entry>
</row>
<row>
<entry><makevar>SCONS_BUILDENV</makevar></entry>
<entry>Variablen, die in der System-Umgebung
gesetzt werden sollen.</entry>
</row>
<row>
<entry><makevar>SCONS_ENV</makevar></entry>
<entry>Variablen, die in der SCons-Umgebung
gesetzt werden sollen.</entry>
</row>
<row>
<entry><makevar>SCONS_TARGET</makevar></entry>
<entry>Letztes Argument, das SCons übergeben
wird&nbsp;&ndash;&nbsp;ähnlich
<makevar>MAKE_TARGET</makevar>.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Um <filename>SConstruct</filename> im Quelltext alles,
was SCons in <makevar>SCONS_ENV</makevar> übergeben
wird, respektieren zu lassen (das ist hauptsächlich
<makevar>CC/CXX/CFLAGS/CXXFLAGS</makevar>), patchen Sie
<filename>SConstruct</filename>, sodass das Build
<literal>Environment</literal> wie folgt konstruiert
wird:</para>
<programlisting>env = Environment(**ARGUMENTS)</programlisting>
<para>Es kann dann mit <literal>env.Append</literal> und
<literal>env.Replace</literal> modifiziert werden.</para>
</sect2>
</sect1>
<sect1 id="using-autotools">
<title>Benutzung von GNU autotools</title>
<sect2 id="using-autotools-introduction">
<title>Einführung</title>
<para>Die verschiedenen GNU autotools stellen einen
Abstraktionsmechanismus bereit für das Kompilieren
von Software für eine Vielfalt von Betriebssystemen
und Maschinenarchitekturen. Innerhalb der Ports-Sammlung
kann ein einzelner Port diese Werkzeuge mit Hilfe eines
einfachen Konstrukts benutzen:</para>
<programlisting>USE_AUTOTOOLS= <replaceable>tool</replaceable>:<replaceable>version</replaceable>[:<replaceable>operation</replaceable>] ...</programlisting>
<para>Als dies geschrieben wurde konnte
<replaceable>tool</replaceable> eins von
<literal>libtool</literal>, <literal>libltdl</literal>,
<literal>autoconf</literal>,
<literal>autoheader</literal>,
<literal>automake</literal> oder
<literal>aclocal</literal> sein.</para>
<para><replaceable>version</replaceable> gibt die einzelne
Werkzeug-Revision an, die benutzt werden soll (siehe
<literal>devel/{automake,autoconf,libtool}[0-9]+</literal>
für mögliche Versionen).</para>
<para><replaceable>operation</replaceable> ist eine
optionale Angabe, die modifiziert, wie das Werkzeug
benutzt wird.</para>
<para>Es können auch mehrere Werkzeuge angegeben
werden&nbsp;&ndash;&nbsp;entweder durch Angabe aller in
einer einzigen Zeile oder durch Benutzung des
<literal>+=</literal> Makefile-Konstrukts.</para>
<para>Schliesslich gibt es das spezielle Tool, genannt
<literal>autotools</literal>, das der Einfachheit dient
indem es von alle verfügbaren Versionen der Autotools
abhängt, was sinnvoll für Cross-Development ist.
Dies kann auch erreicht werden, indem man den Port
<literal>devel/autotools</literal> installiert.</para>
</sect2>
<sect2 id="using-libtool">
<title><command>libtool</command></title>
<para>Shared-Libraries, die das GNU Build-System benutzen,
verwenden normalerweise
<command>libtool</command>, um die Kompilierung und
Installation solcher Bibliotheken anzupassen.
Die übliche Praxis ist, eine Kopie von
<command>libtool</command>, die mit dem Quelltext
geliefert wird, zu benutzen. Falls Sie ein externes
<command>libtool</command> benötigen, können
Sie die Version, die von der Ports-Sammlung bereitgestellt
wird, benutzen:</para>
<programlisting>USE_AUTOTOOLS= libtool:<replaceable>version</replaceable>[:env]</programlisting>
<para>Ohne zusätzliche Angaben sagt
<literal>libtool:<replaceable>version</replaceable>
</literal> dem Build-System, dass es das
Konfigurationsskript mit der auf dem System
installierten Kopie von <command>libtool</command>
patchen soll.
Die Variable <makevar>GNU_CONFIGURE</makevar> ist
impliziert. Außerdem werden einige
make&ndash;&nbsp;und shell-Variablen zur
weiteren Benutzung durch den Port gesetzt.
Für Genaueres siehe
<filename>bsd.autotools.mk</filename>.</para>
<para>Mit der Angabe <literal>:env</literal> wird nur die
Umgebung vorbereitet.</para>
<para>Schließlich können optional
<makevar>LIBTOOLFLAGS</makevar> und
<makevar>LIBTOOLFILES</makevar> gesetzt werden, um die
häufigsten Argumente und durch
<command>libtool</command> gepatchten Dateien außer
Kraft zu setzen. Die meisten Ports werden das aber nicht
brauchen. Für Weiteres siehe
<filename>bsd.autotools.mk</filename>.</para>
</sect2>
<sect2 id="using-libltdl">
<title><command>libltdl</command></title>
<para>Einige Ports benutzen das
<command>libltdl</command>-Bibliothekspaket,
welches Teil der <command>libtool</command>-Suite ist.
Der Gebrauch dieser Bibliothek macht nicht automatisch
den Gebrauch von <command>libtool</command> selbst
nötig, deshalb wird ein separates Konstrukt zur
Verfügung gestellt.</para>
<programlisting>USE_AUTOTOOLS= libltdl:<replaceable>version</replaceable></programlisting>
<para>Im Moment sorgt dies nur für eine
<makevar>LIB_DEPENDS</makevar>-Abhängigkeit von dem
entsprechenden <command>libltdl</command>-Port und wird
zur Vereinfachung zur Verfügung gestellt,
um Abhängigkeiten von den Autotools-Ports
ausserhalb des <makevar>USE_AUTOTOOLS</makevar>-Systems
zu eliminieren. Es gibt keine weiteren Angaben für
dieses Werkzeug.</para>
</sect2>
<sect2 id="using-autoconf">
<title><command>autoconf</command> und
<command>autoheader</command></title>
<para>Manche Ports enthalten kein Konfigurationsskript,
sondern eine autoconf-Vorlage in der
<filename>configure.ac</filename>-Datei.
Sie können die folgenden Zuweisungen benutzen,
um <command>autoconf</command> das Konfigurationsskript
erzeugen zu lassen, und auch <command>autoheader</command>
Header-Vorlagen zur Benutzung durch das
Konfigurationsskript erzeugen zu lassen.</para>
<programlisting>USE_AUTOTOOLS= autoconf:<replaceable>version</replaceable>[:env]</programlisting>
<para>und</para>
<programlisting>USE_AUTOTOOLS= autoheader:<replaceable>version</replaceable></programlisting>
<para>welches auch die Benutzung von
<literal>autoconf:<replaceable>version</replaceable>
</literal> impliziert.</para>
<para>Ähnlich wie bei <command>libtool</command>,
bereitet die Angabe des optionalen
<literal>:env</literal> nur die Umgebung für weitere
Benutzung vor. Ohne dieses wird der Port auch gepatched
und erneut konfiguriert.</para>
<para>Die zusätzlichen optionalen Variablen
<makevar>AUTOCONF_ARGS</makevar> und
<makevar>AUTOHEADER_ARGS</makevar> können durch das
<filename>Makefile</filename> des Ports ausser Kraft
gesetzt werden, wenn erforderlich. Wie bei den
<command>libtool</command>-Äquivalenten werden die
meisten Ports dies aber nicht benötigen.</para>
</sect2>
<sect2 id="using-automake">
<title><command>automake</command> und
<command>aclocal</command></title>
<para>Manche Pakete enthalten nur
<filename>Makefile.am</filename>-Dateien. Diese
müssen durch <command>automake</command> in
<filename>Makefile.in</filename>-Dateien konvertiert
und dann durch <command>configure</command>
weiterbearbeitet werden, um schließlich ein
<filename>Makefile</filename> zu erzeugen.</para>
<para>Ähnliches gilt für Pakete, die gelegentlich
keine <filename>aclocal.m4</filename>-Dateien mitliefern,
welche ebenfalls zum Erstellen der Software benötigt
werden. Diese können durch <command>aclocal</command>
erzeugt werden, welches <filename>configure.ac</filename>
oder <filename>configure.in</filename> durchsucht.</para>
<para><command>aclocal</command> hat eine ähnliche
Beziehung zu <command>automake</command> wie
<command>autoheader</command> zu
<command>autoconf</command>&nbsp;&ndash;&nbsp;beschrieben
im vorherigen Abschnitt. <command>aclocal</command>
impliziert die Benutzung von <command>automake</command>,
also haben wir:</para>
<programlisting>USE_AUTOTOOLS= automake:<replaceable>version</replaceable>[:<replaceable>env</replaceable>]</programlisting>
<para>und</para>
<programlisting>USE_AUTOTOOLS= aclocal:<replaceable>version</replaceable></programlisting>
<para>was auch die Benutzung von <literal>
automake:<replaceable>version</replaceable></literal>
impliziert.</para>
<para>Ähnlich wie bei <command>libtool</command> und
<command>autoconf</command>, bereitet die optionale Angabe
<literal>:env</literal> nur die Umgebung zur weiteren
Benutzung vor. Ohne sie wird der Port erneut
konfiguriert.</para>
<para>Wie schon <command>autoconf</command> und
<command>autoheader</command>, hat sowohl
<command>automake</command> als auch
<command>aclocal</command> eine optionale
Argument-Variable <makevar>AUTOMAKE_ARGS</makevar>
bzw. <makevar>ACLOCAL_ARGS</makevar>, die durch das
<filename>Makefile</filename> des Ports, falls nötig,
außer Kraft gesetzt werden kann.</para>
</sect2>
</sect1>
<sect1 id="using-gettext">
<title>Benutzung von GNU <literal>gettext</literal></title>
<sect2>
<title>Grundlegende Benutzung</title>
<para>Wenn Ihr Port <literal>gettext</literal>
benötigt, setzen Sie einfach
<makevar>USE_GETTEXT</makevar> auf <literal>yes</literal>,
und Ihr Port bekommt die Abhängigkeit von <filename
role="package">devel/gettext</filename>. Der Wert von
<makevar>USE_GETTEXT</makevar> kann auch die
benötigte Version der
<literal>libintl</literal>-Bibliothek angeben, der
grundlegenden Teil von
<literal>gettext</literal>&nbsp;&ndash;&nbsp;jedoch
wird von der Benutzung dieser Funktion
<emphasis>dringend abgeraten</emphasis>:
Ihr Port sollte einfach nur mit der aktuellen Version von
<filename role="package">devel/gettext</filename>
funktionieren.</para>
<para>Ein ziemlich häufiger Fall ist, dass ein Port
<literal>gettext</literal> und
<command>configure</command> benutzt. Normalerweise sollte
GNU <command>configure</command>
<literal>gettext</literal> automatisch finden können.
Sollte das einmal nicht funktionieren, können
Hinweise über den Ort von <literal>gettext</literal>
in <envar>CPPFLAGS</envar> und <envar>LDFLAGS</envar> wie
folgt übergeben werden:</para>
<programlisting>USE_GETTEXT= yes
CPPFLAGS+= -I${LOCALBASE}/include
LDFLAGS+= -L${LOCALBASE}/lib
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="${CPPFLAGS}" \
LDFLAGS="${LDFLAGS}"</programlisting>
<para>Natürlich kann der Code kompakter sein,
wenn es keine weiteren Flags gibt, die
<command>configure</command> übergeben werden
müssen:</para>
<programlisting>USE_GETTEXT= yes
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
LDFLAGS="-L${LOCALBASE}/lib"</programlisting>
</sect2>
<sect2>
<title>Optionale Benutzung</title>
<para>Manche Softwareprodukte erlauben die Deaktivierung
von NLS - z.B. durch Übergeben von
<option>--disable-nls</option> an
<command>configure</command>. In diesem Fall sollte Ihr
Port <literal>gettext</literal> abhängig vom Status
von <link
linkend="knobs-without-nls"><makevar>WITHOUT_NLS</makevar></link>
benutzen. Für Ports mit niedriger bis mittlerer
Komplexität können Sie sich auf das folgende
Idiom verlassen:</para>
<programlisting>GNU_CONFIGURE= yes
.if !defined(WITHOUT_NLS)
USE_GETTEXT= yes
PLIST_SUB+= NLS=""
.else
CONFIGURE_ARGS+= --disable-nls
PLIST_SUB+= NLS="@comment "
.endif</programlisting>
<para>Der nächste Punkt auf Ihrer Todo-Liste ist
dafür zu sorgen, dass die Message-Catalog-Dateien
nur bedingt in der Packliste aufgeführt werden. Der
<filename>Makefile</filename>-Teil dieser Aufgabe ist
schon durch obiges Idiom erledigt.
Das wird im Abschnitt über <link
linkend="plist-sub">Fortgeschrittene
<filename>pkg-plist</filename>-Methoden</link>
erklärt.
Kurz gesagt, jedes Vorkommen von
<literal>%%NLS%%</literal> in
<filename>pkg-plist</filename> wird durch
<quote><literal>@comment&nbsp;</literal></quote>, wenn NLS
abgeschaltet ist, oder durch eine leere Zeichenkette,
wenn NLS aktiviert ist, ersetzt. Folglich werden die
Zeilen, denen <literal>%%NLS%%</literal> vorangestellt
ist, zu reinen Kommentaren in der endgültigen
Packliste, wenn NLS abgeschaltet ist;
andernfalls wird der Prefix einfach nur ausgelassen.
Alles, was Sie jetzt noch machen müssen, ist
<literal>%%NLS%%</literal> vor jedem Pfad zu einer
Message-Catalog-Datei in <filename>pkg-plist</filename>
einzufügen. Zum Beispiel:</para>
<programlisting>%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo</programlisting>
<para>In sehr komplexen Fällen müssen Sie
eventuell fortgeschrittenere Techniken als die hier
vorgestellte benutzen - wie z.B. <link
linkend="plist-dynamic">Dynamische
Packlistenerzeugung</link>.</para>
</sect2>
<sect2>
<title>Behandlung von Message-Catalog-Verzeichnissen</title>
<para>Bei der Installation von Message-Catalog-Dateien
gibt es einen Punkt zu beachten. Ihr Zielverzeichnis,
das unter <filename>
<makevar>LOCALBASE</makevar>/share/locale</filename>
liegt, sollte nur selten von Ihrem Port erzeugt und
gelöscht werden. Die Verzeichnisse für die
gebräuchlichsten Sprachen sind in
<filename>/etc/mtree/BSD.local.dist</filename>
aufgelistet; das heisst, sie sind Teil des Systems.
Die Verzeichnisse für viele andere Sprachen sind
Teil des Ports <filename
role="package">devel/gettext</filename>. Sie wollen
vielleicht dessen <filename>pkg-plist</filename>
zur Hand nehmen, um festzustellen, ob Ihr Port eine
Message-Catalog-Datei für eine seltene Sprache
installiert.</para>
</sect2>
</sect1>
<sect1 id="using-perl">
<title>Die Benutzung von <literal>perl</literal></title>
<para>Wenn <makevar>MASTER_SITES</makevar> auf
<makevar>MASTER_SITE_PERL_CPAN</makevar> gesetzt ist,
dann ist der bevorzugte Wert von
<makevar>MASTER_SITE_SUBDIR</makevar> der Top-Level-Name
der Hierarchie. Zum Beispiel ist der empfohlene Wert
für
<literal>p5-Module-Name</literal>-<literal>Module</literal>.
Die Top-Level-Hierarchie kann unter <ulink
url="http://cpan.org/modules/by-module/">cpan.org</ulink>
angeschaut werden. Dies sorgt dafür, dass der Port
weiter funktioniert, wenn sich der Autor des Moduls
ändert.</para>
<para>Die Ausnahme dieser Regel ist, dass das entsprechende
Verzeichnis selber oder das Distfile in diesem Verzeichnis
nicht existiert. In solchen Fällen ist die Benutzung
der Id des Autors als <makevar>MASTER_SITE_SUBDIR</makevar>
erlaubt.</para>
<para>Jede der Einstellungen unten kann sowohl auf
<literal>YES</literal> als auch auf eine
Versionszeichenkette wie <literal>5.8.0+</literal> gesetzt
werden. Wenn <literal>YES</literal> benutzt wird, bedeutet
das, dass der Port mit jeder der unterstützten
<application>Perl</application>-Versionen funktioniert.
Falls ein Port nur mit einer bestimmten
<application>Perl</application>-Version funktioniert, kann
darauf mit einer Versionszeichenkette hingewiesen werden,
die entweder eine Mindest- (z.B. <literal>5.7.3+</literal>),
Maximal- (z.B. <literal>5.8.0-</literal>) oder
Absolutversion (z.B. <literal>5.8.3</literal>)
festlegt.</para>
<table frame="none">
<title>Variablen für Ports, die <literal>perl</literal>
benutzen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_PERL5</makevar></entry>
<entry>Bedeutet, dass der Port <literal>perl 5</literal>
zum Erstellen und zum Ausführen benutzt.</entry>
</row>
<row>
<entry><makevar>USE_PERL5_BUILD</makevar></entry>
<entry>Bedeutet, dass der Port <literal>perl 5</literal>
zum Erstellen benutzt.</entry>
</row>
<row>
<entry><makevar>USE_PERL5_RUN</makevar></entry>
<entry>Bedeutet, dass der Port <literal>perl 5</literal>
zur Laufzeit benutzt.</entry>
</row>
<row>
<entry><makevar>PERL</makevar></entry>
<entry>Der gesamte Pfad zu
<literal>perl 5</literal>&nbsp;&ndash;&nbsp;entweder
im Basissystem oder nachinstalliert über einen
Port&nbsp;&ndash;&nbsp;ohne die Versionsnummer. Benutzen
Sie diese Variable, wenn Sie <quote>
<literal>#!</literal></quote>-Zeilen in Skripten
ersetzen müssen.</entry>
</row>
<row>
<entry><makevar>PERL_CONFIGURE</makevar></entry>
<entry>Perls MakeMaker für die Konfiguration
benutzen. Dies impliziert
<makevar>USE_PERL5</makevar>.</entry>
</row>
<row>
<entry><makevar>PERL_MODBUILD</makevar></entry>
<entry>Module::Build für configure, build und install
benutzen. Dies impliziert
<makevar>PERL_CONFIGURE</makevar>.</entry>
</row>
</tbody>
</tgroup>
<tgroup cols="2">
<thead>
<row>
<entry>Nur lesbare Variablen</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>PERL_VERSION</makevar></entry>
<entry>Die volle Version des installierten
<literal>perl</literal> (z.B.
<literal>5.8.9</literal>).</entry>
</row>
<row>
<entry><makevar>PERL_LEVEL</makevar></entry>
<entry>Die installierte <literal>perl</literal>-Version
als ein Integer der Form <literal>MNNNPP</literal>
(z.B. <literal>500809</literal>).</entry>
</row>
<row>
<entry><makevar>PERL_ARCH</makevar></entry>
<entry>Wo <literal>perl</literal> architektur
abhängige Bibliotheken ablegt. Vorgabe ist
<literal>${ARCH}-freebsd</literal>.</entry>
</row>
<row>
<entry><makevar>PERL_PORT</makevar></entry>
<entry>Name des <literal>perl</literal>-Ports, der
installiert ist (z.B. <literal>perl5</literal>).</entry>
</row>
<row>
<entry><makevar>SITE_PERL</makevar></entry>
<entry>Verzeichnis, in das die Site-spezifischen
<literal>perl</literal>-Pakete kommen. Dieser Wert
wird zu PLIST_SUB hinzugefügt.</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>Ports von Perl-Modulen, die keine offizielle
Webseite haben, sollen in der WWW-Zeile ihrer
<filename>pkg-descr</filename>-Datei auf
<hostid>cpan.org</hostid> verlinken.
Die bevorzugte URL-Form ist <literal>
http://search.cpan.org/dist/Module-Name/</literal>
(inklusive des Slash am Ende).</para>
</note>
</sect1>
<sect1 id="using-x11">
<title>Benutzung von X11</title>
<sect2 id="x11-variables">
<title>X.Org-Komponenten</title>
<para>Die X11-Implementierung, welche die Ports-Sammlung
bereitstellt, ist X.Org. Wenn Ihre Applikation von
X-Komponenten abhängt, listen Sie die benötigten
Komponenten in <makevar>USE_XORG</makevar> auf. Als dies
geschrieben wurde, wurden die folgenden Komponenten
bereitgestellt:</para>
<para><literal>bigreqsproto compositeproto damageproto dmx
dmxproto evieproto fixesproto fontcacheproto fontenc
fontsproto fontutil glproto ice inputproto kbproto libfs
oldx printproto randrproto recordproto renderproto
resourceproto scrnsaverproto sm trapproto videoproto x11
xau xaw xaw6 xaw7 xaw8 xbitmaps xcmiscproto xcomposite
xcursor xdamage xdmcp xevie xext xextproto
xf86bigfontproto xf86dgaproto xf86driproto xf86miscproto
xf86rushproto xf86vidmodeproto xfixes xfont xfontcache xft
xi xinerama xineramaproto xkbfile xkbui xmu xmuu
xorg-server xp xpm xprintapputil xprintutil xpr oto
xproxymngproto xrandr xrender xres xscrnsaver xt xtrans
xtrap xtst xv xvmc xxf86dga xxf86misc
xxf86vm</literal>.</para>
<para>Die aktuelle Liste finden Sie immer in
<filename>/usr/ports/Mk/bsd.xorg.mk</filename>.</para>
<para>Das Mesa Projekt ist ein Versuch, eine freie OpenGL
Implementierung bereitzustellen. Sie können eine
Abhängigkeit von verschiedenen Komponenten diese
Projektes in der Variable <makevar>USE_GL</makevar>
spezifizieren. ouml;gliche Optionen sind: <literal>glut,
glu, glw, glew, gl</literal> und <literal>linux</literal>.
Für Abwärtskompatibilität gilt der
Wert <literal>yes</literal> als
<literal>glu</literal>.</para>
<example id="use-xorg-example">
<title>Beispiel für USE_XORG</title>
<programlisting>USE_XORG= xrender xft xkbfile xt xaw
USE_GL= glu</programlisting>
</example>
<para>Viele Ports definieren <makevar>USE_XLIB</makevar>,
was dafür sorgt, dass der Port von allen (rund 50)
Bibliotheken abhängt. Diese Variable existiert, um
Abwärtskompatibilität sicherzustellen (sie
stammt noch aus der Zeit vor dem modularem X.Org), und
sollte bei neuen Ports nicht mehr benutzt werden.</para>
<table frame="none">
<title>Variablen für Ports, die X benutzen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_XLIB</makevar></entry>
<entry>Der Port benutzt die X-Bibliotheken. Soll
nicht mehr verwendet werden - benutzen Sie
stattdessen eine Liste von Komponenten in
<makevar>USE_XORG</makevar>.</entry>
</row>
<row>
<entry><makevar>USE_X_PREFIX</makevar></entry>
<entry>Soll nicht mehr benutzt werden, ist jetzt
äquivalent zu <makevar>USE_XLIB</makevar> und
kann einfach durch letzteres ersetzt
werden.</entry>
</row>
<row>
<entry><makevar>USE_IMAKE</makevar></entry>
<entry>Der Port benutzt <command>imake</command>.
Impliziert <makevar>USE_X_PREFIX</makevar>.</entry>
</row>
<row>
<entry><makevar>XMKMF</makevar></entry>
<entry>Ist auf den Pfad zu <command>xmkmf</command>
gesetzt, wenn nicht in <envar>PATH</envar>. Vorgabe
ist <literal>xmkmf -a</literal>.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none">
<title>Variablen bei Abhängigkeit von einzelnen
Teilen von X11</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>X_IMAKE_PORT</makevar></entry>
<entry>Ein Port, der <command>imake</command> und einige
andere Werkzeuge, die zum Erstellen von X11 benutzt
werden, bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_LIBRARIES_PORT</makevar></entry>
<entry>Ein Port, der die X11-Bibliotheken
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_CLIENTS_PORT</makevar></entry>
<entry>Ein Port, der X11-Clients bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_SERVER_PORT</makevar></entry>
<entry>Ein Port, der den X11-Server bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTSERVER_PORT</makevar></entry>
<entry>Ein Port, der den Fontserver bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_PRINTSERVER_PORT</makevar></entry>
<entry>Ein Port, der den Printserver bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_VFBSERVER_PORT</makevar></entry>
<entry>Ein Port, der den virtuellen Framebuffer-Server
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_NESTSERVER_PORT</makevar></entry>
<entry>Ein Port, der einen nested X-Server
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_ENCODINGS_PORT</makevar></entry>
<entry>Ein Port, der Kodierungen für Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_MISC_PORT</makevar></entry>
<entry>Ein Port, der verschiedene Bitmap-Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_100DPI_PORT</makevar></entry>
<entry>Ein Port, der 100dpi Bitmap-Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_75DPI_PORT</makevar></entry>
<entry>Ein Port, der 75dpi Bitmap-Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_CYRILLIC_PORT</makevar></entry>
<entry>Ein Port, der kyrillische Bitmap-Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_TTF_PORT</makevar></entry>
<entry>Ein Port, der &truetype;-Schriftarten
bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_FONTS_TYPE1_PORT</makevar></entry>
<entry>Ein Port, der Type1-Schriftarten bereitstellt.</entry>
</row>
<row>
<entry><makevar>X_MANUALS_PORT</makevar></entry>
<entry>Ein Port, der entwicklerorientierte Manualpages
bereitstellt.</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="using-x11-vars">
<title>Benutzung von X11-bezogenen Variablen in einem
Port</title>
<programlisting># Port benutzt X11-Bibliotheken und hängt vom Font-Server sowie
# von kyrillischen Schriftarten ab.
RUN_DEPENDS= ${LOCALBASE}/bin/xfs:${X_FONTSERVER_PORT} \
${LOCALBASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_PORT}
USE_XORG= x11 xpm</programlisting>
</example>
</sect2>
<sect2 id="x11-motif">
<title>Ports, die Motif benötigen</title>
<para>Wenn Ihr Port eine Motif-Bibliothek benötigt,
definieren Sie <makevar>USE_MOTIF</makevar> im
<filename>Makefile</filename>.
Die Standard-Motif-Implementierung ist <filename
role="package">x11-toolkits/open-motif</filename>.
Benutzer können stattdessen <filename
role="package">x11-toolkits/lesstif</filename> wählen,
indem Sie die <makevar>WANT_LESSTIF</makevar>-Variable
setzen.</para>
<para>Die Variable <makevar>MOTIFLIB</makevar> wird von
<filename>bsd.port.mk</filename> auf die entsprechende
Motif-Bibliothek gesetzt. Bitte patchen Sie den Quelltext
Ihres Ports, sodass er überall
<literal>&dollar;{MOTIFLIB}</literal> benutzt, wo die
Motif-Bibliothek im Original <filename>Makefile</filename>
oder <filename>Imakefile</filename> referenziert
wird.</para>
<para>Es gibt zwei verbreitete Fälle:</para>
<itemizedlist>
<listitem>
<para>Wenn sich der Port in seinem
<filename>Makefile</filename> oder
<filename>Imakefile</filename> auf die
Motif-Bibliothek als <literal>-lXm</literal> bezieht,
ersetzen Sie das einfach durch
<literal>&dollar;{MOTIFLIB}</literal>.</para>
</listitem>
<listitem>
<para>Wenn der Port in seinem
<filename>Imakefile</filename>
<literal>XmClientLibs</literal> benutzt, ersetzen Sie
das durch <literal>&dollar;{MOTIFLIB}
&dollar;{XTOOLLIB} &dollar;{XLIB}</literal>.</para>
</listitem>
</itemizedlist>
<para>Anmerkung: <makevar>MOTIFLIB</makevar> expandiert
(normalerweise) zu <literal>-L/usr/X11R6/lib
-lXm</literal> oder <literal>/usr/X11R6/lib/libXm.a
</literal> - d.h. Sie müssen kein
<literal>-L</literal> oder <literal>-l</literal> davor
einfügen.</para>
</sect2>
<sect2>
<title>X11 Schriftarten</title>
<para>Wenn Ihr Port Schriftarten für das
X-Window-System installiert, legen Sie diese nach
<filename>
<makevar>LOCALBASE</makevar>/lib/X11/fonts/local</filename>.</para>
</sect2>
<sect2>
<title>Erzeugen eines künstlichen
<envar>DISPLAY</envar> durch Xvfb</title>
<para>Manche Applikationen benötigen ein
funktionierendes X11-Display, damit die Kompilierung
funktioniert. Das stellt für Systeme, die ohne
Display laufen, ein Problem dar. Wenn die folgende
Variable benutzt wird, startet die Bauumgebung den
virtuellen Framebuffer-X-Server, und ein funktionierendes
<envar>DISPLAY</envar> wird dem Build
übergeben.</para>
<programlisting>USE_DISPLAY= yes</programlisting>
</sect2>
<sect2 id="desktop-entries">
<title>Desktop-Einträge</title>
<para>Desktop-Einträge (<ulink
url="http://standards.freedesktop.org/desktop-entry-spec/latest/">Freedesktop
Standard</ulink>) können in Ihrem Port einfach
über die <makevar>DESKTOP_ENTRIES</makevar>-Variable
erzeugt werden. Diese Einträge erscheinen dann im
Applikationsmenü von standardkonformen
Desktop-Umgebungen wie GNOME oder KDE. Die
<filename>.desktop</filename>-Datei wird dann
automatisch erzeugt, installiert und der
<filename>pkg-plist</filename> hinzugefügt.
Die Syntax ist:</para>
<programlisting>DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify</programlisting>
<para>Die Liste der möglichen Kategorien ist auf der
<ulink
url="http://standards.freedesktop.org/menu-spec/latest/apa.html">Freedesktop
Webseite</ulink> abrufbar.
<makevar>StartupNotify</makevar> zeigt an, ob die
Applikation den Status in Umgebungen, die
Startup-Notifications kennen, löschen wird.</para>
<para>Beispiel:</para>
<programlisting>DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
"${DATADIR}/xtra/graf/tome-128.png" \
"tome -v -g" "Application;Game;RolePlaying;" \
false</programlisting>
</sect2>
</sect1>
<sect1 id="using-gnome">
<title>Benutzung von GNOME</title>
<para>Das FreeBSD/GNOME-Projekt benutzt seine eigene
Gruppe von Variablen, um zu definieren, welche
GNOME-Komponenten ein bestimmter Port benutzt. Eine
<ulink url="http://www.FreeBSD.org/gnome/docs/porting.html">
umfassende Liste dieser Variablen</ulink> existiert innerhalb
der Webseite des FreeBSD/GNOME-Projektes.</para>
</sect1>
<sect1 id="using-qt">
<title>Benutzung von Qt</title>
<sect2 id="qt-common">
<title>Ports, die Qt benötigen</title>
<table frame="none">
<title>Variablen für Ports, die Qt
benötigen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_QT_VER</makevar></entry>
<entry>Der Port benutzt das Qt-Toolkit. Mögliche
Werte sind <literal>3</literal> und
<literal>4</literal>; diese spezifizieren die Major
Version von Qt, die benutzt werden soll.
Entsprechende Parameter werden an das
<command>configure</command>-Skript und
<command>make</command> übergeben.</entry>
</row>
<row>
<entry><makevar>QT_PREFIX</makevar></entry>
<entry>Enthält den Pfad, wohin Qt installiert ist
(nur lesbare Variable).</entry>
</row>
<row>
<entry><makevar>MOC</makevar></entry>
<entry>Enthält den Pfad von <command>moc</command>
(nur lesbare Variable). Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Werts.</entry>
</row>
<row>
<entry><makevar>QTCPPFLAGS</makevar></entry>
<entry>Zusätzliche Compiler-Flags, die über
<makevar>CONFIGURE_ENV</makevar> an das Qt-Toolkit
übergeben werden. Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Wertes.</entry>
</row>
<row>
<entry><makevar>QTCFGLIBS</makevar></entry>
<entry>Zusätzliche Bibliotheken, die über
<makevar>CONFIGURE_ENV</makevar> für das Qt-Toolkit
gelinkt werden sollen. Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Wertes.</entry>
</row>
<row>
<entry><makevar>QTNONSTANDARD</makevar></entry>
<entry>Änderungen von
<makevar>CONFIGURE_ENV</makevar>,
<makevar>CONFIGURE_ARGS</makevar> und
<makevar>MAKE_ENV</makevar> sollen unterdrückt
werden.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none">
<title>Zusätzliche Variablen für Ports,
die Qt 4.xi benutzen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>QT_COMPONENTS</makevar></entry>
<entry>Spezifiziert Tool&ndash;&nbsp;und
Bibliothek-Abhängigkeiten für Qt4.
Siehe unten für Details.</entry>
</row>
<row>
<entry><makevar>UIC</makevar></entry>
<entry>Enthält den Pfad von <command>uic</command>
(nur lesbare Variable). Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Wertes.</entry>
</row>
<row>
<entry><makevar>QMAKE</makevar></entry>
<entry>Enthält den Pfad von <command>qmake</command>
(nur lesbare Variable). Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Wertes.</entry>
</row>
<row>
<entry><makevar>QMAKESPEC</makevar></entry>
<entry>Enthält den Pfad der Konfigurationsdatei
für <command>qmake</command>
(nur lesbare Variable). Voreingestellt entsprechend des
<makevar>USE_QT_VER</makevar>-Wertes.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Wenn <makevar>USE_QT_VER</makevar> gesetzt ist,
werden dem <command>configure</command>-Skript einige
nützliche Einstellungen übergeben:</para>
<programlisting>CONFIGURE_ARGS+= --with-qt-includes=${QT_PREFIX}/include \
--with-qt-libraries=${QT_PREFIX}/lib \
--with-extra-libs=${LOCALBASE}/lib \
--with-extra-includes=${LOCALBASE}/include
CONFIGURE_ENV+= MOC="${MOC}" CPPFLAGS="${CPPFLAGS} ${QTCPPFLAGS}" LIBS="${QTCFGLIBS}" \
QTDIR="${QT_PREFIX}" KDEDIR="${KDE_PREFIX}"</programlisting>
<para>Wenn <makevar>USE_QT_VER</makevar> auf
<literal>4</literal> gesetzt ist, werden auch die folgenden
Einstellungen übergeben:</para>
<programlisting>CONFIGURE_ENV+= UIC="${UIC}" QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}"
MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
</sect2>
<sect2 id="qt4-components">
<title>Komponentenauswahl (nur bei Qt 4.x)</title>
<para>Wenn <makevar>USE_QT_VER</makevar> auf 4 gesetzt ist,
können individuelle Qt4-Tool- und
Bibliotheksabhängigkeiten in der Variable
<makevar>QT_COMPONENTS</makevar> angegeben werden. An jede
Komponente kann <literal>_build</literal> oder
<literal>_run</literal> als Suffix angehängt werden,
was eine Abhängigkeit zur Build- bzw. Laufzeit angibt.
Ohne Suffix gilt die Abhängigkeit sowohl zur Build-
als auch zur Laufzeit. Bibliothekskomponenten sollten
normalerweise ohne Suffix angegeben werden,
Tool-Komponenten mit <literal>_build</literal> und
Plugin-Komponenten mit <literal>_run</literal>. Die
gebräuchlichsten Komponenten werden im Folgenden
angegeben (alle verfügbaren Komponenten sind in
<makevar>_QT_COMPONENTS_ALL</makevar> in
<filename>/usr/ports/Mk/bsd.qt.mk</filename>
aufgelistet):</para>
<table frame="none">
<title>Verfügbare Qt4-Bibliothekskomponenten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>corelib</literal></entry>
<entry>Kern-Bibliothek (kann weggelassen
werden&ndash;&nbsp;es sei denn, der Port benutzt nichts
außer <literal>corelib</literal>)</entry>
</row>
<row>
<entry><literal>gui</literal></entry>
<entry>Graphische
Benutzeroberflächen-Bibliothek</entry>
</row>
<row>
<entry><literal>network</literal></entry>
<entry>Netzwerk-Bibliothek</entry>
</row>
<row>
<entry><literal>opengl</literal></entry>
<entry>OpenGL-Bibliothek</entry>
</row>
<row>
<entry><literal>qt3support</literal></entry>
<entry>Qt3-Kompatibilitäts-Bibliothek</entry>
</row>
<row>
<entry><literal>qtestlib</literal></entry>
<entry>Modultest-Bibliothek</entry>
</row>
<row>
<entry><literal>script</literal></entry>
<entry>Skript-Bibliothek</entry>
</row>
<row>
<entry><literal>sql</literal></entry>
<entry>SQL-Bibliothek</entry>
</row>
<row>
<entry><literal>xml</literal></entry>
<entry>XML-Bibliothek</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Sie können herausfinden, welche Bibliotheken die
Applikation benötigt, indem Sie nach erfolgreicher
Kompilierung <command>ldd</command> auf die
Hauptbinärdatei anwenden.</para>
<table frame="none">
<title>Verfügbare Qt4-Tool-Komponenten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>moc</literal></entry>
<entry>meta object compiler (wird zum Build fast
jeder Qt-Applikation benötigt)</entry>
</row>
<row>
<entry><literal>qmake</literal></entry>
<entry>Makefile-Generator / Build-Werkzeug</entry>
</row>
<row>
<entry><literal>rcc</literal></entry>
<entry>Resource-Compiler (wird benötigt, falls
die Applikation <filename>*.rc</filename> oder
<filename>*.qrc</filename> Dateien
enthält)</entry>
</row>
<row>
<entry><literal>uic</literal></entry>
<entry>User-Interface-Compiler (wird benötigt,
falls die Applikation von Qt-Designer erzeugte
<filename>*.ui</filename> Dateien enthält -
gilt für praktisch jede Qt-Applikation mit
einer GUI)</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none">
<title>Verfügbare Qt4-Plugin-Komponenten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>iconengines</literal></entry>
<entry>SVG-Icon-Engine Plugin (wenn die Applikation
SVG-Icons mitliefert)</entry>
</row>
<row>
<entry><literal>imageformats</literal></entry>
<entry>Bildformatplugins für GIF, JPEG, MNG und
SVG (wenn die Applikation Bilddateien
mitliefert)</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="qt4-components-example">
<title>Qt4-Komponenten auswählen</title>
<para>In diesem Beispiel benutzt die portierte Applikation
die Qt4 GUI-Bibliothek, die Qt4-Core-Bibliothek, alle
Qt4-Codeerzeugungstools und Qt4's Makefile Generator. Da
die GUI-Bibliothek eine Abhängigkeit von der
Core-Bibliothek impliziert, muss corelib nicht angegeben
werden. Die Qt4-Codeerzeugungstools moc, uic und rcc,
sowie der Makefile Generator qmake werden nur für den
Build benötigt, deshalb bekommen die den Suffix
<literal>_build</literal>:</para>
<programlisting>USE_QT_VER= 4
QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_build</programlisting>
</example>
</sect2>
<sect2 id="qt-additional">
<title>Zusätzliche Besonderheiten</title>
<para>Wenn die Applikation keine
<filename>configure</filename> Datei, sondern eine
<filename>.pro</filename> Datei hat, können Sie das
Folgende benutzen:</para>
<programlisting>HAS_CONFIGURE= yes
do-configure:
@cd ${WRKSRC} &amp;&amp; ${SETENV} ${CONFIGURE_ENV} \
${QMAKE} -unix PREFIX=${PREFIX} texmaker.pro</programlisting>
<para>Beachten Sie die Ähnlichkeit mit der
<command>qmake</command>-Zeile im mitgelieferten
<filename>BUILD.sh</filename>-Skript. Die
Übergabe von <makevar>CONFIGURE_ENV</makevar>
stellt sicher, dass <command>qmake</command> die
<makevar>QMAKESPEC</makevar>-Variable übergeben
bekommt, ohne die es nicht funktioniert.
<command>qmake</command> erzeugt Standard-Makefiles,
sodass es nicht nötig ist ein eigenes neues
<maketarget>build</maketarget>-Target zu schreiben.</para>
<para>Qt-Applikationen sind oft so geschrieben, dass sie
plattformübergreifend sind, und oft ist X11/Unix
nicht die Plattform, auf der sie entwickelt werden.
Das sorgt oft für bestimmte fehlende
Kleinigkeiten wie z.B.:</para>
<itemizedlist>
<listitem>
<para><emphasis>Fehlende zusätzliche
Include-Pfade.</emphasis>
Viele Applikationen kommen mit System-Tray-Icon
Support&ndash;&nbsp;unterlassen es aber Includes
oder Bibliotheken in den X11 Verzeichnissen zu suchen.
Sie können <command>qmake</command> über die
Kommandozeile sagen, es soll Verzeichnisse zu den
Include- und Bibliotheks-Suchpfaden
hinzufügen - z.B.:</para>
<programlisting>${QMAKE} -unix PREFIX=${PREFIX} INCLUDEPATH+=${LOCALBASE}/include \
LIBS+=-L${LOCALBASE}/lib sillyapp.pro</programlisting>
</listitem>
<listitem>
<para><emphasis>Falsche Installations-Pfade.</emphasis>
Manchmal werden Daten wie Icons oder .desktop-Dateien
per Vorgabe in Verzeichnisse installiert, die nicht von
XDG-kompatiblen Applikationen durchsucht werden.
<filename role="package">editors/texmaker</filename>
ist hierfür ein Beispiel&ndash;&nbsp;siehe
<filename>patch-texmaker.pro</filename> im
<filename>files</filename>-Verzeichnis dieses Ports
als eine Vorlage, die zeigt, wie man dies direkt in der
Qmake Projektdatei löst.</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<sect1 id="using-kde">
<title>Benutzung von KDE</title>
<sect2 id="kde-variables">
<title>Variablen-Definitionen (KDE 3)</title>
<table frame="none">
<title>Variablen für Ports, die KDE 3 benutzen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_KDELIBS_VER</makevar></entry>
<entry>Der Port benutzt KDE-Bibliotheken. Die Variable
spezifiziert die Major Version von KDE, die benutzt
werden soll, und impliziert
<makevar>USE_QT_VER</makevar> der entsprechenden
Version. Der einzig mögliche Wert ist
<literal>3</literal>.</entry>
</row>
<row>
<entry><makevar>USE_KDEBASE_VER</makevar></entry>
<entry>Der Port benutzt die KDE-Base. Die Variable
spezifiziert die Major Version von KDE, die benutzt
werden soll, und impliziert
<makevar>USE_QT_VER</makevar> der entsprechenden
Version. Der einzig mögliche Wert ist
<literal>3</literal>.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="kde4-variables">
<title>Variablen-Definitionen (KDE 4)</title>
<para>Falls Ihre Anwendung von KDE 4 abhängt, weisen Sie
<makevar>USE_KDE4</makevar> eine Liste mit benötigten
Komponenten zu. Die am häufigsten gebrauchten sind
unten aufgelistet (<makevar>_USE_KDE4_ALL</makevar> in
<filename>/usr/ports/Mk/bsd.kde4.mk</filename> enthält
stets die aktuelle Liste):</para>
<table frame="none">
<title>Verfügbare KDE 4-Komponenten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>akonadi</literal></entry>
<entry>Personal Information Management
(PIM)-Speicherdienst</entry>
</row>
<row>
<entry><literal>automoc4</literal></entry>
<entry>Lässt den Port das Bauwerkzeug automoc4
verwenden.</entry>
</row>
<row>
<entry><literal>kdebase</literal></entry>
<entry>Grundlegende KDE-Anwendungen (Konqueror,
Dolphin, Konsole)</entry>
</row>
<row>
<entry><literal>kdeexp</literal></entry>
<entry>Experimentelle KDE-Bibliotheken (mit einer API,
die als non-stable eingestuft ist)</entry>
</row>
<row>
<entry><literal>kdehier</literal></entry>
<entry>Stellt allgemeine KDE-Verzeichnisse
bereit</entry>
</row>
<row>
<entry><literal>kdelibs</literal></entry>
<entry>Die grundlegenden KDE-Bibliotheken</entry>
</row>
<row>
<entry><literal>kdeprefix</literal></entry>
<entry>Falls in der Liste vorhanden, wird der Port
unter <literal>&dollar;{KDE4_PREFIX}</literal> statt
<literal>&dollar;{LOCALBASE}</literal>
installiert</entry>
</row>
<row>
<entry><literal>pimlibs</literal></entry>
<entry>PIM-Bibliotheken</entry>
</row>
<row>
<entry><literal>workspace</literal></entry>
<entry>Anwendungen und Bibliotheken, welche die
Desktopumgebung gestalten (Plasma, KWin)</entry>
</row>
</tbody>
</tgroup>
</table>
<para>KDE 4-Ports werden unter
<literal>&dollar;{KDE4_PREFIX}</literal>, zur Zeit
<filename>/usr/local/kde4</filename>, installiert, um
Konflikte mit KDE 3-Ports zu verhindern. Dies wird durch
Auflisten der Komponente <literal>kdeprefix</literal>
erreicht, welche die standardmäßig gesetzte
Variable <makevar>PREFIX</makevar> überschreibt. Die
Ports übernehmen jedoch, jeden über die
Umgebungsvariable <envar>MAKEFLAGS</envar> oder
<application>make</application>-Parameter festgelegten Wert
für <makevar>PREFIX</makevar>.</para>
<para>Es könnte bei der Installation von KDE 4-Ports zu
Konflikten mit KDE 3-Ports kommen, sodass diese bei
aktivierter <literal>kdeprefix</literal>-Komponente unter
<literal>&dollar;{KDE4_PREFIX}</literal> installiert werden.
Der Standardwert von <literal>KDE4_PREFIX</literal> ist zur
Zeit <filename>/usr/local/kde4</filename>. Es ist auch
möglich, KDE 4-Ports unter einem angepassten
<literal>PREFIX</literal> zu installieren. Wenn
<literal>PREFIX</literal> als
<envar>MAKEFLAGS</envar>-Umgebungsvariable oder als
<application>make</application>-Parameter gesetzt wird,
überschreibt dies den von <literal>kdeprefix</literal>
festgelegten Wert.</para>
<example id="kde4-components-example">
<title><makevar>USE_KDE4</makevar>-Beispiel</title>
<para>Dies ist ein einfaches Beispiel für einen KDE
4-Port. <makevar>USE_CMAKE</makevar> weist den Port an,
<application>CMake</application>, ein unter KDE
4-Projekten weit verbreitetes Konfigurationswerkzeug, zu
verwenden. <makevar>USE_KDE4</makevar> legt die
Abhängigkeit von KDE-Bibliotheken und die Verwendung
von <application>automoc4</application> während der
Kompilierung fest. Mit Hilfe des configure-Protokolls
können die KDE-Komponenten und andere
Abhängigkeiten festgestellt werden.
<makevar>USE_KDE4</makevar> impliziert
<makevar>USE_QT_VER</makevar> nicht. Falls der Port Qt
4-Komponenten benötigt, sollten
<makevar>USE_QT_VER</makevar> gesetzt und verlangte
Komponenten festgelegt werden.</para>
<programlisting>USE_CMAKE= yes
USE_KDE4= automoc4 kdelibs kdeprefix
USE_QT_VER= 4
QT_COMPONENTS= qmake_build moc_build rcc_build uic_build</programlisting>
</example>
</sect2>
</sect1>
<sect1 id="using-java">
<title>Benutzung von Java</title>
<sect2 id="java-variables">
<title>Variablen-Definitionen</title>
<para>Wenn Ihr Port ein Java&trade; Development Kit (JDK&trade;)
benötigt, entweder zum Bauen, zur Laufzeit oder
sogar, um das Distfile auszupacken, dann sollten Sie
<makevar>USE_JAVA</makevar> setzen.</para>
<para>Es gibt mehrere JDKs in der
Ports-Sammlung&ndash;&nbsp;von verschiedenen Anbietern
und in verschiedenen Versionen.
Wenn Ihr Port eine bestimmte dieser Versionen
benötigt, können Sie definieren welche.
Die aktuelle Version ist <filename
role="package">java/jdk16</filename>.</para>
<table frame="none">
<title>Variablen, die von Ports, die Java benutzen, gesetzt
werden müssen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_JAVA</makevar></entry>
<entry>Sollte definiert sein, damit die übrigen
Variablen irgendeinen Effekt haben.</entry>
</row>
<row>
<entry><makevar>JAVA_VERSION</makevar></entry>
<entry>Durch Leerzeichen getrennte Liste von geeigneten
Java-Versionen für den Port. Ein optionales
<literal>"+"</literal> ermöglicht die Angabe eines
Bereiches von Versionen (mögliche Werte:
<literal>1.5[+] 1.6[+] 1.7[+]</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_OS</makevar></entry>
<entry>Durch Leerzeichen getrennte Liste von geeigneten
JDK-Port-Betriebssystemen für den Port. (erlaubte
Werte: <literal>native linux</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_VENDOR</makevar></entry>
<entry>Durch Leerzeichen getrennte Liste von geeigneten
JDK-Port-Anbietern für den Port. (erlaubte Werte:
<literal>freebsd bsdjava sun openjdk</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_BUILD</makevar></entry>
<entry>Bedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Build-Abhängigkeiten des Ports
hinzugefügt werden soll.</entry>
</row>
<row>
<entry><makevar>JAVA_RUN</makevar></entry>
<entry>Bedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Laufzeit-Abhängigkeiten des Ports
hinzugefügt werden soll.</entry>
</row>
<row>
<entry><makevar>JAVA_EXTRACT</makevar></entry>
<entry>Bedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Extract-Abhängigkeiten des Ports
hinzugefügt werden soll.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Das Folgende ist eine Liste aller Variablen, die ein
Port bekommt, nachdem er <makevar>USE_JAVA</makevar>
gesetzt hat:</para>
<table frame="none">
<title>Bereitgestellte Variablen für Ports,
die Java benutzen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Wert</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>JAVA_PORT</makevar></entry>
<entry>Der Name des JDK-Ports (z.B.
<literal>'java/diablo-jdk16'</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_PORT_VERSION</makevar></entry>
<entry>Die volle Version des JDK Ports (z.B.
<literal>'1.6.0'</literal>). Wenn Sie nur die ersten
beiden Stellen dieser Versionsnummer benötigen,
benutzen Sie <makevar>
${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}</makevar>.</entry>
</row>
<row>
<entry><makevar>JAVA_PORT_OS</makevar></entry>
<entry>Das vom JDK-Port benutzte Betriebssystem (z.B.
<literal>'native'</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_PORT_VENDOR</makevar></entry>
<entry>Der Anbieter des JDK-Ports (z.B.
<literal>'freebsd'</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_PORT_OS_DESCRIPTION</makevar></entry>
<entry>Beschreibung des vom JDK-Port benutzten
Betriebssystems (z.B.
<literal>'Native'</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_PORT_VENDOR_DESCRIPTION</makevar></entry>
<entry>Beschreibung des Anbieters des JDK-Ports (z.B.
<literal>'FreeBSD Foundation'</literal>).</entry>
</row>
<row>
<entry><makevar>JAVA_HOME</makevar></entry>
<entry>Pfad zum Installationsverzeichnis des JDK (z.B.
<filename>'/usr/local/diablo-jdk1.6.0'</filename>).</entry>
</row>
<row>
<entry><makevar>JAVAC</makevar></entry>
<entry>Pfad zum Java-Compiler, der benutzt werden soll
(z.B. <filename>'/usr/local/diablo-jdk1.6.0/bin/javac'</filename>.</entry>
</row>
<row>
<entry><makevar>JAR</makevar></entry>
<entry>Pfad zum <command>jar</command>-Werkzeug, das
benutzt werden soll
(z.B.'<filename>'/usr/local/diablo-jdk1.6.0/bin/jar</filename> oder
<filename>'/usr/local/bin/fastjar'</filename>).</entry>
</row>
<row>
<entry><makevar>APPLETVIEWER</makevar></entry>
<entry>Pfad zum <command>appletviewer</command>-Werkzeug
(z.B. <filename>'/usr/local/diablo-jdk1.6.0/bin/appletviewer'</filename>).</entry>
</row>
<row>
<entry><makevar>JAVA</makevar></entry>
<entry>Pfad zur <command>java</command> Binärdatei.
Benutzen Sie dies, um Java-Programme auszuführen
(z.B.<filename>'/usr/local/diablo-jdk1.6.0/bin/java'</filename>).</entry>
</row>
<row>
<entry><makevar>JAVADOC</makevar></entry>
<entry>Pfad zum
<command>javadoc</command>-Werkzeug.</entry>
</row>
<row>
<entry><makevar>JAVAH</makevar></entry>
<entry>Pfad zum <command>javah</command>-Programm.</entry>
</row>
<row>
<entry><makevar>JAVAP</makevar></entry>
<entry>Pfad zum <command>javap</command>-Programm.</entry>
</row>
<row>
<entry><makevar>JAVA_KEYTOOL</makevar></entry>
<entry>Pfad zum <command>keytool</command>-Werkzeug.</entry>
</row>
<row>
<entry><makevar>JAVA_N2A</makevar></entry>
<entry>Pfad zum
<command>native2ascii</command>-Werkzeug.</entry>
</row>
<row>
<entry><makevar>JAVA_POLICYTOOL</makevar></entry>
<entry>Pfad zum <command>policytool</command> Programm.</entry>
</row>
<row>
<entry><makevar>JAVA_SERIALVER</makevar></entry>
<entry>Pfad zum
<command>serialver</command>-Werkzeug.</entry>
</row>
<row>
<entry><makevar>RMIC</makevar></entry>
<entry>Pfad zum RMI Stub/Skeleton-Generator,
<command>rmic</command>.</entry>
</row>
<row>
<entry><makevar>RMIREGISTRY</makevar></entry>
<entry>Pfad zum RMI Registry-Werkzeug,
<command>rmiregistry</command>.</entry>
</row>
<row>
<entry><makevar>RMID</makevar></entry>
<entry>Pfad zum RMI Daemon <command>rmid</command>.</entry>
</row>
<row>
<entry><makevar>JAVA_CLASSES</makevar></entry>
<entry>Pfad zum Archiv, das die JDK-Klassendateien
enthält, <filename>${JAVA_HOME}/jre/lib/rt.jar</filename>.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Sie können das <literal>java-debug</literal>
make-Target benutzen, um Information zum Debuggen
Ihres Ports zu erhalten. Es wird die Werte vieler
der obenangegebenen Variablen anzeigen.</para>
<para>Zusätzlich sind die folgenden Konstanten
definiert, damit alle Java-Ports auf eine konsistente
Art installiert werden können:</para>
<table frame="none">
<title>Konstanten, die für Ports, welche Java benutzen,
definiert sind</title>
<tgroup cols="2">
<thead>
<row>
<entry>Konstante</entry>
<entry>Wert</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>JAVASHAREDIR</makevar></entry>
<entry>Das Basis-Verzeichnis für alles, was mit Java
zusammenhängt. Standardmäßig
<filename>${PREFIX}/share/java</filename>.</entry>
</row>
<row>
<entry><makevar>JAVAJARDIR</makevar></entry>
<entry>Das Verzeichnis, wohin JAR-Dateien installiert
werden sollen. Standardmäßig
<filename>${JAVASHAREDIR}/classes</filename>.</entry>
</row>
<row>
<entry><makevar>JAVALIBDIR</makevar></entry>
<entry>Das Verzeichnis, in dem JAR-Dateien, die von
anderen Ports installiert wurden, liegen.
Standardmäßig <filename>
${LOCALBASE}/share/java/classes</filename>.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Die entsprechenden Einträge sind sowohl in
<makevar>PLIST_SUB</makevar> (dokumentiert in
<xref linkend="plist-sub"/>) als auch in
<makevar>SUB_LIST</makevar> definiert.</para>
</sect2>
<sect2 id="java-building-with-ant">
<title>Kompilieren mit Ant</title>
<para>Wenn der Port mit Apache Ant kompiliert werden soll,
muss er <makevar>USE_ANT</makevar> setzen. Ant wird dann
als das sub-make-Kommando betrachtet. Wenn kein
<literal>do-build</literal>-Target vom Port definiert ist,
wird eine Standardvorgabe benutzt, die einfach Ant
entsprechend <makevar>MAKE_ENV</makevar>,
<makevar>MAKE_ARGS</makevar> und
<makevar>ALL_TARGET</makevar> aufruft. Das ähnelt dem
<makevar>USE_GMAKE</makevar>-Mechanismus, der in <xref
linkend="building"/> dokumentiert ist.</para>
</sect2>
<sect2 id="java-best-practices">
<title>Optimales Verfahren</title>
<para>Wenn Sie eine Java-Bibliothek portieren, sollte Ihr Port
die JAR-Datei(en) in <filename>${JAVAJARDIR}</filename>
installieren, und alles andere unter
<filename>${JAVASHAREDIR}/${PORTNAME}</filename>
(ausgenommen die Dokumentation - siehe unten). Um die
Größe der Packlistendatei zu reduzieren,
können die JAR-Datei(en) direkt im
<filename>Makefile</filename> angegeben werden. Benutzen
Sie einfach die folgende Anweisung (wobei
<filename>myport.jar</filename> der Name der JAR-Datei ist,
die als Teil des Ports installiert wird):</para>
<programlisting>PLIST_FILES+= %%JAVAJARDIR%%/myport.jar</programlisting>
<para>Beim Portieren einer Java-Applikation installiert der
Port normalerweise alles unter einem einzigen Verzeichnis
(inklusive seiner JAR-Abhängigkeiten). Die Benutzung
von <filename>${JAVASHAREDIR}/${PORTNAME}</filename>
wird in dieser Beziehung dringend empfohlen. Es liegt
im Entscheidungsbereich des Portierenden, ob der Port
die zusätzlichen JAR-Abhängigkeiten unter
diesem Verzeichnis installieren oder direkt die schon
installierten (aus <filename>${JAVAJARDIR}</filename>)
benutzen soll.</para>
<para>Unabhängig von der Art Ihres Ports (Bibliothek
oder Applikation), sollte die zusätzliche Dokumentation
an die <link
linkend="install-documentation">gleiche Stelle</link>
installiert werden wie bei jedem anderen Port auch.
Das JavaDoc-Werkzeug ist dafür bekannt einen
unterschiedlichen Satz von Dateien abhängig von der
Version des benutzten JDKs zu erstellen. Für Ports,
die nicht die Benutzung eines bestimmten JDKs vorgeben,
ist es deshalb eine komplexe Aufgabe die Packliste
(<filename>pkg-plist</filename>) festzulegen. Dies ist
ein Grund, warum dringend angeraten wird, das
<makevar>PORTDOCS</makevar>-Makro zu benutzen.
Außerdem, selbst wenn Sie den Satz von Dateien,
den <command>javadoc</command> erzeugen wird,
voraussagen können, die Größe der
resultierenden <filename>pkg-plist</filename>
befürwortet die Benutzung von
<makevar>PORTDOCS</makevar>.</para>
<para>Der Vorgabewert für <makevar>DATADIR</makevar> ist
<filename>${PREFIX}/share/${PORTNAME}</filename>. Es ist
eine gute Idee, <makevar>DATADIR</makevar> für
Java-Ports stattdessen auf
<filename>${JAVASHAREDIR}/${PORTNAME}</filename> zu setzen.
In der Tat wird <makevar>DATADIR</makevar> automatisch zu
<makevar>PLIST_SUB</makevar> (dokumentiert in <xref
linkend="plist-sub"/>) hinzugefügt, d.h. Sie können
<literal>%%DATADIR%%</literal> direkt in
<filename>pkg-plist</filename> benutzen.</para>
<para>Zu der Frage, ob Java-Ports aus dem Quelltext gebaut
werden, oder direkt bereitgestellte binäre
Distributionen benutzt werden sollten, gab es, als dies
geschrieben wurde, keine definierte Richtlinie. Allerdings
ermutigen Mitglieder des <ulink
url="http://www.freebsd.org/java/">&os;
Java-Projekts</ulink> Porter dazu, Ihre Ports aus dem
Quelltext kompilieren zu lassen, wann immer dies kein
Problem darstellt.</para>
<para>Alle Eigenschaften, die in diesem Abschnitt
präsentiert wurden sind in
<filename>bsd.java.mk</filename> implementiert.
Sollten Sie jemals der Meinung sein, dass Ihr Port
ausgefeiltere Java-Unterstützung benötigt,
schauen Sie bitte erst in das <ulink
url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.java.mk">
bsd.java.mk CVS Log</ulink>, weil es normalerweise immer
etwas Zeit braucht bis die neuesten Eigenschaften
dokumentiert sind. Wenn Sie glauben, dass der fehlende
Support auch für viele andere Java Ports nützlich
sein könnte, wenden Sie sich bitte an die
&a.java;.</para>
<para>Obwohl es eine <literal>java</literal>-Kategorie
für Fehlerberichte gibt, bezieht sich diese auf die
JDK-Portierungsbemühungen des &os; Java-Projektes.
Deshalb sollten Sie Ihren Java-Port in der
<literal>ports</literal>-Kategorie einreichen wie bei
jeden anderen Port auch - es sei denn, die Angelegenheit,
die Sie zu klären versuchen, steht in Zusammenhang
entweder mit einer JDK-Implementierung oder
<filename>bsd.java.mk</filename>.</para>
<para>Gleichermaßen gibt es eine definierte Richtlinie
für die <makevar>CATEGORIES</makevar> eines Java-Ports,
die in <xref linkend="makefile-categories"/> erklärt
wird.</para>
</sect2>
</sect1>
<sect1 id="using-php">
<title>Webanwendungen, Apache und PHP</title>
<sect2 id="using-apache">
<title>Apache</title>
<table frame="none">
<title>Variablen für Ports, die Apache
verwenden</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_APACHE</makevar></entry>
<entry>Der Port benötigt Apache. Mögliche Werte:
<literal>yes</literal> (beliebige Version),
<literal>1.3</literal>, <literal>2.0</literal>,
<literal>2.2</literal>, <literal>2.0+</literal>,
etc.&nbsp;&ndash;&nbsp;Standard ist Version
<literal>1.3</literal>.</entry>
</row>
<row>
<entry><makevar>WITH_APACHE2</makevar></entry>
<entry>Der Port benötigt Apache 2.0. Ist diese
Variable nicht gesetzt, so benötigt der Port
Apache 1.3. Diese Variable ist veraltet und sollte
nicht mehr verwendet werden.</entry>
</row>
<row>
<entry><makevar>APXS</makevar></entry>
<entry>Vollständiger Pfad zu der
<command>apxs</command> Binärdatei. Die Variable
kann neu gesetzt werden.</entry>
</row>
<row>
<entry><makevar>HTTPD</makevar></entry>
<entry>Vollständiger Pfad zu der
<command>httpd</command> Binärdatei.
Die Variable kann neu gesetzt werden.</entry>
</row>
<row>
<entry><makevar>APACHE_VERSION</makevar></entry>
<entry>Beinhaltet die Versionsnummer des aktuell
installierten Apache (nur lesbare Variable).
Diese Variable ist nach Einbinden der Datei
<filename>bsd.port.pre.mk</filename>
verfügbar. Mögliche Werte:
<literal>13</literal>, <literal>20</literal>,
<literal>22</literal>.</entry>
</row>
<row>
<entry><makevar>APACHEMODDIR</makevar></entry>
<entry>Verzeichnis der Apache-Module. Diese Variable wird
automatisch in pkg-plist ersetzt.</entry>
</row>
<row>
<entry><makevar>APACHEINCLUDEDIR</makevar></entry>
<entry>Verzeichnis der Apache Header-Dateien. Diese
Variable wird automatisch in pkg-plist ersetzt.</entry>
</row>
<row>
<entry><makevar>APACHEETCDIR</makevar></entry>
<entry> Verzeichnis der Apache-Konfigurationsdateien.
Diese Variable wird automatisch in pkg-plist
ersetzt.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none">
<title>Nützliche Variablen für Ports von
Apache-Modulen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>MODULENAME</makevar></entry>
<entry>Name des Moduls. Standardwert ist
<makevar>PORTNAME</makevar>. Beispiel:
<literal>mod_hello</literal></entry>
</row>
<row>
<entry><makevar>SHORTMODNAME</makevar></entry>
<entry>Der gekürzte Name des Moduls.
Standardmäßig
wird der Wert von <makevar>MODULENAME</makevar>
übernommen.
Beispiel: <literal>hello</literal></entry>
</row>
<row>
<entry><makevar>AP_FAST_BUILD</makevar></entry>
<entry>Verwende <command>apxs</command> zum Kompilieren
und Installieren des Moduls.</entry>
</row>
<row>
<entry><makevar>AP_GENPLIST</makevar></entry>
<entry>Eine <filename>pkg-plist</filename> wird
automatisch erzeugt.</entry>
</row>
<row>
<entry><makevar>AP_INC</makevar></entry>
<entry>Verzeichnis für zusätzliche
Header-Dateien, die beim Kompilieren mitverwendet
werden.</entry>
</row>
<row>
<entry><makevar>AP_LIB</makevar></entry>
<entry>Verzeichnis für zusätzliche
Bibliothek-Dateien, welche beim Kompilieren
mitverwendet werden.</entry>
</row>
<row>
<entry><makevar>AP_EXTRAS</makevar></entry>
<entry>Zusätzliche Flags für
<command>apxs</command>.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="web-apps">
<title>Webanwendungen</title>
<para>Webanwendungen sollten nach <filename>
<makevar>PREFIX</makevar>/www/<replaceable>programmname
</replaceable></filename> installiert werden.
Der Einfachheit halber ist dieser Pfad sowohl im
<filename>Makefile</filename> als auch in
<filename>pkg-plist</filename> als
<makevar>WWWDIR</makevar> verfügbar. Der relative
Pfad <makevar>PREFIX</makevar> ist hingegen im
<filename>Makefile</filename> durch die Variable
<makevar>WWWDIR_REL</makevar> festgelegt.</para>
<para>Der Benutzername und die Benutzergruppe,
mit deren Rechte Webanwendungen laufen, sind in
<makevar>WWWOWN</makevar> und <makevar>WWWGRP</makevar>
festgelegt. Standardwert ist bei beiden
<literal>www</literal>. Falls ein Port mit anderen
Rechten gestartet werden soll, so sollte die Anweisung
<literal>WWWOWN?= myuser</literal> verwendet werden. Dies
vereinfacht dem Benutzer eine Anpassung dieser Werte.</para>
<para>Falls die Webanwendung nicht explizit Apache
benötigt, so sollte dieser auch nicht als
Abhängigkeit des Ports aufgeführt werden.
Dadurch bleibt es dem Benutzer überlassen
Apache oder einen anderen Webserver zu verwenden.</para>
</sect2>
<sect2 id="php-variables">
<title>PHP</title>
<table frame="none">
<title>Variablen für Ports, die PHP verwenden</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_PHP</makevar></entry>
<entry>Der Port benötigt PHP. Der Wert
<literal>yes</literal> bewirkt eine Abhängigkeit
des Ports von PHP. Es kann auch eine Liste der
benötigten PHP-Erweiterungen angegeben
werden. Beispiel:
<literal>pcre xml gettext</literal></entry>
</row>
<row>
<entry><makevar>DEFAULT_PHP_VER</makevar></entry>
<entry>Legt die Version von PHP fest, die
standardmäßig installiert wird, falls noch
kein PHP vorhanden ist. Standardwert ist
<literal>4</literal>. Mögliche Werte sind:
<literal>4</literal>,<literal>5</literal></entry>
</row>
<row>
<entry><makevar>IGNORE_WITH_PHP</makevar></entry>
<entry>Der Port funktioniert nicht mit der angegebenen
Version von PHP. Mögliche Werte:
<literal>4</literal>, <literal>5</literal></entry>
</row>
<row>
<entry><makevar>USE_PHPIZE</makevar></entry>
<entry>Der Port wird als PHP-Erweiterung gebaut.</entry>
</row>
<row>
<entry><makevar>USE_PHPEXT</makevar></entry>
<entry>Der Port wird wie eine PHP-Erweiterung
behandelt&nbsp;&ndash;&nbsp;Installation und
Eintragung in die PHP-Registry für
Erweiterungen.</entry>
</row>
<row>
<entry><makevar>USE_PHP_BUILD</makevar></entry>
<entry>Setzt PHP als build-Anhängigkeit.</entry>
</row>
<row>
<entry><makevar>WANT_PHP_CLI</makevar></entry>
<entry>Benötigt die Kommandozeilen-Version von
PHP.</entry>
</row>
<row>
<entry><makevar>WANT_PHP_CGI</makevar></entry>
<entry>Benötigt die CGI-Version von PHP.</entry>
</row>
<row>
<entry><makevar>WANT_PHP_MOD</makevar></entry>
<entry>Benötigt das Apache-Modul von PHP.</entry>
</row>
<row>
<entry><makevar>WANT_PHP_SCR</makevar></entry>
<entry>Benötigt die Kommandozeilen- oder die
CGI-Version von PHP.</entry>
</row>
<row>
<entry><makevar>WANT_PHP_WEB</makevar></entry>
<entry>Benötigt das Apache-Modul oder die CGI-Version
von PHP.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2>
<title>PEAR Module</title>
<para>Das Portieren von PEAR-Modulen ist sehr einfach.</para>
<para>Mit Hilfe der Variablen <makevar>FILES</makevar>,
<makevar>TESTS</makevar>, <makevar>DATA</makevar>,
<makevar>SQLS</makevar>, <makevar>SCRIPTFILES</makevar>,
<makevar>DOCS</makevar> und <makevar>EXAMPLES</makevar>
können die zu installierenden Dateien angegeben werden.
Alle aufgeführten Dateien werden automatisch in die
jeweiligen Verzeichnisse installiert und der Datei
<filename>pkg-plist</filename> hinzugefügt.</para>
<para>Die Datei <filename>
&dollar;{PORTSDIR}/devel/pear/bsd.pear.mk</filename>
muss am Ende des <filename>Makefile</filename>s
eingebunden werden.</para>
<example id="pear-makefile">
<title>Beispiel eines Makefiles für eine PEAR
Klasse</title>
<programlisting>PORTNAME= Date
PORTVERSION= 1.4.3
CATEGORIES= devel www pear
MAINTAINER= example@domain.com
COMMENT= PEAR Date and Time Zone Classes
BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR
RUN_DEPENDS= ${BUILD_DEPENDS}
FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \
Date/TimeZone.php
TESTS= test_calc.php test_date_methods_span.php testunit.php \
testunit_date.php testunit_date_span.php wknotest.txt \
bug674.php bug727_1.php bug727_2.php bug727_3.php \
bug727_4.php bug967.php weeksinmonth_4_monday.txt \
weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \
weeksinmonth_rdm_sunday.txt
DOCS= TODO
_DOCSDIR= .
.include &lt;bsd.port.pre.mk&gt;
.include "&dollar;{PORTSDIR}/devel/pear/bsd.pear.mk"
.include &lt;bsd.port.post.mk&gt;</programlisting>
</example>
</sect2>
</sect1>
<sect1 id="using-python">
<title>Python benutzen</title>
<para>Die Ports unterstützen parallele Installationen
mehrerer Python-Versionen. Ports sollten sicherstellen,
dass der richtige <command>python</command>-Interpreter
verwendet wird&nbsp;&ndash;&nbsp;entsprechend der durch den
Benutzer definierbaren Variable
<makevar>PYTHON_VERSION</makevar>. Häufig bedeutet
dies, dass der Pfad zum <command>python</command>-Interpreter
durch den Wert der Variablen <makevar>PYTHON_CMD</makevar>
ersetzt werden muss.</para>
<para>Ports, die Dateien unter
<makevar>PYTHON_SITELIBDIR</makevar> installieren, sollten
<literal>pyXY-</literal> als Präfix des Paketnamens
haben, sodass in deren Paketname die zugehörige
Python Version aufgeführt wird.</para>
<programlisting>PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}</programlisting>
<table frame="none">
<title>Nützliche Variablen für Ports,
die Python verwenden</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_PYTHON</makevar></entry>
<entry>Der Port benötigt Python. Die minimal
benötigte Version kann durch Werte wie
<literal>2.3+</literal> angegeben werden.
Bereiche von Versionsnummern können durch Angabe der
minimalen und maximalen Versionsnummer, getrennt durch
einen Gedankenstrich, festgelegt werden, z.B.:
<literal>2.1-2.3</literal></entry>
</row>
<row>
<entry><makevar>USE_PYDISTUTILS</makevar></entry>
<entry>Verwende Python-distutils zum Konfigurieren,
Kompilieren und Installieren. Dies ist erforderlich,
falls der Port eine <filename>setup.py</filename>-Datei
beinhaltet. Dadurch werden die
<maketarget>do-build</maketarget> und
<maketarget>do-install</maketarget>-Ziele und eventuell
auch das <maketarget>do-configure</maketarget>-Ziel
übergangen, falls <makevar>GNU_CONFIGURE</makevar>
nicht definiert ist.</entry>
</row>
<row>
<entry><makevar>PYTHON_PKGNAMEPREFIX</makevar></entry>
<entry>Wird als <makevar>PKGNAMEPREFIX</makevar> verwendet,
um Pakete für unterschiedliche Python-Versionen zu
trennen. Beispiel: <literal>py24-</literal></entry>
</row>
<row>
<entry><makevar>PYTHON_SITELIBDIR</makevar></entry>
<entry>Verzeichnis des site-Pakete Baums, der das
Installationsverzeichnis von Python (üblicherweise
<makevar>LOCALBASE</makevar>) beinhaltet. Die
<makevar>PYTHON_SITELIBDIR</makevar>-Variable kann
sehr nützlich bei der Installation von
Python-Modulen sein.</entry>
</row>
<row>
<entry><makevar>PYTHONPREFIX_SITELIBDIR</makevar></entry>
<entry>Die präfix-freie Variante von
<makevar>PYTHON_SITELIBDIR</makevar>. Benutzen Sie immer
<literal>%%PYTHON_SITELIBDIR%%</literal> in
<filename>pkg-plist</filename>, wenn möglich. Der
Standardwert von <literal>%%PYTHON_SITELIBDIR%%</literal>
ist <literal>
lib/python%%PYTHON_VERSION%%/site-packages
</literal></entry>
</row>
<row>
<entry><makevar>PYTHON_CMD</makevar></entry>
<entry>Kommandozeilen-Interpreter für Python mit
Versionsnummer.</entry>
</row>
<row>
<entry><makevar>PYNUMERIC</makevar></entry>
<entry>Liste der Abhängigkeiten für numerische
Erweiterungen.</entry>
</row>
<row>
<entry><makevar>PYNUMPY</makevar></entry>
<entry>Liste der Abhängigkeiten für die neue
numerische Erweiterung numpy.
(<makevar>PYNUMERIC</makevar> ist vom Anbieter als
veraltet deklariert)</entry>
</row>
<row>
<entry><makevar>PYXML</makevar></entry>
<entry>Liste der Abhängigkeiten für
XML-Erweiterungen (wird ab Python 2.0 nicht mehr
benötigt, da im Basispaket enthalten).</entry>
</row>
<row>
<entry><makevar>USE_TWISTED</makevar></entry>
<entry>Setzt die Abhängigkeit des Ports von
twistedCore. Die Liste der erforderlichen Komponenten
kann als Wert spezifiziert werden. Beispiel:
<literal>web lore pair flow</literal></entry>
</row>
<row>
<entry><makevar>USE_ZOPE</makevar></entry>
<entry>Setzt Zope, eine Plattform für Webanwendungen,
als Abhängigkeit des Ports. Setzt die
Versionsabhängigkeit von Python auf 2.3. Setzt
<makevar>ZOPEBASEDIR</makevar> auf das Verzeichnis,
in welches Zope installiert wurde.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Eine vollständige Liste aller verfügbaren
Variablen ist in <filename>/usr/ports/Mk/bsd.python.mk
</filename> zu finden.</para>
</sect1>
<sect1 id="using-tcl">
<title>Benutzung von <application>Tcl/Tk</application></title>
<para>Die Ports-Sammlung unterstützt die parallele
Installation mehrerer
<application>Tcl/Tk</application>-Versionen. Ports sollten
mindestens die vorgegebene
<application>Tcl/Tk</application>-Version oder höher zu
unterstützen versuchen anhand der Variablen
<makevar>USE_TCL</makevar> und <makevar>USE_TK</makevar>. Es
ist möglich, die gewünschte Version von
<command>tcl</command> mit der Variable
<makevar>WITH_TCL_VER</makevar> vorzuschreiben.</para>
<table frame="none">
<title>Äußerst nützliche Variablen für
Ports, die <application>Tcl/Tk</application>
benutzen</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_TCL</makevar></entry>
<entry>Der Port benötigt die
<application>Tcl</application>-Bibliothek (nicht die
Shell). Eine notwendige Mindestversion kann mit Werten
wie 84+ angegeben werden. Einzelne nicht
unterstützte Versionen können mit der
Variable <makevar>INVALID_TCL_VER</makevar> festgelegt
werden.</entry>
</row>
<row>
<entry><makevar>USE_TCL_BUILD</makevar></entry>
<entry>Der Port benötigt
<application>Tcl</application> nur während der
Zeit, in der er gebaut wird.</entry>
</row>
<row>
<entry><makevar>USE_TCL_WRAPPER</makevar></entry>
<entry>Ports, welche zwar die
<application>Tcl</application>-Shell, aber nicht eine
bestimmte Version von <literal>tclsh</literal>
verlangen, sollten diese neue Variable verwenden. Ein
Wrapperskript für <literal>tclsh</literal> wird
auf dem System installiert. Der Benutzer kann
festlegen, welche <command>tcl</command>-Shell
gewünscht ist bzw. verwendet werden soll.</entry>
</row>
<row>
<entry><makevar>WITH_TCL_VER</makevar></entry>
<entry>Benutzerdefinierte Variable, welche die
gewünschte <application>Tcl</application>-Version
bestimmt.</entry>
</row>
<row>
<entry><makevar><replaceable>PORTNAME</replaceable>_WITH_TCL_VER</makevar></entry>
<entry>Gleich wie <makevar>WITH_TCL_VER</makevar>, nur
portspezifisch.</entry>
</row>
<row>
<entry><makevar>USE_TCL_THREADS</makevar></entry>
<entry>Fordere threadfähiges
<application>Tcl/Tk</application>.</entry>
</row>
<row>
<entry><makevar>USE_TK</makevar></entry>
<entry>Der Port benötigt die
<application>Tk</application>-Bibliothek (nicht die
Wish-Shell). Impliziert <makevar>USE_TCL</makevar> mit
dem gleichen Wert. Für weitere Informationen
siehe die Beschreibung der Variable
<makevar>USE_TCL</makevar>.</entry>
</row>
<row>
<entry><makevar>USE_TK_BUILD</makevar></entry>
<entry>Analog zur Variable
<makevar>USE_TCL_BUILD</makevar>.</entry>
</row>
<row>
<entry><makevar>USE_TK_WRAPPER</makevar></entry>
<entry>Analog zur Variable
<makevar>USE_TCL_WRAPPER</makevar>.</entry>
</row>
<row>
<entry><makevar>WITH_TK_VER</makevar></entry>
<entry>Analog zur Variable
<makevar>WITH_TCL_VER</makevar> und impliziert
<makevar>WITH_TCL_VER</makevar> mit dem gleichen
Wert.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Eine vollständige Liste der zur Verfügung
stehenden Variablen befindet sich in
<filename>/usr/ports/Mk/bsd.tcl.mk</filename>.</para>
</sect1>
<sect1 id="using-emacs">
<title>Emacs benutzen</title>
<para>Dieser Abschnitt muss noch geschrieben werden.</para>
</sect1>
<sect1 id="using-ruby">
<title>Ruby benutzen</title>
<table frame="none">
<title>Nützliche Variablen für Ports,
die Ruby verwenden</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_RUBY</makevar></entry>
<entry>Der Port benötigt Ruby.</entry>
</row>
<row>
<entry><makevar>USE_RUBY_EXTCONF</makevar></entry>
<entry>Der Port verwendet <filename>extconf.rb</filename>
für die Konfiguration.</entry>
</row>
<row>
<entry><makevar>USE_RUBY_SETUP</makevar></entry>
<entry>Der Port verwendet <filename>setup.rb</filename>
für die Konfiguration.</entry>
</row>
<row>
<entry><makevar>RUBY_SETUP</makevar></entry>
<entry>Legt den alternativen Namen von
<filename>setup.rb</filename> fest. Üblich ist der
Wert <filename>install.rb</filename>.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Die folgende Tabelle listet ausgewählte Variablen
auf, die Portautoren über die Port-Infrastruktur zur
Verfügung stehen. Diese Variablen sollten für die
Installation von Dateien in die entsprechenden Verzeichnisse
verwendet werden. Sie sollten in
<filename>pkg-plist</filename> so häufig wie möglich
verwendet und in einem Port nicht neu definiert werden.</para>
<table frame="none">
<title>Ausgewählte read-only-Variablen für Ports,
die Ruby verwenden</title>
<tgroup cols="3">
<thead>
<row>
<entry>Variable</entry>
<entry>Beschreibung</entry>
<entry>Beispiel</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>RUBY_PKGNAMEPREFIX</makevar></entry>
<entry>Wird als <makevar>PKGNAMEPREFIX</makevar> verwendet,
um Pakete für verschiedene Versionen von Ruby zu
unterscheiden.</entry>
<entry><literal>ruby18-</literal></entry>
</row>
<row>
<entry><makevar>RUBY_VERSION</makevar></entry>
<entry>Vollständige Version von Ruby in der Form
<literal>x.y.z</literal>.</entry>
<entry><literal>1.8.2</literal></entry>
</row>
<row>
<entry><makevar>RUBY_SITELIBDIR</makevar></entry>
<entry>Installationsverzeichnis der von der
Rechnerarchitektur unabhängigen
Bibliotheken.</entry>
<entry><literal>/usr/local/lib/ruby/site_ruby/1.8</literal></entry>
</row>
<row>
<entry><makevar>RUBY_SITEARCHLIBDIR</makevar></entry>
<entry>Installationsverzeichnis der von der Rechnerarchitektur
abhängigen Bibliotheken.</entry>
<entry><literal>/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6</literal></entry>
</row>
<row>
<entry><makevar>RUBY_MODDOCDIR</makevar></entry>
<entry>Installationsverzeichnis für die Dokumentation
der Module.</entry>
<entry><literal>/usr/local/share/doc/ruby18/patsy</literal></entry>
</row>
<row>
<entry><makevar>RUBY_MODEXAMPLESDIR</makevar></entry>
<entry>Installationsverzeichnis für die Beispiele der
Module.</entry>
<entry><literal>/usr/local/share/examples/ruby18/patsy</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Eine vollständige Liste der verfügbarenVariablen
kann in <filename>/usr/ports/Mk/bsd.ruby.mk</filename>
eingesehen werden.</para>
</sect1>
<sect1 id="using-sdl">
<title>SDL verwenden</title>
<para>Die Variable <makevar>USE_SDL</makevar> wird für die
automatische Konfiguration der Abhängigkeiten für Ports
benutzt, die auf SDL basierende Bibliotheken wie
<filename role="package">devel/sdl12</filename> und
<filename role="package">x11-toolkits/sdl_gui</filename>
verwenden.</para>
<para>Die folgenden SDL-Bibliotheken sind derzeit
bekannt:</para>
<itemizedlist>
<listitem>
<para>sdl: <filename
role="package">devel/sdl12</filename></para>
</listitem>
<listitem>
<para>gfx: <filename
role="package">graphics/sdl_gfx</filename></para>
</listitem>
<listitem>
<para>gui: <filename
role="package">x11-toolkits/sdl_gui</filename></para>
</listitem>
<listitem>
<para>image: <filename
role="package">graphics/sdl_image</filename></para>
</listitem>
<listitem>
<para>ldbad: <filename
role="package">devel/sdl_ldbad</filename></para>
</listitem>
<listitem>
<para>mixer: <filename
role="package">audio/sdl_mixer</filename></para>
</listitem>
<listitem>
<para>mm: <filename
role="package">devel/sdlmm</filename></para>
</listitem>
<listitem>
<para>net: <filename
role="package">net/sdl_net</filename></para>
</listitem>
<listitem>
<para>sound: <filename
role="package">audio/sdl_sound</filename></para>
</listitem>
<listitem>
<para>ttf: <filename
role="package">graphics/sdl_ttf</filename></para>
</listitem>
</itemizedlist>
<para>Falls ein Port z.B. von
<filename role="package">net/sdl_net</filename> und
<filename role="package">audio/sdl_mixer</filename>
abhängt, so wäre die Syntax:</para>
<programlisting>USE_SDL= net mixer</programlisting>
<para>Die Abhängigkeit von
<filename role="package">devel/sdl12</filename>, die durch
<filename role="package">net/sdl_net</filename> und
<filename role="package">audio/sdl_mixer</filename> entsteht,
wird automatisch zum Port hinzugefügt.</para>
<para>Falls <makevar>USE_SDL</makevar> im Port verwendet wird,
so wird automatisch:</para>
<itemizedlist>
<listitem>
<para>die Abhängigkeit von
<application>sdl12-config</application> zu
<makevar>BUILD_DEPENDS</makevar> hinzugefügt</para>
</listitem>
<listitem>
<para>die Variable <makevar>SDL_CONFIG</makevar> zu
<makevar>CONFIGURE_ENV</makevar> hinzugefügt</para>
</listitem>
<listitem>
<para>die Abhängigkeit der ausgewählten
Bibliotheken zu <makevar>LIB_DEPENDS</makevar>
hinzugefügt</para>
</listitem>
</itemizedlist>
<para>Um zu überprüfen, ob die SDL-Bibliotheken
verfügbar sind, kann die Variable
<makevar>WANT_SDL</makevar> verwendet werden:</para>
<programlisting>WANT_SDL=yes
.include &lt;bsd.port.pre.mk&gt;
.if ${HAVE_SDL:Mmixer}!=""
USE_SDL+= mixer
.endif
.include &lt;bsd.port.post.mk&gt;</programlisting>
</sect1>
<sect1 id="using-wx">
<title><application>wxWidgets</application> verwenden</title>
<para>Dieser Abschnitt beschreibt den Status der
<application>wxWidgets</application>-Bibliotheken in den Ports
und deren Einbindung in das Ports-System.</para>
<sect2 id="wx-introduction">
<title>Einführung</title>
<para>Es gibt viele Probleme bei der gleichzeitigen Verwendung
unterschiedlicher Versionen von
<application>wxWidgets</application>-Bibliotheken (Dateien
unterschiedlicher
<application>wxWidgets</application>-Versionen haben
denselben Dateinamen). In den Ports wurde das Problem
dadurch gelöst, dass jede Version unter einem eigenen
Namen installiert wird, der die Versionsnummer als Suffix
beinhaltet.</para>
<para>Der offensichtliche Nachteil dabei ist, dass jede
Anwendung so verändert werden muss, dass sie die
erwartete Version vorfindet. Die meisten solcher
Anwendungen benutzen das
<command>wx-config</command>-Skript, um die benötigten
Compiler- und Linkerflags zu erhalten. Dieses Skript hat
für jede verfügbare Version einen anderen Namen.
Die meisten Anwendungen beachten eine Umgebungsvariable oder
ein Argument beim <command>configure</command>-Skript, um
das gewünschte <command>wx-config</command>-Skript
festzulegen. Ansonsten müssen sie gepatcht
werden.</para>
</sect2>
<sect2 id="wx-version">
<title>Auswahl der Version</title>
<para>Um festzulegen, welche Version der
<application>wxWidgets</application> verwendet werden soll,
gibt es zwei Variablen (falls nur eine der beiden definiert
wird, so wird die andere auf einen Standardwert
gesetzt):</para>
<table id="wx-ver-sel-table" frame="none">
<title>Variablen, um die
<application>wxWidgets</application>-Version festzulegen</title>
<tgroup cols="3">
<thead>
<row>
<entry>Variable</entry>
<entry>Beschreibung</entry>
<entry>Standardwert</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_WX</makevar></entry>
<entry>Liste der Versionen, die der Port verwenden
kann</entry>
<entry>Alle verfügbaren Versionen</entry>
</row>
<row>
<entry><makevar>USE_WX_NOT</makevar></entry>
<entry>Liste der Versionen, die der Port nicht verwenden
kann</entry>
<entry>Nichts</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Es folgt eine Liste an möglichen
<application>wxWidgets</application>-Versionen und deren
zugehöriger Port:</para>
<table frame="none">
<title>Verfügbare
<application>wxWidgets</application>-Versionen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Version</entry>
<entry>Port</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>2.4</literal></entry>
<entry><filename
role="package">x11-toolkits/wxgtk24</filename></entry>
</row>
<row>
<entry><literal>2.6</literal></entry>
<entry><filename
role="package">x11-toolkits/wxgtk26</filename></entry>
</row>
<row>
<entry><literal>2.8</literal></entry>
<entry><filename
role="package">x11-toolkits/wxgtk28</filename></entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>Ab Version <literal>2.5</literal> werden auch Versionen in
Unicode unterstützt und über einen Unterport
mit dem Suffix <literal>-unicode</literal> installiert.
Dies kann aber auch über Variablen gehandhabt
werden (siehe <xref linkend="wx-unicode"/>).</para>
</note>
<para>Die Variablen in <xref linkend="wx-ver-sel-table"/>
können auf einen oder mehrere (durch Leerzeichen
getrennt) der folgenden Werte gesetzt werden:</para>
<table frame="none">
<title>Spezifikationen der
<application>wxWidgets</application>-Versionen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Beschreibung</entry>
<entry>Beispiel</entry>
</row>
</thead>
<tbody>
<row>
<entry>Einzelne Version</entry>
<entry><literal>2.4</literal></entry>
</row>
<row>
<entry>Aufsteigende Versionsnummern</entry>
<entry><literal>2.4+</literal></entry>
</row>
<row>
<entry>Absteigende Versionsnummern</entry>
<entry><literal>2.6-</literal></entry>
</row>
<row>
<entry>Versionsinterval (muss aufsteigend sein)</entry>
<entry><literal>2.4-2.6</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Desweiteren gibt es Variablen, über die eine
bevorzugte Version festgelegt werden kann. Die Versionen
können als Liste angegeben werden, wobei die
Reihenfolge der Priorisierung entspricht.</para>
<table frame="none">
<title>Variablen zur Festlegung der bevorzugten
<application>wxWidgets</application>-Version</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Bestimmt für</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>WANT_WX_VER</makevar></entry>
<entry>den Port</entry>
</row>
<row>
<entry><makevar>WITH_WX_VER</makevar></entry>
<entry>den Benutzer</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="wx-components">
<title>Komponentenauswahl</title>
<para>Desweiteren gibt es Anwendungen, die nicht direkt
<application>wxWidgets</application>-Bibliotheken sind, aber
trotzdem mit diesen zusammenhängen. Diese Anwendungen
können über die Variable
<makevar>WX_COMPS</makevar> festgelegt werden. Die folgenden
Komponenten sind verfügbar:</para>
<table frame="none">
<title>Verfügbare
<application>wxWidgets</application>-Komponenten</title>
<tgroup cols="3">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
<entry>Versionsbeschränkungen</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>wx</literal></entry>
<entry>Hauptbibliothek</entry>
<entry><literal>Nichts</literal></entry>
</row>
<row>
<entry><literal>contrib</literal></entry>
<entry>Beigesteuerte Bibliothek</entry>
<entry><literal>Nichts</literal></entry>
</row>
<row>
<entry><literal>python</literal></entry>
<entry><application>wxPython</application>
(<application>Python</application>-Bindungen)</entry>
<entry><literal>2.4-2.6</literal></entry>
</row>
<row>
<entry><literal>mozilla</literal></entry>
<entry><application>wxMozilla</application></entry>
<entry><literal>2.4</literal></entry>
</row>
<row>
<entry><literal>svg</literal></entry>
<entry><application>wxSVG</application></entry>
<entry><literal>2.6</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Der Typ der Abhängigkeit kann für jede
Komponente durch hinzufügen eines Suffix (durch
Strichpunkt getrennt) festgelegt werden. Falls der Typ nicht
angegeben wird, wird ein Standardwert verwendet (siehe <xref
linkend="wx-def-dep-types"/>). Die folgenden Typen sind
verfügbar:</para>
<table frame="none">
<title>Verfügbare Typen von
<application>wxWidgets</application>-Abhängigkeiten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>build</literal></entry>
<entry>Komponente wird zum Bau
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>BUILD_DEPENDS</makevar></entry>
</row>
<row>
<entry><literal>run</literal></entry>
<entry>Komponente wird zum Ausführen
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>RUN_DEPENDS</makevar></entry>
</row>
<row>
<entry><literal>lib</literal></entry>
<entry>Komponente wird zum Bau und Ausführen
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>LIB_DEPENDS</makevar></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Die Standardwerte für die einzelnen Komponenten
sind in der folgenden Tabelle aufgeführt:</para>
<table id="wx-def-dep-types" frame="none">
<title>Standardtypen der
<application>wxWidgets</application>-Abhängigkeiten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Komponente</entry>
<entry>Typ der Abhängigkeit</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>wx</literal></entry>
<entry><literal>lib</literal></entry>
</row>
<row>
<entry><literal>contrib</literal></entry>
<entry><literal>lib</literal></entry>
</row>
<row>
<entry><literal>python</literal></entry>
<entry><literal>run</literal></entry>
</row>
<row>
<entry><literal>mozilla</literal></entry>
<entry><literal>lib</literal></entry>
</row>
<row>
<entry><literal>svg</literal></entry>
<entry><literal>lib</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<example id="wx-components-example">
<title>Auswahl von
<application>wxWidgets</application>-Komponenten</title>
<para>Der folgende Ausschnitt entspricht einem Port, der
die <application>wxWidgets</application>-Version
<literal>2.4</literal> und die zugehörigen
Bibliotheken verwendet.</para>
<programlisting>USE_WX= 2.4
WX_COMPS= wx contrib</programlisting>
</example>
</sect2>
<sect2 id="wx-unicode">
<title>Unicode</title>
<para>Die <application>wxWidgets</application>-Bibliotheken
unterstützen Unicode seit der Version
<literal>2.5</literal>. In den Ports sind beide Versionen
verfügbar und können über die folgenden
Variablen ausgewählt werden:</para>
<table id="wx-unicode-var-table" frame="none">
<title>Variablen, um Unicode in den
<application>wxWidgets</application>-Versionen
auszuwählen</title>
<tgroup cols="3">
<thead>
<row>
<entry>Variable</entry>
<entry>Beschreibung</entry>
<entry>Bestimmt für</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>WX_UNICODE</makevar></entry>
<entry>Der Port funktioniert
<emphasis>ausschließlich</emphasis> mit der
Unicode-Version</entry>
<entry>den Port</entry>
</row>
<row>
<entry><makevar>WANT_UNICODE</makevar></entry>
<entry>Der Port funktioniert in beiden
Versionen&nbsp;&ndash;&nbsp;bevorzugt wird jedoch
Unicode</entry>
<entry>den Port</entry>
</row>
<row>
<entry><makevar>WITH_UNICODE</makevar></entry>
<entry>Der Port verwendet die Unicode-Version</entry>
<entry>den Benutzer</entry>
</row>
<row>
<entry><makevar>WITHOUT_UNICODE</makevar></entry>
<entry>Der Port verwendet, falls unterstützt, die
normale Version (falls <makevar>WX_UNICODE</makevar>
nicht definiert ist)</entry>
<entry>den Benutzer</entry>
</row>
</tbody>
</tgroup>
</table>
<warning>
<para>Die Variable <makevar>WX_UNICODE</makevar> darf
nicht bei Ports benutzt werden, die sowohl die Version mit
als auch ohne Unterstützung für Unicode
verwenden können. Falls der Port
standardmäßig Unterstützung für
Unicode bieten soll, verwenden Sie
<makevar>WANT_UNICODE</makevar> stattdessen.</para>
</warning>
</sect2>
<sect2 id="wx-version-detection">
<title>Feststellen der installierten Version</title>
<para>Um eine bereits installierte Version zu finden, muss
<makevar>WANT_WX</makevar> definiert werden. Falls diese
Variable nicht auf eine bestimmte Versionsnummer gesetzt
wird, werden die Komponenten einen Suffix mit der
Versionsnummer tragen. Die Variable
<makevar>HAVE_WX</makevar> wird gesetzt, falls eine
installierte Version vorgefunden wurde.</para>
<example id="wx-ver-det-example">
<title>Installierte
<application>wxWidgets</application>-Versionen
und&nbsp;&ndash;Komponenten feststellen</title>
<para>Der folgende Ausschnitt kann in einem Port verwendet
werden, der <application>wxWidgets</application>
verwendet, falls es installiert ist, oder falls eine
Option dafür ausgewählt wurde.</para>
<programlisting>WANT_WX= yes
.include &lt;bsd.port.pre.mk&gt;
.if defined(WITH_WX) || ${HAVE_WX:Mwx-2.4} != ""
USE_WX= 2.4
CONFIGURE_ARGS+=--enable-wx
.endif</programlisting>
<para>Der folgende Ausschnitt kann verwendet werden, um
die Unterstützung für
<application>wxPython</application> zusätzlich zu der
von <application>wxWidgets</application> zu aktivieren
(beide in Version <literal>2.6</literal>), wenn das
installiert ist, oder die Option ausgewählt
wurde.</para>
<programlisting>USE_WX= 2.6
WX_COMPS= wx
WANT_WX= 2.6
.include &lt;bsd.port.pre.mk&gt;
.if defined(WITH_WXPYTHON) || ${HAVE_WX:Mpython} != ""
WX_COMPS+= python
CONFIGURE_ARGS+=--enable-wxpython
.endif</programlisting>
</example>
</sect2>
<sect2 id="wx-defined-variables">
<title>Vordefinierte Variablen</title>
<para>Die folgenden Variablen sind in den Ports
verfügbar (nachdem sie entsprechend <xref
linkend="wx-ver-sel-table"/> definiert wurden).</para>
<table frame="none">
<title>Vordefinierte Variablen für Ports, die
<application>wxWidgets</application> verwenden</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>WX_CONFIG</makevar></entry>
<entry>Pfad zum <application>wxWidgets</application>
<command>wx-config</command>-Skript (mit
unterschiedlichem Namen)</entry>
</row>
<row>
<entry><makevar>WXRC_CMD</makevar></entry>
<entry>Pfad zum <application>wxWidgets</application>
<command>wxrc</command>-Programm (mit
unterschiedlichem Namen)</entry>
</row>
<row>
<entry><makevar>WX_VERSION</makevar></entry>
<entry>Version der <application>wxWidgets</application>, die
verwendet werden soll (z.B. <literal>2.6</literal>)</entry>
</row>
<row>
<entry><makevar>WX_UNICODE</makevar></entry>
<entry>Falls Unterstützung für Unicode nicht
explizit definiert, jedoch verwendet wird, dann wird die
Unterstützung automatisch aktiviert.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="wx-premk">
<title>Verarbeitung in
<filename>bsd.port.pre.mk</filename></title>
<para>Falls die Variablen gleich nach dem Importieren von
<filename>bsd.port.pre.mk</filename> benutzt werden sollen,
so muss die Variable <makevar>WX_PREMK</makevar> definiert
werden.</para>
<important>
<para>Falls <makevar>WX_PREMK</makevar> definiert ist, so
werden Version, Abhängigkeiten, Komponenten und
vordefinierte Variablen nicht geändert, wenn die
Variablen des <application>wxWidgets</application>-Ports
<emphasis>nach</emphasis> dem Einbinden von
<filename>bsd.port.pre.mk</filename> geändert
werden.</para>
</important>
<example id="wx-premk-example">
<title>Verwendung von
<application>wxWidgets</application>-Variablen
in Kommandos</title>
<para>Der folgende Ausschnitt zeigt die Verwendung von
<makevar>WX_PREMK</makevar> durch Ausführen des
<command>wx-config</command>-Skriptes, um die
vollständige Version als Zeichenkette zu erhalten,
diese dann einer Variablen zuzuweisen und die Variable
anschließend einem Programm zu
übergeben.</para>
<programlisting>USE_WX= 2.4
WX_PREMK= yes
.include &lt;bsd.port.pre.mk&gt;
.if exists(${WX_CONFIG})
VER_STR!= ${WX_CONFIG} --release
PLIST_SUB+= VERSION="${VER_STR}"
.endif</programlisting>
</example>
<note>
<para>Die <application>wxWidgets</application>-Variablen
können problemlos in Kommandos benutzt werden, falls
diese in Targets ohne gesetztes
<makevar>WX_PREMK</makevar> verwendet werden.</para>
</note>
</sect2>
<sect2 id="wx-additional-config-args">
<title>Weitere <command>configure</command>-Argumente</title>
<para>Einige GNU <command>configure</command>-Skripte
können <application>wxWidgets</application> nicht
auffinden, falls nur die Umgebungsvariable
<literal>WX_CONFIG</literal> gesetzt ist, sondern
benötigen zusätzliche Argumente. Dafür kann
die Variable <makevar>WX_CONF_ARGS</makevar> benutzt
werden.</para>
<table frame="none">
<title>Zulässige Werte für
<makevar>WX_CONF_ARGS</makevar></title>
<tgroup cols="2">
<thead>
<row>
<entry>Möglicher Wert</entry>
<entry>Resultierendes Argument</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>absolute</literal></entry>
<entry><literal>--with-wx-config=${WX_CONFIG}</literal></entry>
</row>
<row>
<entry><literal>relative</literal></entry>
<entry><literal>--with-wx=${LOCALBASE}
--with-wx-config=${WX_CONFIG:T}</literal></entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
<sect1 id="using-lua">
<title>Verwendung von <application>Lua</application></title>
<para>Dieser Abschnitt beschreibt den Status der
<application>Lua</application>-Bibliotheken in den Ports
und deren Einbindung in das Ports System.</para>
<sect2 id="lua-introduction">
<title>Einführung</title>
<para>Es gibt viele Probleme bei der gleichzeitigen
Verwendung unterschiedlicher Versionen von
<application>Lua</application>-Bibliotheken (Dateien
unterschiedlicher Versionen haben denselben Dateinamen). In
den Ports wurde das Problem gelöst, indem jede Version
unter einem eigenen Namen mit der Versionsnummer als Suffix
installiert wird.</para>
<para>Der offensichtliche Nachteil dabei ist, dass jede
Anwendung so verändert werden muss, dass sie die
erwartete Version vorfindet. Dies kann jedoch durch
zusätzliche Flags für Compiler und Linker
gelöst werden.</para>
</sect2>
<sect2 id="lua-version">
<title>Auswahl der Version</title>
<para>Um festzulegen, welche Version von
<application>Lua</application> verwendet werden soll, gibt
es zwei Variablen (falls nur eine der beiden definiert ist,
so wird die andere auf einen Standardwert gesetzt):</para>
<table id="lua-ver-sel-table" frame="none">
<title>Variablen, um die
<application>Lua</application>-Version festzulegen</title>
<tgroup cols="3">
<thead>
<row>
<entry>Variable</entry>
<entry>Beschreibung</entry>
<entry>Standardwert</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_LUA</makevar></entry>
<entry>Liste der Versionen, welche der Port verwenden
kann</entry>
<entry>Alle verfügbaren Versionen</entry>
</row>
<row>
<entry><makevar>USE_LUA_NOT</makevar></entry>
<entry>Liste der Versionen, die der Port nicht verwenden
kann</entry>
<entry>Nichts</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Es folgt eine Liste an möglichen
<application>Lua</application>-Versionen und deren
zugehöriger Port:</para>
<table frame="none">
<title>Verfügbare
<application>Lua</application>-Versionen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Version</entry>
<entry>Port</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>4.0</literal></entry>
<entry><filename
role="package">lang/lua4</filename></entry>
</row>
<row>
<entry><literal>5.0</literal></entry>
<entry><filename
role="package">lang/lua50</filename></entry>
</row>
<row>
<entry><literal>5.1</literal></entry>
<entry><filename
role="package">lang/lua</filename></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Die Variablen in <xref linkend="lua-ver-sel-table"/>
können auf einen oder mehrere (durch Leerzeichen
getrennt) der folgenden Werte gesetzt werden:</para>
<table frame="none">
<title>Spezifikationen der
<application>Lua</application>-Versionen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Beschreibung</entry>
<entry>Beispiel</entry>
</row>
</thead>
<tbody>
<row>
<entry>Spezielle Version</entry>
<entry><literal>4.0</literal></entry>
</row>
<row>
<entry>Aufsteigende Versionen</entry>
<entry><literal>5.0+</literal></entry>
</row>
<row>
<entry>Absteigende Versionen</entry>
<entry><literal>5.0-</literal></entry>
</row>
<row>
<entry>Versionenintervall (muss aufsteigend sein)</entry>
<entry><literal>5.0-5.1</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Desweiteren gibt es Variablen, über die eine
bevorzugte Version festgelegt werden kann. Die Versionen
können als Liste angegeben werden, wobei die
Reihenfolge der Priorisierung entspricht.</para>
<table frame="none">
<title>Variablen zur Festlegung der bevorzugten
<application>Lua</application>-Version</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Bestimmt für</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>WANT_LUA_VER</makevar></entry>
<entry>den Port</entry>
</row>
<row>
<entry><makevar>WITH_LUA_VER</makevar></entry>
<entry>den Benutzer</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="lua-version-example">
<title>Auswahl der
<application>Lua</application>-Version</title>
<para>Der folgende Ausschnitt entspricht einem Port, der
<application>Lua</application> in den Versionen
<literal>5.0</literal> oder <literal>5.1</literal>
verwenden kann und standardmäßig
<literal>5.0</literal> verwendet. Diese Einstellung kann
durch die benutzerdefinierte Variable
<makevar>WITH_LUA_VER</makevar> überschrieben
werden.</para>
<programlisting>USE_LUA= 5.0-5.1
WANT_LUA_VER= 5.0</programlisting>
</example>
</sect2>
<sect2 id="lua-components">
<title>Komponentenauswahl</title>
<para>Desweiteren gibt es Anwendungen, die nicht direkt
<application>Lua</application>-Bibliotheken sind, aber
trotzdem mit diesen zusammenhängen. Diese Anwendungen
können über die Variable
<makevar>LUA_COMPS</makevar> festgelegt werden. Die
folgenden Komponenten sind verfügbar:</para>
<table frame="none">
<title>Verfügbare
<application>Lua</application>-Komponenten</title>
<tgroup cols="3">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
<entry>Versionseinschränkungen</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>lua</literal></entry>
<entry>Hauptbibliothek</entry>
<entry>Keine</entry>
</row>
<row>
<entry><literal>tolua</literal></entry>
<entry>Bibliothek für die Unterstützung von C/C++-Code</entry>
<entry><literal>4.0-5.0</literal></entry>
</row>
<row>
<entry><literal>ruby</literal></entry>
<entry>Ruby-Bindungen</entry>
<entry><literal>4.0-5.0</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>Es gibt weitere Komponenten, die jedoch Module
für den Interpreter sind und nicht von Anwendungen
benutzt werden (nur von anderen Modulen).</para>
</note>
<para>Der Typ der Abhängigkeit kann für jede
Komponente durch Hinzufügen eines Suffix (durch
Strichpunkt getrennt) festgelegt werden. Falls der Typ nicht
angegeben wird, wird ein Standardwert verwendet (siehe <xref
linkend="lua-def-dep-types"/>). Die folgenden Typen sind
verfügbar:</para>
<table frame="none">
<title>Verfügbare Typen von
<application>Lua</application>-Abhängigkeiten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>build</literal></entry>
<entry>Komponente wird zum Bau
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>BUILD_DEPENDS</makevar></entry>
</row>
<row>
<entry><literal>run</literal></entry>
<entry>Komponente wird zum Ausführen
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>RUN_DEPENDS</makevar></entry>
</row>
<row>
<entry><literal>lib</literal></entry>
<entry>Komponente wird zum Bau und zum Ausführen
benötigt&nbsp;&ndash;&nbsp;äquivalent zu
<makevar>LIB_DEPENDS</makevar></entry>
</row>
</tbody>
</tgroup>
</table>
<para>Die Standardwerte für die einzelnen Komponenten
sind in der folgenden Tabelle aufgeführt:</para>
<table id="lua-def-dep-types" frame="none">
<title>Standardtypen für
<application>Lua</application>-Abhängigkeiten</title>
<tgroup cols="2">
<thead>
<row>
<entry>Komponente</entry>
<entry>Typ der Abhängigkeit</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>lua</literal></entry>
<entry><literal>lib</literal> für
<literal>4.0-5.0</literal> (shared) und
<literal>build</literal> für <literal>5.1</literal>
(static)</entry>
</row>
<row>
<entry><literal>tolua</literal></entry>
<entry><literal>build</literal> (static)</entry>
</row>
<row>
<entry><literal>ruby</literal></entry>
<entry><literal>lib</literal> (shared)</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="lua-components-example">
<title>Auswahl von
<application>Lua</application>-Komponenten</title>
<para>Der folgende Ausschnitt entspricht einem Port,
welcher die <application>Lua</application>-Version
<literal>4.0</literal> und die zugehörigen
<application>Ruby</application>-Bindungen
verwendet.</para>
<programlisting>USE_LUA= 4.0
LUA_COMPS= lua ruby</programlisting>
</example>
</sect2>
<sect2 id="lua-version-detection">
<title>Feststellen der installierten Version</title>
<para>Um eine bereits installierte Version zu finden, muss
<makevar>WANT_LUA</makevar> definiert werden. Falls diese
Variable nicht auf eine bestimmte Versionsnummer gesetzt
wird, werden die Komponenten einen Suffix mit der
Versionsnummer tragen. Die Variable
<makevar>HAVE_LUA</makevar> wird gesetzt, falls eine
installierte Version vorgefunden wurde.</para>
<example id="lua-ver-det-example">
<title>Installierte
<application>Lua</application>-Versionen
und&ndash;&nbsp;Komponenten feststellen</title>
<para>Der folgende Ausschnitt kann in einem Port verwendet
werden, der <application>Lua</application> benutzt, falls
es installiert ist oder eine Option dafür
ausgewählt wurde.</para>
<programlisting>WANT_LUA= yes
.include &lt;bsd.port.pre.mk&gt;
.if defined(WITH_LUA5) || ${HAVE_LUA:Mlua-5.[01]} != ""
USE_LUA= 5.0-5.1
CONFIGURE_ARGS+=--enable-lua5
.endif</programlisting>
<para>Der folgende Ausschnitt kann verwendet werden, um
die Unterstützung für
<application>tolua</application> zusätzlich zu der
von <application>Lua</application> zu aktivieren (beide in
Version 4.0), wenn dies installiert ist oder die Option
ausgewählt wurde.</para>
<programlisting>USE_LUA= 4.0
LUA_COMPS= lua
WANT_LUA= 4.0
.include &lt;bsd.port.pre.mk&gt;
.if defined(WITH_TOLUA) || ${HAVE_LUA:Mtolua} != ""
LUA_COMPS+= tolua
CONFIGURE_ARGS+=--enable-tolua
.endif</programlisting>
</example>
</sect2>
<sect2 id="lua-defined-variables">
<title>Vordefinierte Variablen</title>
<para>Die folgenden Variablen sind in den Ports
verfügbar (nachdem sie entsprechend <xref
linkend="lua-ver-sel-table"/> definiert wurden).</para>
<table frame="none">
<title>Vordefinierte Variablen für Ports, die
<application>Lua</application> verwenden</title>
<tgroup cols="2">
<thead>
<row>
<entry>Name</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>LUA_VER</makevar></entry>
<entry>Die <application>Lua</application>-Version, die
verwendet wird (z.B. <literal>5.1</literal>)</entry>
</row>
<row>
<entry><makevar>LUA_VER_SH</makevar></entry>
<entry>Die Hauptversion für
shared-<application>Lua</application>-Bibliotheken (z.B.
<literal>1</literal>)</entry>
</row>
<row>
<entry><makevar>LUA_VER_STR</makevar></entry>
<entry>Die <application>Lua</application>-Version ohne die
Punkte (z.B. <literal>51</literal>)</entry>
</row>
<row>
<entry><makevar>LUA_PREFIX</makevar></entry>
<entry>Der Präfix, unter dem
<application>Lua</application> (und Komponenten)
installiert ist</entry>
</row>
<row>
<entry><makevar>LUA_SUBDIR</makevar></entry>
<entry>Das Verzeichnis unter
<filename>${PREFIX}/bin</filename>,
<filename>${PREFIX}/share</filename> und
<filename>${PREFIX}/lib</filename>, in welchem
<application>Lua</application> installiert ist</entry>
</row>
<row>
<entry><makevar>LUA_INCDIR</makevar></entry>
<entry>Das Verzeichnis, in dem
<application>Lua</application>- und
<application>tolua</application>-Header-Dateien
installiert sind</entry>
</row>
<row>
<entry><makevar>LUA_LIBDIR</makevar></entry>
<entry>Das Verzeichnis, in dem
<application>Lua</application>&ndash;&nbsp;und
<application>tolua</application>-Bibliotheken
installiert sind</entry>
</row>
<row>
<entry><makevar>LUA_MODLIBDIR</makevar></entry>
<entry>Das Verzeichnis, in dem
<application>Lua</application> Modul-Bibliotheken
(<filename>.so</filename>) installiert sind</entry>
</row>
<row>
<entry><makevar>LUA_MODSHAREDIR</makevar></entry>
<entry>Das Verzeichnis, in dem
<application>Lua</application>-Module
(<filename>.lua</filename>) installiert sind</entry>
</row>
<row>
<entry><makevar>LUA_PKGNAMEPREFIX</makevar></entry>
<entry>Der Paketnamen-Präfix, der von
<application>Lua</application>-Modulen verwendet
wird</entry>
</row>
<row>
<entry><makevar>LUA_CMD</makevar></entry>
<entry>Das Verzeichnis, in dem der
<application>Lua</application>-Interpreter liegt</entry>
</row>
<row>
<entry><makevar>LUAC_CMD</makevar></entry>
<entry>Das Verzeichnis, in dem der
<application>Lua</application>-Compiler liegt</entry>
</row>
<row>
<entry><makevar>TOLUA_CMD</makevar></entry>
<entry>Das Verzeichnis, in dem das
<application>tolua</application>-Programm liegt</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="lua-variables-example">
<title>Einem Port mitteilen, in welchem Verzeichnis
<application>Lua</application> liegt</title>
<para>Der folgende Ausschnitt zeigt, wie einem Port,
welcher ein configure-Skript verwendet, mitgeteilt werden
kann, wo die <application>Lua</application>-Header-Dateien
und Bibliotheken liegen.</para>
<programlisting>
USE_LUA= 4.0
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"</programlisting>
</example>
</sect2>
<sect2 id="lua-premk">
<title>Verarbeitung in
<filename>bsd.port.pre.mk</filename></title>
<para>Falls die Variablen gleich nach dem Einbinden von
<filename>bsd.port.pre.mk</filename> benutzt werden sollen,
so muss die Variable <makevar>LUA_PREMK</makevar> definiert
werden.</para>
<important>
<para>Falls <makevar>LUA_PREMK</makevar> definiert ist, so
werden Version, Abhängigkeiten, Komponenten und
vordefinierte Variablen nicht geändert, wenn die
Variablen des <application>Lua</application>-Ports
<emphasis>nach</emphasis> dem Einbinden von
<filename>bsd.port.pre.mk</filename> geändert
werden.</para>
</important>
<example id="lua-premk-example">
<title>Verwendung von
<application>Lua</application>-Variablen in
Kommandos</title>
<para>Der folgende Ausschnitt zeigt die Verwendung von
<makevar>LUA_PREMK</makevar> durch Ausführen des
<application>Lua</application>-Interpreters, um die
vollständige Version als Zeichenkette zu erhalten,
diese dann einer Variablen zuzuweisen und die Variable
schließlich einem Programm zu übergeben.</para>
<programlisting>USE_LUA= 5.0
LUA_PREMK= yes
.include &lt;bsd.port.pre.mk&gt;
.if exists(${LUA_CMD})
VER_STR!= ${LUA_CMD} -v
CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
.endif</programlisting>
</example>
<note>
<para>Die <application>Lua</application>-Variablen
können problemlos in Befehlen benutzt werden, falls
diese in Targets ohne gesetztes
<makevar>LUA_PREMK</makevar> verwendet werden.</para>
</note>
</sect2>
</sect1>
<sect1 id="using-xfce">
<title>Xfce verwenden</title>
<para>Die <makevar>USE_XFCE</makevar>-Variable wird für
die automatische Konfiguration der Abhängigkeiten
eingesetzt, welche die Xfce-Basisbibliotheken oder Anwendungen
wie <filename
role="package">x11-toolkits/libxfce4gui</filename> und
<filename role="package">x11-wm/xfce4-panel</filename>
verwenden.</para>
<para>Die folgenden Xfce-Bibliotheken und -Anwendungen werden
derzeit unterstützt:</para>
<itemizedlist>
<listitem>
<para>libexo: <filename
role="package">x11/libexo</filename></para>
</listitem>
<listitem>
<para>libgui: <filename
role="package">x11-toolkits/libxfce4gui</filename></para>
</listitem>
<listitem>
<para>libutil: <filename
role="package">x11/libxfce4util</filename></para>
</listitem>
<listitem>
<para>libmcs: <filename
role="package">x11/libxfce4mcs</filename></para>
</listitem>
<listitem>
<para>mcsmanager: <filename
role="package">sysutils/xfce4-mcs-manager</filename></para>
</listitem>
<listitem>
<para>panel: <filename
role="package">x11-wm/xfce4-panel</filename></para>
</listitem>
<listitem>
<para>thunar: <filename
role="package">x11-fm/thunar</filename></para>
</listitem>
<listitem>
<para>wm: <filename
role="package">x11-wm/xfce4-wm</filename></para>
</listitem>
<listitem>
<para>xfdev: <filename
role="package">dev/xfce4-dev-tools</filename></para>
</listitem>
</itemizedlist>
<para>Die folgenden zusätzlichen Parameter werden
unterstützt:</para>
<itemizedlist>
<listitem>
<para>configenv: Benutzen Sie dies, wenn Ihr Port eine
speziell angepasste
<makevar>CONFIGURE_ENV</makevar>-Variable benötigt,
um seine erforderlichen Bibliotheken zu finden.
<programlisting>-I&dollar;{LOCALBASE}/include
-L&dollar;{LOCALBASE}/lib</programlisting> wird CPPFLAGS
hinzugefügt und ergibt
<makevar>CONFIGURE_ENV</makevar>.</para>
</listitem>
</itemizedlist>
<para>Wenn also ein Port von <filename
role="package">sysutils/xfce4-mcs-manager</filename>
abhängt und die speziellen CPPFLAGS in seiner
configure-Umgebung verlangt, dann würde die Syntax wie
folgt aussehen:</para>
<programlisting>USE_XFCE= mcsmanager configenv</programlisting>
</sect1>
<sect1 id="using-mozilla">
<title>Mozilla verwenden</title>
<table frame="none">
<title>Variablen für Ports, die Mozilla verwenden</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_GECKO</makevar></entry>
<entry>Vom Port unterstützte Gecko-Backends. Mögliche
Werte sind:
<literal>libxul</literal> (<filename>libxul.so</filename>),
<literal>seamonkey</literal> (<filename>libgtkembedmoz.so</filename>,
(veraltet, sollte daher nicht mehr verwendet werden).</entry>
</row>
<row>
<entry><makevar>USE_FIREFOX</makevar></entry>
<entry>Der Port benötigt Firefox, um korrekt
zu funktionieren. Mögliche Werte sind:
<literal>yes</literal> (verwendet die Standardversion),
<literal>40</literal>, <literal>36</literal>,
<literal>35</literal>. Die Standardversion ist derzeit
<literal>40</literal>.</entry>
</row>
<row>
<entry><makevar>USE_FIREFOX_BUILD</makevar></entry>
<entry>Um den Port zu bauen, muss Firefox installiert
sein. Wird diese Variable gesetzt, wird
automatisch auch <makevar>USE_FIREFOX</makevar>
gesetzt.</entry>
</row>
<row>
<entry><makevar>USE_SEAMONKEY</makevar></entry>
<entry>Der Port benötigt Seamonkey, um korrekt
zu funktionieren. Mögliche Werte sind:
<literal>yes</literal> (verwendet die Standardversion),
<literal>20</literal>, <literal>11</literal>
(veraltet, sollte daher nicht mehr verwendet werden).
Die Standardversion ist <literal>20</literal>.</entry>
</row>
<row>
<entry><makevar>USE_SEAMONKEY_BUILD</makevar></entry>
<entry>Um den Port zu bauen, muss Seamonkey installiert
sein. Wird diese Variable gesetzt, wird
automatisch auch <makevar>USE_SEAMONKEY</makevar>
gesetzt.</entry>
</row>
<row>
<entry><makevar>USE_THUNDERBIRD</makevar></entry>
<entry>Dieser Port benötigt Thunderbird, um korrekt
zu funktionieren. Mögliche Werte sind:
<literal>yes</literal> (verwendet die Standardversion),
<literal>31</literal>, <literal>30</literal>
(veraltet, sollte daher nicht mehr verwendet werden).
Die Standardversion ist <literal>31</literal>.</entry>
</row>
<row>
<entry><makevar>USE_THUNDERBIRD_BUILD</makevar></entry>
<entry>Um den Port zu bauen, muss Thunderbird installiert
sein. Wird diese Variable gesetzt, wird
automatisch auch <makevar>USE_THUNDERBIRD</makevar>
gesetzt.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Eine komplette Liste aller verfügbaren Variablen finden
Sie in der Datei
<filename>/usr/ports/Mk/bsd.gecko.mk</filename>.</para>
</sect1>
<sect1 id="using-databases">
<title>Benutzung von Datenbanken</title>
<table frame="none">
<title>Variablen für Ports, die Datenbanken
benutzen</title>
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Bedeutung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>USE_BDB</makevar></entry>
<entry>Falls die Variable auf <literal>yes</literal>
gesetzt ist, füge eine Abhängigkeit von
<filename role="package">databases/db41</filename>
hinzu. Die Variable kann auch folgende Werte
annehmen: 40, 41, 42, 43, 44, 46, 47, 48 oder 51.
Sie können eine Folge akzeptierter Werte
angeben - <makevar>USE_BDB</makevar>=42+ stellt die
höchste installierte Version fest und greift
auf 42 zurück, falls sonst nichts installiert
ist.</entry>
</row>
<row>
<entry><makevar>USE_MYSQL</makevar></entry>
<entry>Falls die Variable auf <literal>yes</literal>
gesetzt ist, füge <filename
role="package">databases/mysql55-server</filename>
als Abhängigkeit hinzu. Die damit
verknüpfte Variable
<makevar>WANT_MYSQL_VER</makevar> kann Werte wie
323, 40, 41, 50, 51, 52, 55, oder 60 annehmen.</entry>
</row>
<row>
<entry><makevar>USE_PGSQL</makevar></entry>
<entry>Falls die Variable auf <literal>yes</literal>
gesetzt ist, füge eine Abhängigkeit von
<filename
role="package">databases/postgresql84</filename>
hinzu. Die damit verknüpfte Variable
<makevar>WANT_PGSQL_VER</makevar> kann Werte wie 73,
74, 80, 81, 82, 83, oder 90 annehmen.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Weitere Informationen zu diesem Thema finden sich in der
Datei <ulink
url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.database.mk">
bsd.database.mk</ulink>.</para>
</sect1>
<sect1 id="rc-scripts">
<title>Starten und Anhalten von Diensten (rc Skripten)</title>
<para><filename>rc.d</filename>-Skripten werden zum Starten
von Diensten während des Systemstarts verwendet und um
den Administratoren einen Standardweg zum Anhalten und Starten
von Diensten zu bieten. Ports halten sich an dieses
systemweite <filename>rc.d</filename>-Framework. Details zu
deren Benutzung können im <ulink
url="&url.books.handbook;/configtuning-rcd.html">rc.d Kapitel
des Handbuchs</ulink> nachgelesen werden. Ausführliche
Beschreibungen der verfügbaren Befehle stehen in
&man.rc.8; und &man.rc.subr.8;. Desweiteren gibt es <ulink
url="&url.articles.rc-scripting.en;">einen Artikel</ulink> zu
praktischen Aspekten bezüglich
<filename>rc.d</filename>-Skripten.</para>
<para>Ein oder mehrere <filename>rc.d</filename>-Skripten können installiert
werden mittels:</para>
<programlisting>USE_RC_SUBR= doormand</programlisting>
<para>Skripten müssen im Unterverzeichnis
<filename>files</filename> abgelegt und jeder Skript-Datei
muss ein <literal>.in</literal>-Suffix hinzugefügt
werden. Standardmäßige
<makevar>SUB_LIST</makevar>-Ersetzungen werden für diese
Dateien unterstützt. Die Verwendung von
<literal>%%PREFIX%%</literal> und
<literal>%%LOCALBASE%%</literal> wird dringend empfohlen.
Näheres zu <makevar>SUB_LIST</makevar> kann im <link
linkend="using-sub-files">zugehörigen Kapitel</link>
nachgelesen werden.</para>
<para>Für &os;-Versionen, die älter als 6.1-RELEASE
sind, ist die Integration mittels &man.rcorder.8;
möglich, indem <makevar>USE_RCORDER</makevar> anstatt
<makevar>USE_RC_SUBR</makevar> verwendet wird. Die Verwendung
dieser Methode ist jedoch nur notwendig, wenn der Port in die
Verzeichnisstruktur des Basissystems installiert werden kann
oder der Dienst vor den
<filename>FILESYSTEMS</filename>-Skripten in
<filename>rc.d</filename> des Basissystems gestartet sein
muss.</para>
<para>Seit &os;&nbsp;6.1-RELEASE sind lokale
<filename>rc.d</filename>-Skripten (inklusive der durch Ports
installierten) im allgemeinen &man.rcorder.8; des
Basissystems.</para>
<para>Beispiel eines einfachen
<filename>rc.d</filename>-Skripts:</para>
<programlisting>#!/bin/sh
# &dollar;FreeBSD&dollar;
#
# PROVIDE: doormand
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# doormand_enable (bool): Set to NO by default.
# Set it to YES to enable doormand.
# doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf
# by default.
#
. /etc/rc.subr
name="doormand"
rcvar=${name}_enable
command=%%PREFIX%%/sbin/${name}
pidfile=/var/run/${name}.pid
load_rc_config $name
: ${doormand_enable="NO"}
: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}
command_args="-p $pidfile -f $doormand_config"
run_rc_command "$1"</programlisting>
<para>Solange kein guter Grund dafür besteht, einen Dienst
früher starten zu lassen, sollten alle Ports-Skripten
<programlisting>REQUIRE: LOGIN</programlisting> verwenden.
Falls der Port von einem bestimmten Benutzer (außer
root) ausgeführt wird, ist dies zwingend.
<programlisting>KEYWORD: shutdown</programlisting> ist im
Skript oben deswegen vorhanden, weil der frei erfundene
Beispiel-Port einen Dienst startet und dieser beim
Herunterfahren des Systems sauber beendet werden sollte.
Startete das Skript keinen persistenten Dienst, wäre dies
nicht notwendig.</para>
<para>Für die Wertzuweisung von Variablen sollte
&quot;=&quot; anstatt &quot;:=&quot; verwendet werden, da bei
Ersterem nur auf einen Standardwert gesetzt wird, wenn die
Variable vorher noch nicht gesetzt war, und bei Letzterem
dieser gesetzt wird, auch wenn der Wert vorher Null gewesen
ist. Ein Benutzer kann durchaus einen Ausdruck wie
<programlisting>doormand_flags=""</programlisting> in seiner
<filename>rc.conf.local</filename>-Datei stehen haben, und
eine Variablenzuweisung mittels &quot;:=&quot; würde in
diesem Fall die Benutzerdefinition überschreiben.</para>
<note>
<para>Es sollten keine weiteren Skripten mit der
<filename>.sh</filename>-Endung hinzugefügt werden.
Irgendwann wird es ein Massenumbenennen aller Skripten im
Repository geben, die immer noch diese Endung haben.</para>
</note>
<sect2>
<title>Anhalten und Deinstallieren von Diensten</title>
<para>Es ist möglich, dass ein Dienst während der
Deinstallation automatisch angehalten wird. Es wird
empfohlen dieses Verhalten nur zu implementieren, wenn es
unbedingt erforderlich ist zuerst den Dienst anzuhalten und
dann die Dateien zu entfernen. Normalerweise sollte es dem
Administrator überlassen werden, ob ein Dienst durch
Deinstallieren angehalten werden soll. Dies betrifft auch
den Vorgang des Aktualisierens.</para>
<para>Der Datei <filename>pkg-plist</filename> sollte eine
Zeile wie folgt zugefügt werden:</para>
<programlisting>@stopdaemon doormand</programlisting>
<para>Das Argument muss dabei mit dem Inhalt der
<makevar>USE_RC_SUBR</makevar>-Variablen
übereinstimmen.</para>
</sect2>
</sect1>
<sect1 id="users-and-groups">
<title>Hinzufügen von Benutzern und Gruppen</title>
<para>Manche Ports setzen voraus, dass ein bestimmter Benutzer
auf dem System angelegt ist. Wählen Sie in einem solchen
Fall eine freie Kennnummer zwischen 50 und 999 aus und tragen
Sie diese in <filename>ports/UIDs</filename> (für
Benutzer) oder <filename>ports/GIDs</filename> (für
Gruppen) ein. Stellen Sie dabei sicher, dass Sie keine
Kennnummer auswählen, die bereits vom System oder von
anderen Ports verwendet wird.</para>
<para>Erstellen Sie bitte eine entsprechende Patch-Datei
für diese beiden Dateien, wenn für Ihren Port ein
neuer Benutzer oder eine neue Gruppe angelegt werden
muss.</para>
<para>Sie können dann die Variablen
<makevar>USERS</makevar> und <makevar>GROUPS</makevar> im
<filename>Makefile</filename> benutzen, um bei der
Port-Installation das automatische Anlegen des Benutzers zu
veranlassen.</para>
<programlisting>USERS= pulse
GROUPS= pulse pulse-access pulse-rt</programlisting>
<para>Die Liste mit den momentan belegten UIDs (GIDs) befindet
sich in <filename>ports/UIDs</filename>
(<filename>ports/GIDs</filename>).</para>
</sect1>
<sect1>
<title>Von Kernelquellen abhängige Ports</title>
<para>Einige Ports (beispielsweise vom Kernel ladbare Module)
benötigen die Kernelsourcen, damit sie gebaut werden
können. Die folgenden Zeilen beschreiben den korrekten
Weg, wie Sie feststellen können, ob der Benutzer die
Kernelsourcen installiert hat:</para>
<programlisting>.if !exists(${SRC_BASE}/sys/Makefile)
IGNORE= requires kernel sources to be installed
.endif</programlisting>
</sect1>
</chapter>
<chapter id="plist">
<title>Fortgeschrittene
<filename>pkg-plist</filename>-Methoden</title>
<sect1 id="plist-sub">
<title>Änderungen an <filename>pkg-plist</filename> mit
Hilfe von make-Variablen</title>
<para>Einige Ports, insbesondere die
<literal>p5-</literal>-Ports, müssen, abhängig von
ihren Konfigurationsoptionen (oder im Falle der p5-Ports von
der <literal>perl</literal>-Version), die
<filename>pkg-plist</filename> verändern. Um dies zu
vereinfachen, werden für jeden Eintrag in
<filename>pkg-plist</filename> die Variablen
<literal>%%OSREL%%</literal>, <literal>%%PERL_VER%%</literal>
und <literal>%%PERL_VERSION%%</literal> durch die jeweiligen
Werte ersetzt. Der Wert von <literal>%%OSREL%%</literal> ist
die Revisionsnummer des Betriebssystems (z.B.
<literal>4.9</literal>). <literal>%%PERL_VERSION%%</literal>
und <literal>%%PERL_VER%%</literal> geben die
vollständige Versionsnummer von <command>perl</command>
(z.B. <literal>5.8.9</literal>) an. Weitere, die
Dokumentationsdateien des Ports betreffende
<literal>%%<replaceable>VARS</replaceable>%%</literal>, werden
im <link linkend="install-documentation">entsprechenden
Abschnitt</link> erläutert.</para>
<para>Falls Sie weitere Ersetzungen von Variablen
durchführen müssen, können Sie in der Variable
<makevar>PLIST_SUB</makevar> eine Liste von
<literal><replaceable>VAR</replaceable>=<replaceable>VALUE</replaceable></literal>-Paaren
angeben, wobei in der <filename>pkg-plist</filename>
<literal>%%<replaceable>VAR</replaceable>%%</literal> durch
<replaceable>VALUE</replaceable> ersetzt wird.</para>
<para>Wenn Sie z.B. einen Port haben, der viele Dateien in ein
versionsspezifisches Unterverzeichnis installiert, dann
können Sie etwas wie</para>
<programlisting>OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting>
<para>in das <filename>Makefile</filename> schreiben und
<literal>%%OCTAVE_VERSION%%</literal> verwenden,
unabhängig davon, wo die Variable in
<filename>pkg-plist</filename> verwendet wird. In diesem Fall
müssen Sie bei einem Upgrade des Ports nicht dutzende
(oder manchmal sogar hunderte) Zeilen in
<filename>pkg-plist</filename> anpassen.</para>
<para>Falls Ihr Port in Abhängigkeit von den
ausgewählten Optionen Dateien installiert, ist es
üblich, den entsprechenden Zeilen in der
<filename>pkg-plist</filename> eine Zeichenfolge
<literal>%%TAG%%</literal> voranzustellen, wobei der
Platzhalter <literal>TAG</literal> der Variablen
<makevar>PLIST_SUB</makevar> im <filename>Makefile</filename>
bei gleichzeitiger Zuweisung des speziellen Werts
<literal>@comment</literal> hinzugefügt wird, der die
Paket-Werkzeuge die Zeile ignorieren lässt:</para>
<programlisting>.if defined(WITH_X11)
PLIST_SUB+= X11=""
.else
PLIST_SUB+= X11="@comment "
.endif</programlisting>
<para>und in der <filename>pkg-plist</filename>:</para>
<programlisting>%%X11%%bin/foo-gui</programlisting>
<para>Diese Ersetzung (ebenso wie das Hinzufügen weiterer
<link linkend="makefile-manpages">Manualpages</link>) wird
zwischen den <maketarget>pre-install</maketarget>- und
<maketarget>do-install</maketarget>-Targets ausgeführt,
indem aus <filename><makevar>PLIST</makevar></filename>
gelesen und in
<filename><makevar>TMPPLIST</makevar></filename> geschrieben
wird (Standard:
<filename><makevar>WRKDIR</makevar>/.PLIST.mktmp</filename>).
Falls Ihr Port also
<filename><makevar>PLIST</makevar></filename> während dem
Erstellen generiert, so sollte dies vor oder in
<maketarget>pre-install</maketarget> geschehen. Muss Ihr Port
die resultierende Datei verändern, so sollte dies in
<maketarget>post-install</maketarget> mit der Ausgabedatei
<filename><makevar>TMPPLIST</makevar></filename>
erfolgen.</para>
<para>Eine weitere Möglichkeit, die Paketliste eines
Ports zu verändern, besteht darin die Variablen
<makevar>PLIST_FILES</makevar> und
<makevar>PLIST_DIRS</makevar> zu setzen. Der Wert jeder der
beiden Variablen stellt eine Liste von Pfadnamen dar, die
zusammen mit dem Inhalt von
<filename><makevar>PLIST</makevar></filename> in
<filename><makevar>TMPPLIST</makevar></filename> geschrieben
wird. Dabei unterliegen die Namen in
<makevar>PLIST_FILES</makevar> und
<makevar>PLIST_DIRS</makevar> der weiter oben beschriebenen
Substitution von
<literal>%%<replaceable>VAR</replaceable>%%</literal>. Die
Namen aus <makevar>PLIST_FILES</makevar> werden ansonsten
unverändert in die endgültige Paketliste
übernommen, während den Namen aus
<makevar>PLIST_DIRS</makevar> noch der Wert von
<literal>@dirrm</literal> vorangestellt wird. Damit die
Verwendung von <makevar>PLIST_FILES</makevar> und
<makevar>PLIST_DIRS</makevar> überhaupt möglich
ist, müssen diese gesetzt werden, bevor
<filename><makevar>TMPPLIST</makevar></filename> geschrieben
wird&nbsp;&ndash;&nbsp;z.B. in
<maketarget>pre-install</maketarget> oder vorher.</para>
</sect1>
<sect1 id="plist-cleaning">
<title>Leere Verzeichnisse</title>
<sect2 id="plist-dir-cleaning">
<title>Aufräumen leerer Verzeichnisse</title>
<para>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
<literal>@dirrm</literal>-Zeile angegeben. Um ein
Verzeichnis zu löschen müssen Sie zuerst dessen
Unterverzeichnisse entfernen.</para>
<programlisting> :
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</programlisting>
<para>Es kann allerdings auch vorkommen, dass
<literal>@dirrm</literal> Fehler ausgibt, da andere Ports
ein Verzeichnis ebenfalls nutzen. Deshalb können Sie
<literal>@dirrmtry</literal> verwenden, um nur Verzeichnisse
zu löschen, die wirklich leer sind, und damit
Warnhinweise vermeiden.</para>
<programlisting>@dirrmtry share/doc/gimp</programlisting>
<para>Dadurch wird es weder eine Fehlermeldung geben noch
wird &man.pkg.delete.1; abnormal beendet werden - auch dann
nicht, wenn
<filename><makevar>${PREFIX}</makevar>/share/doc/gimp</filename>
nicht leer ist, da andere Ports hier ebenfalls Dateien
installiert haben.</para>
</sect2>
<sect2 id="plist-dir-empty">
<title>Erstellen leerer Verzeichnisse</title>
<para>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
&man.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
<filename>pkg-plist</filename> über der entsprechenden
<literal>@dirrm</literal> Zeile eingetragen werden:</para>
<programlisting>@exec mkdir -p %D/share/foo/templates</programlisting>
</sect2>
</sect1>
<sect1 id="plist-config">
<title>Konfigurationsdateien</title>
<para>Sollte Ihr Port Konfigurationsdateien in
<filename><makevar>PREFIX</makevar>/etc</filename>
benötigen, so sollten Sie diese
<emphasis>nicht</emphasis> einfach installieren und in
<filename>pkg-plist</filename> auflisten. Dies würde
&man.pkg.delete.1; veranlassen, diese Dateien zu löschen,
selbst wenn wenn sie vom Benutzer editiert wurden.</para>
<para>Stattdessen sollten Beispieldateien mit einem
entsprechenden Suffix (beispielsweise
<filename><replaceable>filename</replaceable>.sample</filename>)
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
<filename>Makefile</filename> des Ports als auch in der
<filename>pkg-plist</filename> (für die Installation aus
einem Paket) sichergestellt werden.</para>
<para>Beispiel aus einem <filename>Makefile</filename>:</para>
<programlisting>post-install:
@if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \
fi</programlisting>
<para>Beispiel aus einer <filename>pkg-plist</filename>:</para>
<programlisting>@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</programlisting>
<para>Wahlweise können Sie auch eine <link
linkend="porting-message">Nachricht</link> 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.</para>
</sect1>
<sect1 id="plist-dynamic">
<title>Dynamische oder statische Paketliste</title>
<para>Eine <emphasis>statische Paketliste</emphasis> ist eine
Paketliste, die in der Ports-Sammlung, entweder in Form der
<filename>pkg-plist</filename> (mit oder ohne der Ersetzung
von Variablen) oder durch <makevar>PLIST_FILES</makevar> und
<makevar>PLIST_DIRS</makevar> im <filename>Makefile</filename>
eingebettet, verfügbar ist. Selbst wenn der Inhalt durch
ein Werkzeug oder ein Target im Makefile automatisch erzeugt
wird, <emphasis>bevor</emphasis> 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.</para>
<para>Eine <emphasis>dynamische Paketliste</emphasis> 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 <literal>make clean</literal> ausgeführt
wurde.</para>
<para>Der Einsatz dynamischer Paketlisten ist zwar nicht
untersagt, aber Sie sollten, wann immer das möglich ist,
statische Paketlisten verwenden, da die Nutzer dann
&man.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 <application>Javadoc</application>
erzeugen).</para>
<para>Maintainer, die dynamische Paketlisten bevorzugen,
werden dazu aufgefordert, neue Targets zu Ihren Ports
hinzuzufügen, welche die
<filename>pkg-plist</filename>-Datei erzeugen, sodass Benutzer
den Inhalt überprüfen können.</para>
</sect1>
<sect1 id="plist-autoplist">
<title>Automatisiertes Erstellen von Paketlisten</title>
<para>Als Erstes sollten Sie sich vergewissern, dass der Port
bis auf <filename>pkg-plist</filename> vollständig
ist.</para>
<para>Als Nächstes erstellen Sie einen temporären
Verzeichnisbaum, in welchem Ihr Port installiert werden kann,
und installieren Sie alle Abhängigkeiten.</para>
<screen>&prompt.root; <userinput>mkdir /var/tmp/`make -V PORTNAME`</userinput>
&prompt.root; <userinput>mtree -U -f `make -V MTREE_FILE` -d -e -p /var/tmp/`make -V PORTNAME`</userinput>
&prompt.root; <userinput>make depends PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<para>Speichern Sie die Verzeichnisstruktur in einer neuen
Datei.</para>
<screen>&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` &amp;&amp; find -d * -type d) | sort &gt; OLD-DIRS</userinput></screen>
<para>Erstellen Sie eine leere
<filename>pkg-plist</filename>-Datei:</para>
<screen>&prompt.root; <userinput>:&gt;pkg-plist</userinput></screen>
<para>Wenn Ihr Port auf <makevar>PREFIX</makevar> achtet (was
er machen sollte), so kann der Port nun installiert und die
Paketliste erstellt werden.</para>
<screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/`make -V PORTNAME`</userinput>
&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` &amp;&amp; find -d * \! -type d) | sort &gt; pkg-plist</userinput></screen>
<para>Sie müssen auch alle neu erstellten Verzeichnisse in
die Paketliste aufnehmen.</para>
<screen>&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` &amp;&amp; find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' &gt;&gt; pkg-plist</userinput></screen>
<para>Zu guter Letzt muss die Paketliste noch manuell
aufgeräumt werden - es funktioniert eben nicht
<emphasis>alles</emphasis> automatisch. Manualpages sollten im
<filename>Makefile</filename> des Ports unter
<makevar>MAN<replaceable>n</replaceable></makevar>
aufgeführt sein und nicht in der Paketliste.
Konfigurationsdateien des Benutzers sollten entfernt oder als
<filename><replaceable>filename</replaceable>.sample</filename>
installiert werden. Die <filename>info/dir</filename>-Datei
sollte nicht aufgeführt sein und die zugehörigen
<filename>install-info</filename>-Zeilen sollten
hinzugefügt werden, wie im <link
linkend="makefile-info">info files</link>-Abschnitt
beschrieben. Alle Bibliotheken, die der Port installiert,
sollten aufgelistet werden, wie es im <link
linkend="porting-shlibs">Shared Libraries</link>-Abschnitt
festgelegt ist.</para>
<para>Alternativ dazu können Sie das
<command>plist</command>-Skript in
<filename>/usr/ports/Tools/scripts/</filename> verwenden, um
die Paketliste automatisch zu erstellen. Das
<filename>plist</filename>-Skript ist ein
<application>Ruby</application>-Skript, das die meisten der in
den vorangehenden Absätzen kurz dargestellten manuellen
Schritte automatisiert.</para>
<para>Der erste Schritt ist
derselbe wie oben: Nehmen Sie die ersten drei Zeilen, also
<command>mkdir</command>, <command>mtree</command> und
<command>make depends</command>. Installieren und bauen Sie
dann den Port:</para>
<screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<para>Und lassen Sie <command>plist</command> die
<filename>pkg-plist</filename>-Datei erstellen:</para>
<screen>&prompt.root; <userinput>/usr/ports/Tools/scripts/plist -Md -m `make -V MTREE_FILE` /var/tmp/`make -V PORTNAME` &gt; pkg-plist</userinput></screen>
<para>Die Paketliste muss immer noch von Hand aufgeräumt
werden, wie es oben erklärt wurde.</para>
<para>Ein weiteres Werkzeug zur Erzeugung einer ersten
<filename>pkg-plist</filename>-Datei ist <filename
role="package">ports-mgmt/genplist</filename>. Wie bei jedem
automatisierten Hilfswerkzeug, sollte die erzeugte
<filename>pkg-plist</filename>-Datei überprüft und
bei Bedarf von Hand nachbearbeitet werden.</para>
</sect1>
</chapter>
<chapter id="pkg-files">
<title>Die <filename>pkg-<replaceable>*</replaceable></filename>
Dateien</title>
<para>Es gibt noch einige Tricks mit
<filename>pkg-<replaceable>*</replaceable></filename>, die wir
noch nicht erwähnt haben, die aber oft sehr praktisch
sind.</para>
<sect1 id="porting-message">
<title><filename>pkg-message</filename></title>
<para>Wenn Sie dem Anwender bei der Installation weitere
Informationen anzeigen wollen, so können Sie diese
Nachricht in <filename>pkg-message</filename> speichern.
Diese Vorgehensweise ist oft nützlich, um
zusätzliche Schritte anzuzeigen, die nach &man.pkg.add.1;
durchgeführt werden müssen. Dadurch können Sie
auch Lizenzinformationen darstellen.</para>
<para>Wollen Sie nur ein paar Zeilen über die
Einstellungen zum Erstellen des Ports oder Warnungen ausgeben,
benutzen Sie <makevar>ECHO_MSG</makevar>.
<filename>pkg-message</filename> ist nur für Schritte
nach der Installation vorgesehen. Sie sollten den Unterschied
zwischen <makevar>ECHO_MSG</makevar> und
<makevar>ECHO_CMD</makevar> beachten: Ersteres wird benutzt,
um Informationen auf dem Bildschirm auszugeben, während
Letzteres für Kommando-Pipelining bestimmt ist.</para>
<para>Ein gutes Beispiel für die Benutzung der beiden
Befehle ist in <filename>shells/bash2/Makefile</filename> zu
finden:</para>
<programlisting>update-etc-shells:
@${ECHO_MSG} "updating /etc/shells"
@${CP} /etc/shells /etc/shells.bak
@( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \
${ECHO_CMD} ${PREFIX}/bin/bash) &gt;/etc/shells
@${RM} /etc/shells.bak</programlisting>
<note>
<para>Die <filename>pkg-message</filename> wird nicht zur
<filename>pkg-plist</filename> hinzugefügt. Sie wird
auch nicht automatisch angezeigt, falls ein Anwender den
Port installiert. Sie müssen also die Ausgabe selbst im
<maketarget>post-install</maketarget>-Ziel des Make-Vorgangs
veranlassen.</para>
</note>
</sect1>
<sect1 id="pkg-install">
<title><filename>pkg-install</filename></title>
<para>Sollte es nötig sein, dass Ihr Port bei der
Installation des Binärpakets mit &man.pkg.add.1; Befehle
ausführt, können Sie das Skript
<filename>pkg-install</filename> benutzen. Dieses Skript wird
automatisch dem Paket hinzugefügt und zweimal von
&man.pkg.add.1; ausgeführt: Zuerst als
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME}
PRE-INSTALL</literal> und beim zweiten Mal als
<literal>&dollar;{SH} pkg-install &dollar;{PKGNAME}
POST-INSTALL</literal>. <literal>&dollar;2</literal> kann also
getestet werden, um festzustellen, in welchem Modus das Skript
ausgeführt wird. Die Umgebungsvariable
<envar>PKG_PREFIX</envar> wird auf das Verzeichnis gesetzt, in
welches das Paket installiert wird. Siehe &man.pkg.add.1;
für weiterführende Informationen.</para>
<note>
<para>Das Skript wird nicht automatisch ausgeführt,
wenn Sie den Port mit <command>make install</command>
installieren. Wenn Sie es ausführen lassen wollen, dann
müssen Sie es im Makefile aufrufen:
<literal>PKG_PREFIX=&dollar;{PREFIX} &dollar;{SH}
&dollar;{PKGINSTALL} &dollar;{PKGNAME}
PRE-INSTALL.</literal></para>
</note>
</sect1>
<sect1 id="pkg-deinstall">
<title><filename>pkg-deinstall</filename></title>
<para>Dieses Skript wird ausgeführt, wenn ein Paket
deinstalliert wird.</para>
<para>Es wird zweimal von &man.pkg.delete.1; aufgerufen. Das
erste Mal als <literal>&dollar;{SH} pkg-deinstall
&dollar;{PKGNAME} DEINSTALL</literal> und dann als
<literal>&dollar;{SH} pkg-deinstall &dollar;{PKGNAME}
POST-DEINSTALL.</literal></para>
</sect1>
<sect1 id="pkg-req">
<title><filename>pkg-req</filename></title>
<para>Muss Ihr Port entscheiden, ob er installiert werden
soll oder nicht, können Sie ein
<filename>pkg-req</filename>-<quote>Bedingungsskript</quote>
verwenden. Dieses wird automatisch bei der Installation/
Deinstallation aufgerufen, um zu entscheiden, ob die
Installation/ Deinstallation fortgesetzt werden soll.</para>
<para>Das Skript wird während der Installation von
&man.pkg.add.1; als <literal>pkg-req &dollar;{PKGNAME}
INSTALL</literal> aufgerufen. Bei der Deinstallation wird es
von &man.pkg.delete.1; als <literal>pkg-req &dollar;{PKGNAME}
DEINSTALL</literal> ausgeführt.</para>
</sect1>
<sect1 id="pkg-names">
<title id="porting-pkgfiles">Ändern der Namen der
<filename>pkg-<replaceable>*</replaceable></filename>
Dateien</title>
<!-- Hier muss noch mal überarbeitet werden -->
<para>Alle Namen der
<filename>pkg-<replaceable>*</replaceable></filename> Dateien
werden durch Variablen festgelegt. Sie können sie bei
Bedarf also im <filename>Makefile</filename> des Ports
ändern. Das ist besonders nützlich, wenn Sie die
gleichen <filename>pkg-<replaceable>*</replaceable></filename>
Dateien in mehreren Ports nutzen oder in eine der oben genannten
Dateien schreiben wollen. Schreiben Sie niemals außerhalb
des Unterverzeichnisses <makevar>WRKDIR</makevar>
<filename>pkg-*</filename>, eine Erklärung hierzu finden
Sie in <link linkend="porting-wrkdir"> Schreiben ausserhalb von
<makevar>WRKDIR</makevar></link>.</para>
<para>Hier ist eine Liste von Variablennamen und ihren
Standardwerten (<makevar>PKGDIR</makevar> ist
standardmäßig
<makevar>&dollar;{MASTERDIR}</makevar>).</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Standardwert</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>DESCR</makevar></entry>
<entry><literal>${PKGDIR}/pkg-descr</literal></entry>
</row>
<row>
<entry><makevar>PLIST</makevar></entry>
<entry><literal>${PKGDIR}/pkg-plist</literal></entry>
</row>
<row>
<entry><makevar>PKGINSTALL</makevar></entry>
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
</row>
<row>
<entry><makevar>PKGDEINSTALL</makevar></entry>
<entry><literal>${PKGDIR}/pkg-deinstall</literal></entry>
</row>
<row>
<entry><makevar>PKGREQ</makevar></entry>
<entry><literal>${PKGDIR}/pkg-req</literal></entry>
</row>
<row>
<entry><makevar>PKGMESSAGE</makevar></entry>
<entry><literal>${PKGDIR}/pkg-message</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Bitte benutzen Sie diese Variablen anstatt
<makevar>PKG_ARGS</makevar> zu ändern. Wenn Sie
<makevar>PKG_ARGS</makevar> modifizieren, werden diese Dateien
bei der Installation des Ports nicht korrekt in
<filename>/var/db/pkg</filename> installiert.</para>
</sect1>
<sect1 id="using-sub-files">
<title>Nutzung von <makevar>SUB_FILES</makevar> und
<makevar>SUB_LIST</makevar></title>
<para>Die Variablen <makevar>SUB_FILES</makevar> und
<makevar>SUB_LIST</makevar> sind nützlich, um dynamische
Werte in Port-Dateien zu verwenden, wie beispielsweise der
Installations-<makevar>PREFIX</makevar> in
<filename>pkg-message</filename>.</para>
<para>Die Variable <makevar>SUB_FILES</makevar> enthält
eine Liste von Dateien, die automatisch verändert werden.
Jede <replaceable>Datei</replaceable> in
<makevar>SUB_FILES</makevar> muss ein entsprechendes Pendant
<replaceable>datei.in</replaceable> im Verzeichnis
<makevar>FILESDIR</makevar> haben. Die modifizierte Version
wird in <makevar>WRKDIR</makevar> angelegt. Dateien, die als
Werte von <makevar>USE_RC_SUBR</makevar> (oder veraltet in
<makevar>USE_RCORDER</makevar>) gespeichert werden, werden
automatisch zu <makevar>SUB_FILES</makevar> hinzugefügt.
Für die Dateien <filename>pkg-message</filename>,
<filename>pkg-install</filename>,
<filename>pkg-deinstall</filename> und
<filename>pkg-req</filename> werden die jeweiligen
Makefile-Variablen selbsttätig auf die geänderte
Version der Datei gesetzt.</para>
<para>Die Variable <makevar>SUB_LIST</makevar> ist eine Liste
von <literal>VAR=WERT</literal>-Paaren. Jedes Paar
<literal>%%VAR%%</literal> in den Dateien von
<makevar>SUB_FILES</makevar> wird mit <literal>WERT</literal>
ersetzt. Einige gebräuchliche Paare werden automatisch
definiert: <makevar>PREFIX</makevar>,
<makevar>LOCALBASE</makevar>,
<makevar>DATADIR</makevar>, <makevar>DOCSDIR</makevar>,
<makevar>EXAMPLESDIR</makevar>. Jede Zeile, die mit
<literal>@comment</literal> beginnt, wird nach der
Variablen-Ersetzung aus der neu erstellten Datei
gelöscht.</para>
<para>Im folgenden Beispiel wird <literal>%%ARCH%%</literal>
mit der Systemarchitektur in <filename>pkg-message</filename>
ersetzt:</para>
<programlisting>SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}</programlisting>
<para>Beachten Sie bitte, dass in diesem Beispiel die Datei
<filename>pkg-message.in</filename> im Verzeichnis
<makevar>FILESDIR</makevar> vorhanden sein muss.</para>
<para>Hier ein Beispiel für eine gute
<filename>pkg-message.in</filename>:</para>
<programlisting>Now it is time to configure this package.
Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.</programlisting>
</sect1>
</chapter>
<chapter id="testing">
<title>Ihren Port testen</title>
<sect1 id="make-describe">
<title><command>make describe</command> ausführen</title>
<para>Einige der &os;-Werkzeuge zur Pflege von Ports, wie zum
Beispiel &man.portupgrade.1;, verwenden eine Datenbank names
<filename>/usr/ports/INDEX</filename>, welche Eigenschaften,
wie z.B. Port-Abhängigkeiten, verfolgt.
<filename>INDEX</filename> wird vom Makefile der höchsten
Ebene, <filename>ports/Makefile</filename>, mittels
<command>make index</command> erstellt, welches in das
Unterverzeichnis jedes Ports wechselt und dort <command>make
describe</command> ausführt. Wenn also <command>make
describe</command> bei einem Port fehlschlägt, kann
<filename>INDEX</filename> nicht generiert werden und schnell
werden viele Leute darüber unzufrieden sein.</para>
<note>
<para>Es ist wichtig diese Datei erzeugen zu können,
unabhängig davon, welche Optionen in
<filename>make.conf</filename> vorhanden sind. Bitte
vermeiden Sie es daher beispielsweise
<literal>.error</literal>-Anweisungen zu benutzen, wenn zum
Beispiel eine Abhängigkeit nicht erfüllt wird
(Lesen Sie dazu bitte <xref
linkend="dads-dot-error"/>).</para>
</note>
<para>Wenn <command>make describe</command> eine Zeichenkette
anstatt einer Fehlermeldung erzeugt, sind Sie wahrscheinlich
auf der sicheren Seite. Vergleichen Sie die erzeugte
Zeichenkette mit <filename>bsd.port.mk</filename>, um mehr
über deren Bedeutung zu erfahren.</para>
<para>Beachten Sie bitte außerdem, dass die Benutzung
einer aktuellen Version von <command>portlint</command> (wie
im nächsten Abschnitt beschrieben) automatisch
<command>make describe</command> startet.</para>
</sect1>
<sect1 id="testing-portlint">
<title>Portlint</title>
<para>Bitte überprüfen Sie Ihre Arbeit stets mit
<link
linkend="porting-portlint"><command>portlint</command></link>,
bevor Sie diese einreichen oder committen.
<command>portlint</command> warnt Sie bei häufigen
Fehlern, sowohl funktionaler als auch stilistischer Natur.
Für einen neuen (oder repokopierten) Port ist
<command>portlint -A</command> die gründlichste Variante;
für einen bereits existierenden Port ist
<command>portlint -C</command> ausreichend.</para>
<para>Da <command>portlint</command> heuristische Methoden zur
Fehlersuche benutzt, kann es vorkommen, dass Warnungen
für Fehler erzeugt werden, die keine sind. Gelegentlich
kann etwas, das als Problem angezeigt wird, aufgrund von
Einschränkungen im Port-System nicht anders gelöst
werden. Wenn es Zweifel gibt, fragen Sie am besten auf
&a.ports; nach.</para>
</sect1>
<sect1 id="testing-porttools">
<title>Port Tools</title>
<para>Das Programm <filename
role="package">ports-mgmt/porttools</filename> ist Teil der
Ports-Sammlung.</para>
<para><command>port</command> ist das Front-End-Skript, das
Ihnen dabei behilflich sein kann Ihre Arbeit als Tester zu
vereinfachen. Um einen neuen Port zu testen oder einen bereits
bestehenden Port zu aktualisieren, können Sie
<command>port test</command> verwenden, damit die Tests,
inklusive der <link
linkend="testing-portlint"><command>portlint</command></link>-Überprüfung,
durchgeführt werden. Dieser Befehl spürt ausserdem
alle nicht in <filename>pkg-plist</filename> enthaltenen
Dateien auf und gibt eine Liste dieser aus. Hier ein
Beispiel:</para>
<screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen>
</sect1>
<sect1 id="porting-prefix">
<title><makevar>PREFIX</makevar> und
<makevar>DESTDIR</makevar></title>
<para><makevar>PREFIX</makevar> bestimmt, an welche Stelle der
Port installiert werden soll. In der Regel ist
dies<filename>/usr/local</filename> oder
<filename>/opt</filename>, was jedoch anpassbar ist. Ihr Port
muss sich an diese Variable halten.</para>
<para><makevar>DESTDIR</makevar>, wenn es vom Benutzer gesetzt
wird, bestimmt die alternative Umgebung (in der Regel eine
Jail oder ein installiertes System, welches an anderer Stelle
als <filename>/</filename> eingehängt ist).
Ein Port wird unter
<makevar>DESTDIR</makevar>/<makevar>PREFIX</makevar>
installiert und registriert sich in der Paket-Datenbank unter
<makevar>DESTDIR</makevar>/var/db/pkg.
Da <makevar>DESTDIR</makevar> mittels eines
&man.chroot.8;-Aufrufs vom Ports-System automatisch gesetzt
wird, brauchen Sie keine Änderungen oder besondere Pflege
für <makevar>DESTDIR</makevar>-konforme Ports.</para>
<para>Der Wert von <makevar>PREFIX</makevar> wird auf
<makevar>LOCALBASE</makevar> gesetzt (Standard ist
<filename>/usr/local</filename>).
Falls <makevar>USE_LINUX_PREFIX</makevar> gesetzt ist, wird
<makevar>PREFIX</makevar> <makevar>LINUXBASE</makevar>
annehmen (Standard ist
<filename>/compat/linux</filename>).</para>
<para>Die Vermeidung der hart kodierten Angaben von
<filename>/usr/local</filename> oder
<filename>/usr/X11R6</filename> im Quelltext wird den Port
viel flexibler machen und erleichtert es die Anforderungen
anderer Einsatzorte zu erfüllen. Für X-Ports, die
<command>imake</command> benutzen, geschieht dies automatisch;
andernfalls kann dies erreicht werden, indem alle Angaben von
<filename>/usr/local</filename> (oder
<filename>/usr/X11R6</filename> für X-Ports, die nicht
imake benutzen) in den verschiedenen
<filename>Makefile</filename>s im Port ersetzt werden, um
<makevar>${PREFIX}</makevar> zu lesen, da diese Variable
automatisch an jede Stufe des Build- und Install-Prozesses
übergeben wird.</para>
<para>Vergewissern Sie sich bitte, dass Ihre Anwendung nichts
unter <filename>/usr/local</filename> an Stelle von
<makevar>PREFIX</makevar> installiert. Um dies festzustellen,
können Sie folgendes machen:</para>
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<para>Wenn etwas außerhalb von <makevar>PREFIX</makevar>
installiert wird, so gibt der Prozess der Paketerstellung eine
Meldung aus, dass es die Dateien nicht finden kann.</para>
<para>Dies prüft nicht das Vorhandensein eines internen
Verweises oder die richtige Verwendung von
<makevar>LOCALBASE</makevar> für Verweise auf Dateien
anderer Ports. Das Testen der Installation in
<filename>/var/tmp/`make -V PORTNAME`</filename> würde
dies erledigen.</para>
<para>Die Variable <makevar>PREFIX</makevar> kann in Ihrem
<filename>Makefile</filename> oder der Umgebung des Benutzers
neu gesetzt werden. Allerdings wird für einzelne Ports
dringend davon abgeraten diese Variable in den
<filename>Makefile</filename>s direkt zu setzen.</para>
<para>Verweisen Sie bitte außerdem auf Programme/Dateien
von anderen Ports durch die oben erwähnten Variablen und
nicht mit den eindeutigen Pfadnamen. Wenn Ihr Port zum
Beispiel vom Makro <literal>PAGER</literal> erwartet, dass es
den vollständigen Pfadnamen von <command>less</command>
enthält, benutzen Sie folgendes Compiler-Flag:
<programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>
anstatt <literal>-DPAGER=\"/usr/local/bin/less\"</literal>.
Somit ist die Wahrscheinlichkeit höher, dass es auch
funktioniert, wenn der Administrator den ganzen
<filename>/usr/local</filename>-Baum an eine andere Stelle
verschoben hat.</para>
</sect1>
<sect1 id="testing-tinderbox">
<title>Die Tinderbox</title>
<para>Wenn Sie ein begeisterter Ports-Entwickler sind
möchten Sie vielleicht einen Blick auf die
<application>Tinderbox</application> werfen. Es ist ein
leistungsstarkes System zur Erstellung und zum Testen von
Ports, welches auf Skripten basiert, die auf <link
linkend="build-cluster">Pointyhat</link> verwendet werden. Sie
können <application>Tinderbox</application> installieren,
indem Sie den Port <filename
role="package">ports-mgmt/tinderbox</filename> benutzen.
Bitte lesen Sie die mitgelieferte Dokumentation
gründlich, da die Konfiguration nicht einfach ist.</para>
<para>Um Näheres darüber zu erfahren, besuchen Sie
bitte die <ulink
url="http://tinderbox.marcuscom.com/">Tinderbox
Homepage</ulink>.</para>
</sect1>
</chapter>
<chapter id="port-upgrading">
<title>Einen existierenden Port aktualisieren</title>
<para>Wenn Sie feststellen, dass ein Port verglichen mit der
neuesten Version des Originalautors nicht mehr auf dem aktuellen
Stand ist, sollten Sie als Erstes sicherstellen, dass Sie die
aktuellste Version des Ports haben. Diese finden Sie im
Verzeichnis <filename>ports/ports-current</filename> der FreeBSD
FTP-Spiegelseiten. Wenn Sie allerdings mit mehr als ein paar
Ports arbeiten, werden Sie es wahrscheinlich einfacher finden
<application>CVSup</application> zu benutzen, um Ihre gesamte
Ports-Sammlung aktuell zu halten, wie es im <ulink
url="&url.books.handbook;/synching.html#CVSUP-CONFIG">Handbuch</ulink>
beschrieben wird. Das hat zusätzlich den Vorteil, dass Sie
so auch alle Abhängigkeiten des Ports aktuell
halten.</para>
<para>Der nächste Schritt besteht darin festzustellen, ob
bereits eine Aktualisierung des Ports darauf wartet committet zu
werden. Um das sicherzustellen haben Sie folgende
Möglichkeiten. Es gibt eine durchsuchbare Schnittstelle zur
<ulink
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">FreeBSD
Problembericht Datenbank (PR - Problem Report)</ulink> (auch
bekannt als <literal>GNATS</literal>). Wählen Sie dazu
<literal>Ports</literal> im Drop-Down-Menü und geben Sie
den Namen des Ports ein.</para>
<para>Allerdings wird manchmal vergessen den Namen des Ports
eindeutig im Feld für die Zusammenfassung anzugeben. In
diesem Fall können Sie das <link linkend="portsmon">FreeBSD
Ports Monitoring System</link> (auch bekannt als
<literal>portsmon</literal>) nutzen. Dieses versucht PRs von
Ports nach Portname zu sortieren. Um PRs nach einem bestimmten
Port zu durchsuchen können Sie die <ulink
url="http://portsmon.FreeBSD.org/portoverview.py">Übersicht
eines Ports</ulink> verwenden.</para>
<para>Wenn es keine wartenden PRs gibt, ist der nächste
Schritt eine E-Mail an den Maintainer des Ports zu schicken, wie
von <command>make maintainer</command> gezeigt wird. Diese
Person arbeitet vielleicht schon an einer Aktualisierung, oder
hat einen guten Grund den Port im Moment nicht zu aktualisieren
(z.B. wegen Stabilitätsproblemen der neuen Version). Sie
wollen sicher nicht die Arbeit des Maintainers doppelt machen.
Beachten Sie bitte, dass für Ports ohne Maintainer
<literal>ports@FreeBSD.org</literal> eingetragen ist. Das ist
nur die allgemeine &a.ports;-Mailingliste, deshalb wird es in
diesem Fall wahrscheinlich nicht helfen eine E-Mail dorthin zu
schicken.</para>
<para>Wenn Sie der Maintainer bittet die Aktualisierung zu
erledigen, oder falls es keinen Maintainer gibt, haben Sie
Gelegenheit, FreeBSD zu helfen, indem Sie die Aktualisierung
selbst bereitstellen. Dazu verwenden Sie &man.diff.1;, das
bereits im Basissystem enthalten ist.</para>
<para>Um einen brauchbaren <command>diff</command> für einen
einzelne Datei zu erstellen, kopieren Sie die zu patchende
Datei nach <replaceable>dateiname.orig</replaceable> und speichern
Ihre Änderungen in die Datei
<replaceable>dateiname</replaceable>. Danach erzeugen Sie den
Patch:</para>
<informalexample>
<screen>&prompt.user; <userinput>/usr/bin/diff dateiname.orig dateiname > dateiname.diff</userinput></screen>
</informalexample>
<para>Soll mehr als eine Datei gepatcht werden, können Sie
entweder <command>cvs diff</command> verwenden (siehe dazu <xref
linkend="cvs-diff"/>) oder Sie kopieren
den kompletten Port in ein neues Verzeichnis und speichern die
Ausgabe des rekursiven &man.diff.1; auf das neue und alte
Portverzeichniss (wenn Ihr verändertes Portverzeichnis z.B.
<filename>superedit</filename> und das Original
<filename>superedit.bak</filename> heißt, dann speichern
Sie bitte die Ergebnisse von <command>diff -ruN superedit.bak
superedit</command>). Sowohl vereinheitlichendes als auch
kontextabhängiges diff (Auflistung der Unterschiede zweier
Dateien) sind akzeptabel, aber im Allgemeinen bevorzugen
Port-Committer vereinheitlichende <command>diff</command>s.
Bitte beachten Sie die Verwendung der
<literal>-N</literal>-Option. Dies ist der gebräuchliche
Weg <command>diff</command> dazu zu bewegen korrekt damit
umzugehen, neue Dateien anzulegen und alte zu löschen.
Bevor Sie das diff einsenden überprüfen Sie bitte die
Ausgabe, um sicherzugehen, dass die Änderungen sinnvoll
sind. Stellen Sie insbesondere sicher, dass Sie das
Arbeitsverzeichnis mit <command>make clean</command>
aufgerät haben).</para>
<para>Um gängige Operationen mit Korrekturdateien zu
vereinfachen, können Sie
<filename>/usr/ports/Tools/scripts/patchtool.py</filename>
benutzen. Aber lesen Sie bitte vorher
<filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para>
<para>Falls der Port keinen Maintainer hat und Sie ihn selbst
aktiv benutzen, ziehen Sie bitte in Erwägung sich als
Maintainer zu melden. &os; hat mehr als 4000 Ports ohne
Maintainer und in diesem Bereich werden immer zusätzliche
Freiwillige benötigt (Für eine ausführliche
Beschreibung der Verantwortlichkeiten eines Maintainers lesen
Sie bitte im <ulink
url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">
Developer's Handbook</ulink> nach).</para>
<para>Der beste Weg uns das diff zu schicken ist mittels
&man.send-pr.1; (Kategorie Ports). Wenn Sie der Maintainer des
Ports sind, fügen Sie bitte <literal>[maintainer
update]</literal> an den Anfang Ihrer Zusammenfassung und setzen
Sie die <quote>Klasse</quote> des PR auf
<literal>maintainer-update</literal>. Ansonsten sollte die
<quote>Klasse</quote> des PR <literal>change-request</literal>
sein. Bitte erwähnen Sie alle hinzugefügten oder
gelöschten Dateien in der Nachricht, da diese beim Commit
ausdrücklich an &man.cvs.1; übergeben werden
müssen. Wenn das diff größer ist als 20 Kilobyte
komprimieren und uuencoden Sie es bitte. Ansonsten können
Sie es in den PR einfügen wie es ist.</para>
<para>Bevor Sie den PR mit &man.send-pr.1; abschicken, sollten
Sie den Abschnitt <ulink
url="&url.articles.problem-reports;/pr-writing.html"> Den
Problembericht schreiben</ulink> im Artikel über
Problemberichte lesen. Dieser enthält sehr viel mehr
Informationen darüber, wie man nützliche
Problemberichte verfasst.</para>
<important>
<para>Wenn Sie Ihre Aktualisierung aufgrund von
Sicherheitsbedenken oder eines schwerwiegenden Fehlers
bereitstellen wollen, informieren Sie bitte das &a.portmgr;,
um einen sofortigen Rebuild und eine Neuverteilung des Pakets
Ihres Ports durchzuführen. Sonst werden ahnungslose
Nutzer von &man.pkg.add.1; über mehrere Wochen die alte
Version durch <command>pkg_add -r</command>
installieren.</para>
</important>
<note>
<para>Noch einmal: Bitte verwenden Sie &man.diff.1; und nicht
&man.shar.1;, um Aktualisierungen existierender Ports zu
senden. Sie erleichtern es damit den Ports-Committern,
Ihre Änderungen nachzuvollziehen.</para>
</note>
<para>Nun, da Sie all das geschafft haben, können Sie in <xref
linkend="keeping-up"/> nachlesen, wie Sie den Port
aktuell halten.</para>
<sect1 id="cvs-diff">
<title>Patches mit CVS erstellen</title>
<para>Wenn möglich, sollten Sie stets eine &man.cvs.1;-Differenz
einreichen. Diese sind leichter zu bearbeiten als Differenzen
zwischen <quote>neuen und alten</quote> Verzeichnissen. Außerdem
könenn Sie so einfacher feststellen, welche Änderungen Sie
vorgenommen haben oder Ihren Patch modifizieren, falls dies durch
Änderungen in einem anderen Bereich der Ports-Sammlung notwendig
wird oder Sie vom Committer um eine Korrektur Ihres Patches gebeten
werden.</para>
<screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co id="my-wrkdir"/>
&prompt.user; <userinput>cvs -d R_CVSROOT co pdnsd</userinput> <co id="R-CVSROOT"/> <co id="module-name"/>
&prompt.user; <userinput>cd ~/my_wrkdir/pdnsd</userinput></screen>
<calloutlist>
<callout arearefs="my-wrkdir">
<para>Das Verzeichnis, in dem Sie den Port bauen wollen. Dieses
Arbeitsverzeichnis kann sich auch außerhalb von
<filename class="directory">/usr/ports/</filename> befinden.</para>
</callout>
<callout arearefs="R-CVSROOT">
<para>R_CVSROOT steht für einen öffentlichen CVS-Server.
Eine Liste aller verfügbaren Server finden Sie im <ulink
url="&url.books.handbook;/cvsup.html">&os; Handbuch</ulink>.</para>
</callout>
<callout arearefs="module-name">
<para>Ersetzen Sie <quote>pdnsd</quote> durch den Modulnamen des
Ports. Dieser entspricht in der Regel dem Namen des Ports.
Allerdings gibt es einige Ausnahmen von dieser Regel, insbesondere
bei sprachspezifischen Ports (beispielsweise lautet der Modulname
für den Port <filename role="package">german/selfhtml</filename>
de-selfhtml). Um den Namen des Moduls herauszufinden, können
Sie entweder die <ulink
url="&url.base;/cgi/cvsweb.cgi/ports">cvsweb-Schnittstelle</ulink>
verwenden oder den kompletten Pfad des Ports angeben (in unserem
Beispiel wäre der komplette Pfad also <filename
class="directory">ports/dns/pdnsd</filename>).</para>
</callout>
</calloutlist>
<para>Danach modifizieren Sie den Port in gewohnter Weise. Falls Sie
Dateien hinzufügen oder entfernen, sollten Sie dies mit
<command>cvs</command> protokollieren:</para>
<screen>&prompt.user; <userinput>cvs add new_file</userinput>
&prompt.user; <userinput>cvs remove deleted_file</userinput></screen>
<para>Überprüfen Sie die Funktion Ihres Ports anhand der
Checklisten in <xref linkend="porting-testing"/> und
<xref linkend="porting-portlint"/>.</para>
<screen>&prompt.user; <userinput>cvs status</userinput>
&prompt.user; <userinput>cvs update</userinput> <co id="cvs-update"/></screen>
<calloutlist>
<callout arearefs="cvs-update">
<para>Dadurch wird versucht, die Differenz zwischen Ihrer
geänderten Version und dem aktuellen Stand im CVS zu
kombinieren. Achten Sie dabei unbedingt auf die Ausgabe dieses
Befehls. Vor jeder Datei wird ein Buchstabe angezeigt, der
Ihnen mitteilt, was mit dieser Datei passiert ist. Eine
vollständige Liste dieser Präfixe finden Sie in
<xref linkend="table-cvs-up"/>.</para>
</callout>
</calloutlist>
<table pgwide="1" frame="none" id="table-cvs-up">
<title>Von cvs update verwendete Präfixe</title>
<tgroup cols="2">
<tbody>
<row>
<entry>U</entry>
<entry>Die Datei wurde aktualisiert. Es traten dabei keine
Probleme auf.</entry>
</row>
<row>
<entry>P</entry>
<entry>Die Datei wurde ohne Probleme aktualisiert (dieses
Präfix wird nur verwendet, wenn Sie mit einem
entfernten Repository arbeiten).</entry>
</row>
<row>
<entry>M</entry>
<entry>Die Datei wurde modifiziert. Es traten keine Konflikte
auf.</entry>
</row>
<row>
<entry>C</entry>
<entry>Die Datei wurde modifiziert, allerdings kam es dabei zu
Konflikten zwischen Ihrer geänderten Version und der
aktuellen Version im CVS.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Wird das Präfix <literal>C</literal> nach einem
<literal>cvs update</literal> angezeigt, bedeutet dies, dass im CVS
etwas geändert wurde und &man.cvs.1; daher nicht in der Lage war,
Ihre Änderungen und die Änderungen im CVS zu kombinieren.
Es ist immer sinnvoll, sich die Änderungen anzusehen, da
<command>cvs</command> keine Informationen darüber hat, wie ein
Port aufgebaut sein soll. Es kann (und wird wahrscheinlich) daher
vorkommen, dass sich manchmal Änderungen ergeben, die keinen
Sinn machen.</para>
<para>Im letzten Schritt erzeugen Sie einen <quote>unified
&man.diff.1;</quote> gegen die derzeit im CVS vorhandenen Dateien:</para>
<screen>&prompt.user; <userinput>cvs diff -uN &gt; ../`basename ${PWD}`.diff</userinput></screen>
<note>
<para>Verwenden Sie unbedingt die Option <option>-N</option>, um
sicherzustellen, dass von hinzugefügte oder gelöschte
Dateien im Patch erfasst sind. Der Patch enthät auch
von Ihnen gelöschte Dateien (allerdings ohne Inhalt). Dies
ist wichtig, da nur so der Committer wissen kann, welche Dateien
er entfernen muss.</para>
</note>
<para>Zuletzt reichen Sie Ihren Patch ein, indem Sie der Anleitung in
<xref linkend="port-upgrading"/> folgen.</para>
</sect1>
<sect1 id="moved-and-updating-files">
<title>Die Dateien UPDATING und MOVED</title>
<para>Wenn die Aktualisierung des Ports spezielle Schritte wie
die Anpassung von Konfigurationsdateien oder die
Ausführung eines speziellen Programms erfordert, sollten
Sie diesen Umstand in der Datei
<filename>/usr/ports/UPDATING</filename> dokumentieren.
Einträge in dieser Datei haben das folgende
Format:</para>
<programlisting>YYYYMMDD:
AFFECTS: users of portcategory/portname
AUTHOR: Your name &lt;Your email address&gt;
Special instructions</programlisting>
<para>Wenn Sie exakte Portmaster oder Portupgrade-Meldungen
einfügen wollen, stellen Sie bitte sicher, dass alle
Sonderzeichen korrekt dargestellt werden.</para>
<para>Wurde der Port gelöscht oder umbenannt, sollten
Sie dies in der Datei
<filename>/usr/ports/MOVED</filename> vermerken. Einträge
in dieser Datei haben das folgende Format:</para>
<programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting>
</sect1>
</chapter>
<chapter id="security">
<title>Sicherheit der Ports</title>
<sect1 id="security-intro">
<title>Warum Sicherheit so wichtig ist</title>
<para>Es finden sich immer wieder Fehler in Software. Die
gefährlichsten davon sind wohl jene, die
Sicherheitslücken öffnen. Technisch gesehen
müssen diese Lücken geschlossen werden, indem die
Fehler, die Sie verursacht haben, beseitigt werden. Aber die
Vorgehensweisen, wie mit bloßen Fehlern und
Sicherheitslücken umgegangen wird, sind sehr
unterschiedlich.</para>
<para>Ein typischer kleiner Fehler betrifft nur Nutzer, die
eine bestimmte Kombination von Optionen aktiviert haben, die
den Fehler auslöst. Der Entwickler wird letztendlich
einen Patch herausgeben, gefolgt von einer neuen Version des
Programms, die den Fehler nicht mehr
enthält&nbsp;&ndash;&nbsp;jedoch wird die Mehrheit der
Nutzer nicht sofort aktualisieren, da sie von diesem Fehler
nicht betroffen sind. Ein kritischer Fehler, der zu
Datenverlust führen kann, stellt ein schwerwiegendes
Problem dar. Dennoch sind sich umsichtige Nutzer bewusst, dass
Datenverlust verschiedene Ursachen&nbsp;&ndash;&nbsp;neben
Softwarefehlern&nbsp;&ndash;&nbsp;haben kann, und machen
deshalb Sicherungskopien wichtiger Daten. Zumal ein
kritischer Fehler sehr schnell entdeckt wird.</para>
<para>Bei einer Sicherheitslücke ist dies ganz anders.
Erstens wird sie vielleicht jahrelang nicht entdeckt, da dies
oftmals keine Fehlfunktion im Programm verursacht. Zweitens
kann eine böswillige Person unerlaubten Zugriff auf ein
unsicheres System erlangen, um empfindliche Daten zu
verändern oder zu zerstören; im schlimmsten Fall
findet der Nutzer nicht einmal die Ursache des Schadens.
Drittens hilft der Zugriff auf ein unsicheres System dem
Angreifer oft in ein anderes System einzudringen, welches
ansonsten nicht gefährdet wäre. Deshalb reicht es
nicht aus eine Sicherheitslücke nur zu schließen:
Die Zielgruppe sollte möglichst genau und umfassend
darüber informiert werden, damit sie die Gefahr
einschätzen und passende Maßnahmen ergreifen
können.</para>
</sect1>
<sect1 id="security-fix">
<title>Sicherheitslücken schliessen</title>
<para>Bei Ports und Paketen kann eine Sicherheitslücke im
ursprünglichen Programm oder in den Port-Dateien
verursacht werden. Im ersten Fall wird der ursprüngliche
Entwickler den Fehler wahrscheinlich umgehend korrigieren oder
eine neue Version herausgeben und Sie müssen den Port nur
aktualisieren und die Korrekturen des Autors beachten. Falls
sich die Korrektur aus irgendeinem Grund verzögert,
sollten Sie <link linkend="dads-noinstall">den Port als
<makevar>FORBIDDEN</makevar> markieren</link> oder selbst den
Fehler für den Port korrigieren. Falls die
Sicherheitslücke im Port verursacht wird, sollten Sie ihn
sobald wie möglich berichtigen. In jedem Fall sollte
<link linkend="port-upgrading">die Standardvorgehensweise zum
Einreichen von Änderungen</link> beachtet
werden&nbsp;&ndash;&nbsp;es sei denn, Sie haben das Recht
diese direkt in den Ports-Baum zu committen.</para>
<important>
<para>Ports-Committer zu sein ist nicht genug, um
Änderungen an einem beliebigen Port zu committen. Bitte
denken Sie daran, dass Ports üblicherweise Maintainer
haben, die Sie respektieren sollten.</para>
</important>
<para>Bitte stellen Sie sicher, dass die Revision des Ports
erhöht wird, sobald die Sicherheitslücke geschlossen
wurde. Dadurch sehen die Nutzer, die installierte Pakete
regelmäßig aktualisieren, dass es an der Zeit ist
eine Aktualisierung durchzuführen. Außerdem wird
ein neues Paket gebaut, über FTP&ndash;&nbsp;und
WWW-Spiegel verteilt und die unsichere Version damit
verdrängt. <makevar>PORTREVISION</makevar> sollte
erhöht werden&nbsp;&ndash;&nbsp;es sei denn,
<makevar>PORTREVISION</makevar> hat sich im Laufe der
Korrektur des Fehlers geändert. Das heißt, Sie
sollten <makevar>PORTREVISION</makevar> erhöhen, wenn Sie
eine Korrektur hinzugefügt haben. Sie sollten diese aber
nicht erhöhen, wenn Sie den Port auf die neueste Version
des Programms gebracht haben und <makevar>PORTREVISION
</makevar> somit schon verändert wurde. Bitte beachten
Sie den <link linkend="makefile-naming-revepoch">betreffenden
Abschnitt</link> für weitere Informationen.</para>
</sect1>
<sect1 id="security-notify">
<title>Die Community informiert halten</title>
<sect2 id="security-notify-vuxml-db">
<title>Die VuXML-Datenbank</title>
<para>Ein sehr wichtiger und dringender Schritt, den man
unternehmen muss, sobald eine Sicherheitslücke entdeckt
wurde, ist die Gemeinschaft der Anwender des Ports über
die Gefahr zu informieren. Diese Benachrichtigung hat zwei
Gründe. Erstens wird es sinnvoll sein, wenn die Gefahr
wirklich so groß ist, sofort Abhilfe zu schaffen,
indem man z.B. den betreffenden Netzwerkdienst beendet oder
den Port komplett deinstalliert, bis die Lücke
geschlossen wurde. Und Zweitens pflegen viele Nutzer
installierte Pakete nur gelegentlich zu aktualisieren. Sie
werden aus der Mitteilung erfahren, dass Sie das Paket,
sobald eine Korrektur verfügbar ist, sofort
aktualisieren <emphasis>müssen</emphasis>.</para>
<para>Angesichts der riesigen Zahl an Ports kann nicht
für jeden Vorfall ein Sicherheitshinweis erstellt
werden, ohne durch die Flut an Nachrichten die
Aufmerksamkeit der Empfänger zu verlieren, im Laufe der
Zeit kommt es so zu ernsten Problemen. Deshalb werden
Sicherheitslücken von Ports in <ulink
url="http://vuxml.freebsd.org/">der FreeBSD
VuXML-Datenbank</ulink> aufgezeichnet. Das Team der
Sicherheitsverantwortlichen beobachtet diese wegen
Angelegenheiten, die Ihr Eingreifen erfordern.</para>
<para>Wenn Sie Committerrechte haben, können Sie die
VuXML-Datenbank selbst aktualisieren. Auf diese Weise helfen
Sie den Sicherheitsverantwortlichen und liefern die
kritischen Informationen frühzeitig an die Community.
Aber auch wenn Sie kein Committer sind und glauben, Sie
haben eine außergewöhnlich schwerwiegende
Lücke gefunden&nbsp;&ndash;&nbsp;egal
welche&nbsp;&ndash;&nbsp;zögern Sie bitte nicht die
Sicherheitsverantwortlichen zu kontaktieren, wie es in den
<ulink url="http://www.freebsd.org/security/#how"> FreeBSD
Sicherheitsinformationen</ulink> beschrieben wird.</para>
<para>Wie vielleicht aus dem Titel hervorgeht, handelt es sich
bei der VuXMl-Datenbank um ein
XML-Dokument. Die Quelldatei <filename>vuln.xml</filename>
können Sie im Port <filename
role="package">security/vuxml</filename> finden. Deshalb
wird der komplette Pfadname <filename>
<envar>PORTSDIR</envar>/security/vuxml/vuln.xml</filename>
lauten. Jedes Mal, wenn Sie eine Sicherheitslücke in
einem Port entdecken, fügen Sie bitte einen Eintrag
dafür in diese Datei ein. Solange Sie nicht mit VuXML
vertraut sind, ist es das Beste, was Sie machen können,
einen vorhandenen Eintrag, der zu Ihrem Fall passt, zu
kopieren und als Vorlage zu verwenden.</para>
</sect2>
<sect2 id="security-notify-vuxml-intro">
<title>Eine kurze Einführung in VuXML</title>
<para>Das komplette XML ist komplex und würde den
Rahmen dieses Buches sprengen. Allerdings benötigen Sie
für einen grundlegenden Einblick in die Struktur eines
VuXML-Eintrags nur eine Vorstellung der Tags. XML-Tags
bestehen aus Namen, die in spitzen Klammern eingeschlossen
sind. Zu jedem öffnenden &lt;Tag&gt; muss ein passendes
&lt;/Tag&gt; existieren. Tags können geschachtelt
werden. Wenn sie geschachtelt werden müssen die inneren
Tags vor den Äußeren geschlossen werden. Es gibt
eine Hierarchie von Tags&nbsp;&ndash;&nbsp;das heißt
komplexere Regeln zur Schachtelung. Klingt so ähnlich
wie HTML, oder? Der größte Unterschied ist: XML
ist erweiterbar
(e<emphasis>X</emphasis>tensible)&nbsp;&ndash;&nbsp;das
heißt es basiert darauf maßgeschneiderte Tags zu
definieren. Aufgrund seiner wesentlichen Struktur bringt
XML ansonsten formlose Daten in eine bestimmte Form. VuXML
ist speziell darauf zugeschnitten Beschreibungen von
Sicherheitslücken zu verwalten.</para>
<para>Lassen Sie uns nun einen realistischen VuXML-Eintrag
betrachten:</para>
<programlisting>&lt;vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"&gt; <co id="co-vx-vid"/>
&lt;topic&gt;Several vulnerabilities found in Foo&lt;/topic&gt; <co id="co-vx-top"/>
&lt;affects&gt;
&lt;package&gt;
&lt;name&gt;foo&lt;/name&gt; <co id="co-vx-nam"/>
&lt;name&gt;foo-devel&lt;/name&gt;
&lt;name&gt;ja-foo&lt;/name&gt;
&lt;range&gt;&lt;ge&gt;1.6&lt;/ge&gt;&lt;lt&gt;1.9&lt;/lt&gt;&lt;/range&gt; <co id="co-vx-rng"/>
&lt;range&gt;&lt;ge&gt;2.*&lt;/ge&gt;&lt;lt&gt;2.4_1&lt;/lt&gt;&lt;/range&gt;
&lt;range&gt;&lt;eq&gt;3.0b1&lt;/eq&gt;&lt;/range&gt;
&lt;/package&gt;
&lt;package&gt;
&lt;name&gt;openfoo&lt;/name&gt; <co id="co-vx-nm2"/>
&lt;range&gt;&lt;lt&gt;1.10_7&lt;/lt&gt;&lt;/range&gt; <co id="co-vx-epo"/>
&lt;range&gt;&lt;ge&gt;1.2,1&lt;/ge&gt;&lt;lt&gt;1.3_1,1&lt;/lt&gt;&lt;/range&gt;
&lt;/package&gt;
&lt;/affects&gt;
&lt;description&gt;
&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;J. Random Hacker reports:&lt;/p&gt; <co id="co-vx-bdy"/>
&lt;blockquote
cite="http://j.r.hacker.com/advisories/1"&gt;
&lt;p&gt;Several issues in the Foo software may be exploited
via carefully crafted QUUX requests. These requests will
permit the injection of Bar code, mumble theft, and the
readability of the Foo administrator account.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/body&gt;
&lt;/description&gt;
&lt;references&gt; <co id="co-vx-ref"/>
&lt;freebsdsa&gt;SA-10:75.foo&lt;/freebsdsa&gt; <co id="co-vx-fsa"/>
&lt;freebsdpr&gt;ports/987654&lt;/freebsdpr&gt; <co id="co-vx-fpr"/>
&lt;cvename&gt;CAN-2010-0201&lt;/cvename&gt; <co id="co-vx-cve"/>
&lt;cvename&gt;CAN-2010-0466&lt;/cvename&gt;
&lt;bid&gt;96298&lt;/bid&gt; <co id="co-vx-bid"/>
&lt;certsa&gt;CA-2010-99&lt;/certsa&gt; <co id="co-vx-cts"/>
&lt;certvu&gt;740169&lt;/certvu&gt; <co id="co-vx-ctv"/>
&lt;uscertsa&gt;SA10-99A&lt;/uscertsa&gt; <co id="co-vx-ucs"/>
&lt;uscertta&gt;SA10-99A&lt;/uscertta&gt; <co id="co-vx-uct"/>
&lt;mlist msgid="201075606@hacker.com"&gt;http://marc.theaimsgroup.com/?l=bugtraq&amp;amp;m=203886607825605&lt;/mlist&gt; <co id="co-vx-mls"/>
&lt;url&gt;http://j.r.hacker.com/advisories/1&lt;/url&gt; <co id="co-vx-url"/>
&lt;/references&gt;
&lt;dates&gt;
&lt;discovery&gt;2010-05-25&lt;/discovery&gt; <co id="co-vx-dsc"/>
&lt;entry&gt;2010-07-13&lt;/entry&gt; <co id="co-vx-ent"/>
&lt;modified&gt;2010-09-17&lt;/modified&gt; <co id="co-vx-mod"/>
&lt;/dates&gt;
&lt;/vuln&gt;</programlisting>
<para>Die Namen der Tags sollten selbsterklärend sein
&nbsp;&ndash;&nbsp;also werfen wir einen genaueren Blick auf
die Felder, die Sie selbst ausfüllen
müssen:</para>
<calloutlist>
<callout arearefs="co-vx-vid">
<para>Dies ist die höchste Tag-Ebene eines
VuXML-Eintrags. Es ist ein vorgeschriebenes Attribut
<literal>vid</literal>, welches eine allgemein
einzigartige Kennung (universally unique identifier,
UUID) in Anführungszeichen für diesen
Eintrag festlegt. Sie sollten eine UUID für
jeden neuen VuXML-Eintrag erzeugen (und vergessen Sie
nicht die UUID der Vorlage zu ersetzen, es sei denn,
Sie schreiben den Eintrag von Grund auf selbst). Sie
können &man.uuidgen.1; verwenden, um eine VuXML
UUID zu erzeugen.</para>
</callout>
<callout arearefs="co-vx-top">
<para>Dies ist eine einzeilige Beschreibung des
gefundenen Fehlers.</para>
</callout>
<callout arearefs="co-vx-nam">
<para>Hier werden die Namen betroffener Pakete
aufgeführt. Es können mehrere Namen
angegeben werden, da mehrere Pakete von einem einzigen
Master-Port oder Software-Produkt abhängen
können. Das schließt Stable&ndash;&nbsp;und
Developement-Zweige, lokalisierte Versionen und
Slave-Ports ein, die verschiedene
Auswahlmöglichkeiten wichtiger
Kompilierungszeit-Optionen bieten.</para>
<important>
<para>Es liegt in Ihrer Verantwortung all diese
betroffenen Pakete zu finden, wenn Sie den
VuXML-Eintrag schreiben.Behalten Sie im
Hinterkopf, dass <literal>make search
name=foo</literal> Ihr Freund ist. Die wichtigsten
Punkte, auf die Sie achten sollten, sind die
folgenden:</para>
<itemizedlist>
<listitem>
<para>die <filename>foo-devel</filename>
Variante eines <filename>foo</filename>
Ports;</para>
</listitem>
<listitem>
<para>andere Varianten mit einem Suffix wie
<literal> -a4</literal> (für
Druck-betreffende Pakete),
<literal>-without-gui</literal> (für Pakete
mit deaktivierter X-Unterstützung) oder
ähnliche</para>
</listitem>
<listitem>
<para><literal>jp-</literal>,
<literal>ru-</literal>, <literal>zh-</literal>
und andere, eventuell lokalisierte, Varianten in
den entsprechenden Länderkategorien der
Ports-Sammlung</para>
</listitem>
</itemizedlist>
</important>
</callout>
<callout arearefs="co-vx-rng">
<para>Betroffene Versionen der Pakete werden hier als
ein Bereich oder mehrere durch eine Kombination aus
<literal>&lt;lt&gt;</literal>, <literal>&lt;le&gt;
</literal>, <literal>&lt;eq&gt;</literal>, <literal>
&lt;ge&gt;</literal>, und
<literal>&lt;gt&gt;</literal>-Elementen ausgegeben.
Die angegebenen Bereiche sollten sich nicht
überschneiden.</para>
<para>In einer Bereichsangabe steht
<literal>*</literal> (Asterisk) für die kleinste
Versionsnummer. Insbesondere ist
<literal>2.*</literal> kleiner als
<literal>2.a</literal>. Deshalb kann ein Stern benutzt
werden, um auf alle möglichen <literal>Alpha
</literal>-, <literal>Beta</literal>&ndash;&nbsp;und
<literal>RC </literal>-Versionen zuzutreffen. Zum
Beispiel passt
<literal>&lt;ge&gt;2.*&lt;/ge&gt;&lt;lt&gt;3.*
&lt;/lt&gt;</literal> auf alle Versionen der Form
<literal>2.x</literal>, während
<literal>&lt;ge&gt;
2.0&lt;/ge&gt;&lt;lt&gt;3.0&lt;/lt&gt;</literal> das
nicht erfüllt, da es nicht auf <literal>2.r3
</literal> passt, auf <literal>3.b</literal> aber
schon.</para>
<para>Das obige Beispiel legt fest, dass Versionen von
<literal>1.6</literal> bis <literal>1.9</literal>
betroffen sind&nbsp;&ndash;&nbsp;außerdem
Versionen <literal>2.x </literal> vor
<literal>2.4_1</literal> und Version
<literal>3.0b1</literal>.</para>
</callout>
<callout arearefs="co-vx-nm2">
<para>Mehrere zusammenhängende Gruppen von
Paketen (im wesentlichen Ports) können im
Abschnitt <literal> &lt;affected&gt;</literal>
aufgeführt werden. Das kann man benutzen, wenn
sich Programme (sagen wir FooBar, FreeBar und OpenBar)
denselben Quelltext als Grundlage haben und sich noch
dessen Fehler und Sicherheitslücken teilen.
Beachten Sie den Unterschied zum Anführen
mehrerer Namen innerhalb eines &lt;package&gt;
Abschnittes.</para>
</callout>
<callout arearefs="co-vx-epo">
<para>Die Versionsbereiche sollten, wenn möglich,
sowohl <makevar>PORTEPOCH</makevar> als auch <makevar>
PORTREVISION</makevar> erlauben. Bitte denken Sie
daran, dass gemäß der Vergleichsregeln eine
Version mit einer <makevar>PORTEPOCH</makevar>, die
nicht Null ist, größer ist als jede Version
ohne <makevar>PORTEPOCH</makevar>. Das heißt,
<literal> 3.0,1</literal> ist größer als
<literal>3.1 </literal> oder sogar
<literal>8.9</literal>.</para>
</callout>
<callout arearefs="co-vx-bdy">
<para>Das ist die Zusammenfassung des Problems. In
diesem Feld wird XHTML verwendet. Zumindest
umschließende <literal>&lt;p&gt;</literal> und
<literal>&lt;/p&gt;</literal> sollten auftauchen.
Komplexere Tags sind zwar möglich, aber sollten
nur um der Genauigkeit und Klarheit willen verwendet
werden: Bitte verwenden Sie hier kein
Eye-Candy.</para>
</callout>
<callout arearefs="co-vx-ref">
<para>Dieser Abschnitt enthält Verweise auf
relevante Dokumente. Es wird empfohlen so viele
Referenzen wie nötig aufzuführen.</para>
</callout>
<callout arearefs="co-vx-fsa">
<para>Das ist ein <ulink
url="http://www.freebsd.org/security/#adv">FreeBSD
Sicherheitshinweis</ulink>.</para>
</callout>
<callout arearefs="co-vx-fpr">
<para>Das ist ein <ulink
url="http://www.freebsd.org/support.html#gnats">
FreeBSD Problembericht</ulink>.</para>
</callout>
<callout arearefs="co-vx-cve">
<para>Das ist eine <ulink
url="http://www.cve.mitre.org/">Mitre CVE</ulink>
Kennung.</para>
</callout>
<callout arearefs="co-vx-bid">
<para>Das ist eine <ulink
url="http://www.securityfocus.com/bid">SecurityFocus
Fehler-Kennung</ulink>.</para>
</callout>
<callout arearefs="co-vx-cts">
<para>Das ist ein Sicherheitshinweis von <ulink
url="http://www.cert.org/">US-CERT</ulink>.</para>
</callout>
<callout arearefs="co-vx-ctv">
<para>Das ist eine Mitteilung über eine
Schwachstelle von <ulink
url="http://www.cert.org/">US-CERT</ulink>.</para>
</callout>
<callout arearefs="co-vx-ucs">
<para>Das ist ein Cyber-Sicherheitsalarm von <ulink
url="http://www.cert.org/">US-CERT</ulink>.</para>
</callout>
<callout arearefs="co-vx-uct">
<para>Das ist ein technischer Cyber-Sicherheitsalarm
von <ulink
url="http://www.cert.org/">US-CERT</ulink>.</para>
</callout>
<callout arearefs="co-vx-mls">
<para>Das ist eine URL zu einem archivierten Posting
auf einer Mailingliste. Das Attribut
<literal>msgid</literal> ist optional und gibt die
Nachrichtenkennung des Postings an.</para>
</callout>
<callout arearefs="co-vx-url">
<para>Das ist eine gewöhnliche URL. Sie sollte
nur verwendet werden, wenn keine der anderen
Referenzkategorien verfügbar ist.</para>
</callout>
<callout arearefs="co-vx-dsc">
<para>Das ist das Datum, an dem die
Sicherheitslücke bekannt wurde
(<replaceable>JJJJ-MM-TT</replaceable>).</para>
</callout>
<callout arearefs="co-vx-ent">
<para>Das ist das Datum, an dem der Eintrag
hinzugefügt wurde
(<replaceable>JJJJ-MM-TT</replaceable>).</para>
</callout>
<callout arearefs="co-vx-mod">
<para>Das ist das Datum, an dem zuletzt irgendeine
Information des Eintrags verändert wurde
(<replaceable>JJJJ-MM-TT</replaceable>). Neue
Einträge dürfen dieses Feld nicht enthalten.
Es sollte beim Editieren eines existierenden Eintrags
eingefügt werden.</para>
</callout>
</calloutlist>
</sect2>
<sect2 id="security-notify-vuxml-testing">
<title>Ihre Änderungen an der VuXML-Datenbank
testen</title>
<para>Nehmen wir an, Sie haben gerade einen Eintrag
für eine Sicherheitslücke in dem Paket
<literal>clamav</literal> geschrieben oder
ausgefüllt, die in der Version
<literal>0.65_7</literal> korrigiert wurde.</para>
<para>Als Voraussetzung müssen Sie die aktuellen Versionen
der Ports <filename
role="package">ports-mgmt/portaudit</filename>, <filename
role="package">ports-mgmt/portaudit-db</filename> sowie
<filename role="package">security/vuxml</filename>
<emphasis>installieren</emphasis>.</para>
<note>
<para>Um <command>packaudit</command> auszuführen,
müssen Sie die Berechtigung haben
<filename><makevar>DATABASEDIR</makevar></filename> zu
schreiben&nbsp;&ndash;&nbsp;üblicherweise ist das
<filename>/var/db/portaudit</filename>.</para>
<para>Durch Setzen der Umgebungsvariable
<filename><makevar>DATABASEDIR</makevar></filename> können
Sie hier auch ein anderes Verzeichnis angeben.</para>
<para>Arbeiten Sie nicht aus dem Verzeichnis
<filename>${PORTSDIR}/security/vuxml</filename> heraus,
müssen Sie zusätzlich die Umgebungsvariable
<filename><makevar>VUXMLDIR</makevar></filename> setzen, um
anzugeben, in welchem Verzeichnis sich die Datei
<filename>vuln.xml</filename> befindet.</para>
</note>
<para>Zuerst überprüfen Sie bitte, ob bereits
ein Eintrag für diese Schwachstelle existiert. Wenn
es einen solchen Eintrag gibt, sollte er auf die vorige
Version <literal>0.65_6</literal> zutreffen:</para>
<screen>&prompt.user; <userinput>packaudit</userinput>
&prompt.user; <userinput>portaudit clamav-0.65_6</userinput></screen>
<para>Wenn keine vorhandenen Einträge gefunden werden
haben Sie grünes Licht, einen neuen Eintrag für
diese Sicherheitslücke anzulegen. Sie können nun
eine neue UUID erzeugen (wir nehmen an, diese lautet
<literal>74a9541d-5d6c-11d8-80e3-0020ed76ef5a</literal>)
und einen neuen Eintrag in der VuXML-Datenbank anlegen.
Bitte überprüfen Sie danach die Syntax mit
folgendem Befehl:</para>
<screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml &amp;&amp; make validate</userinput></screen>
<note>
<para>Sie werden zumindest eines der folgenden Pakete
benötigen: <filename
role="package">textproc/libxml2</filename>, <filename
role="package">textproc/jade</filename>.</para>
</note>
<para>Jetzt bauen Sie bitte die
<command>portaudit</command>-Datenbank aus der VuXML-Datei
neu:</para>
<screen>&prompt.user; <userinput>packaudit</userinput></screen>
<para>Um sicherzustellen, dass der Abschnitt
<literal>&lt;affected&gt;</literal> Ihres Eintrags die
richtigen Pakete betrifft, verwenden Sie bitte den
folgenden Befehl:</para>
<screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5a</userinput></screen>
<note>
<para>Bitte lesen Sie in &man.portaudit.1; nach, um ein
besseres Verständnis der Befehlssyntax zu
entwickeln.</para>
</note>
<para>Bitte stellen Sie sicher, dass Ihr Eintrag keine
falschen Treffer in der Ausgabe erzeugt.</para>
<para>Jetzt überprüfen Sie bitte, dass Ihr
Eintrag die richtigen Versionen des Pakets angibt:</para>
<screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput>
Affected package: clamav-0.65_6 (matched by clamav&lt;0.65_7)
Type of problem: clamav remote denial-of-service.
Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html&gt;
1 problem(s) found.</screen>
<para>Offensichtlich sollte die erste Version ausgegeben
werden&nbsp;&ndash;&nbsp;die zweite jedoch nicht.</para>
<para>Abschließend überprüfen Sie bitte,
ob die Webseite, die aus der VuXML-Datenbank erzeugt wird,
wie erwartet aussieht:</para>
<screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput>
&prompt.user; <userinput>packaudit</userinput>
&prompt.user; <userinput>lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html</userinput></screen>
</sect2>
</sect1>
</chapter>
<chapter id="porting-dads">
<title>Was man machen respektive vermeiden sollte</title>
<sect1 id="dads-intro">
<title>Einführung</title>
<para>Hier ist eine Liste von gebräuchlichen Dos and
Don'ts (Dinge, die man machen oder vermeiden sollte), welchen
Sie während des Portierungsprozesses begegnen werden.
Sie sollten Ihren Port anhand dieser Liste
überprüfen. Sie können auch Ports in der <ulink
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">PR
Datenbank</ulink>, welche andere Menschen eingereicht haben,
kontrollieren. Senden Sie bitte Kommentare zu Ports, die Sie
verifizieren wie unter <ulink
url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">Bug
Reports and General Commentary</ulink> beschrieben. Der
Abgleich von Ports aus der PR-Datenbank hilft uns diese
schneller zu committen, und zeigt auch, dass Sie wissen, worum
es geht.</para>
</sect1>
<sect1 id="porting-wrkdir">
<title><makevar>WRKDIR</makevar></title>
<para>Schreiben Sie in keine Dateien außerhalb von
<makevar>WRKDIR</makevar>. <makevar>WRKDIR</makevar> ist der
einzige Ort, welcher während des Erstellen des Ports
garantiert beschreibbar ist (siehe <ulink
url="&url.books.handbook;/ports-using.html#PORTS-CD"> Ports
Installieren von CDROM</ulink> für ein Beispiel, um Ports
in einem schreibgeschützen Zweig zu erstellen). Wenn Sie
eine der <filename>pkg-<replaceable>*</replaceable></filename>
Dateien modifizieren müssen, sollten Sie <link
linkend="porting-pkgfiles">eine Variable erneut
definieren</link>, anstatt die Datei zu
überschreiben.</para>
</sect1>
<sect1 id="porting-wrkdirprefix">
<title><makevar>WRKDIRPREFIX</makevar></title>
<para>Vergewissern Sie sich, dass Ihr Port
<makevar>WRKDIRPREFIX</makevar> beachtet. Die meisten Ports
sollten sich darüber keine Sorgen machen. Beachten Sie
bitte, falls auf <makevar>WRKDIR</makevar> eines anderen Ports
verwiesen wird, dass die korrekte Position
<filename><makevar>WRKDIRPREFIX</makevar><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename>,
und nicht etwa
<filename><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename>,
<filename><makevar>.CURDIR</makevar>/../../<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename>
oder ähnliches ist.</para>
<para>Falls Sie <makevar>WRKDIR</makevar> selbst definieren,
sollten Sie sicherstellen, dass Sie
<literal>&dollar;{WRKDIRPREFIX}&dollar;{.CURDIR}</literal> am
Anfang anfügen.</para>
</sect1>
<sect1 id="porting-versions">
<title>Unterschiedliche Betriebssysteme und
Betriebssystemversionen</title>
<para>Sie können auf Quelltext treffen, welcher
Modifizierungen oder bedingtes Kompilieren, abhängig
davon, unter welcher Unix-Version er läuft,
benötigt. Falls Sie Änderungen an solch einem
Quelltext vornehmen müssen, stellen Sie bitte sicher,
dass Sie Ihre Änderungen so allgemein wie möglich
halten, damit wir den Quelltext auf ältere
FreeBSD-Systeme portieren und zur Quer-Portierung auf andere
BSD-Systeme, wie etwa 4.4BSD von CSRG, BSD/386, 386BSD, NetBSD
und OpenBSD verwenden können.</para>
<para>Der bevorzugte Weg, um 4.3BSD/Reno (1990) und neuere
Versionen des BSD-Quelltextes zu unterscheiden, ist das
<literal>BSD</literal>-Makro zu nutzen, welches in <ulink
url="http://cvsweb.freebsd.org/src/sys/sys/param.h">sys/param.h</ulink>
definiert ist. Hoffentlich ist diese Datei schon
enthalten&nbsp;&ndash;&nbsp;falls nicht, so fügen Sie
folgenden Quelltext:</para>
<programlisting>#if (defined(__unix__) || defined(unix)) &amp;&amp; !defined(USG)
#include &lt;sys/param.h&gt;
#endif</programlisting>
<para>an der richtigen Stelle in der <filename>.c</filename>
Datei hinzu. Wir glauben, dass jedes System, welches diese
beiden Symbole definiert, die Datei
<filename>sys/param.h</filename> besitzt. Wenn Sie auf
Systeme stoßen, wo dies nicht so ist, würden wir
gerne davon erfahren. Bitte senden Sie eine E-Mail an
&a.ports;.</para>
<para>Eine andere Möglichkeit zur Unterscheidung ist der
GNU Autoconf-Stil:</para>
<programlisting>#ifdef HAVE_SYS_PARAM_H
#include &lt;sys/param.h&gt;
#endif</programlisting>
<para>Vergessen Sie nicht
<literal>-DHAVE_SYS_PARAM_H</literal> zu den
<makevar>CFLAGS</makevar> im <filename>Makefile</filename>
hinzuzufügen, falls Sie diese Methode benutzen
sollten.</para>
<para>Sobald Sie <filename>sys/param.h</filename>
hinzugefügt haben, können Sie mit Hilfe von</para>
<programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199103))</programlisting>
<para>unterscheiden, ob der Quelltext auf einer 4.3 Net2
Code-Basis oder neuer (z.B. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9,
386BSD, BSD/386 1.1 und niedriger) kompiliert werden
wird.</para>
<para>Benutzen Sie:</para>
<programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199306))</programlisting>
<para>um zu differenzieren, ob der Quelltext auf der Basis von
4.4 Code oder neuer (z.B. FreeBSD 2.x, 4.4, NetBSD 1.0,
BSD/386 2.0 oder höher) kompiliert werden wird.</para>
<para>Der Wert des <literal>BSD</literal>-Makros ist
<literal>199506</literal> für die 4.4BSD-Lite2 Codebasis.
Beachten Sie bitte, dass dies hier nur der Information wegen
angegeben ist. Das Makro sollte nicht dazu benutzt werden, um
zwischen Versionen von FreeBSD, welche auf 4.4-Lite basieren,
und Versionen, welche Änderungen von 4.4-Lite2
übernommen haben, zu unterscheiden. Das
<literal>__FreeBSD__</literal> Makro sollte stattdessen
verwandt werden.</para>
<para>Sparsam sollte eingesetzt werden:</para>
<itemizedlist>
<listitem>
<para><literal>__FreeBSD__</literal> ist in allen Versionen
von FreeBSD definiert. Benutzen Sie dieses Makro, falls
die Änderung(en), die Sie machen,
<emphasis>nur</emphasis> FreeBSD betrifft.
Portierungsfallen, wie der Gebrauch von
<literal>sys_errlist[]</literal> gegenüber
<function>strerror()</function> sind Berkeley-Eigenheiten,
keine FreeBSD Änderungen.</para>
</listitem>
<listitem>
<para>In FreeBSD 2.x, ist <literal>__FreeBSD__</literal>
auf <literal>2</literal> definiert. In älteren
Versionen, ist es <literal>1</literal>. Alle späteren
Versionen erhöhen es, damit es mit der
Haupt-Versionsnummer übereinstimmt.</para>
</listitem>
<listitem>
<para>Falls Sie zwischen einem FreeBSD 1.x und einem
FreeBSD 2.x (oder höher) System unterscheiden
müssen, ist es normalerweise richtig, die
<literal>BSD</literal>-Makros (wie oben beschrieben) zu
benutzen. Gibt es tatsächlich eine
FreeBSD-spezifische Änderung (wie z.B. spezielle
Optionen von Shared-Libraries für
<command>ld</command>), ist es nicht zu beanstanden
<literal>__FreeBSD__</literal> und <literal>#if
__FreeBSD__ &gt; 1</literal> zu nutzen, um FreeBSD 2.x und
spätere Systeme zu erkennen. Falls Sie eine
höhere Genauigkeit benötigen, um FreeBSD Systeme
seit 2.0-RELEASE zu erkennen, können Sie folgendes
nutzen:</para>
<programlisting>#if __FreeBSD__ &gt;= 2
#include &lt;osreldate.h&gt;
# if __FreeBSD_version &gt;= 199504
/* 2.0.5+ release specific code here */
# endif
#endif</programlisting>
</listitem>
</itemizedlist>
<para>In den Tausenden von Ports, die bis jetzt erstellt
wurden, gab es nur ein oder zwei Fälle, in denen
<literal>__FreeBSD__</literal> hätte benutzt werden
sollen. Nur weil ein früherer Port es an der falschen
Stelle benutzt hatte, bedeutet das nicht, dass Sie dies auch
machen sollten.</para>
</sect1>
<sect1 id="freebsd-versions">
<title>__FreeBSD_version Werte</title>
<para>Hier ist eine praktische Liste von
<literal>__FreeBSD_version</literal>-Werten wie in <ulink
url="http://cvsweb.freebsd.org/src/sys/sys/param.h">sys/param.h</ulink>
definiert:</para>
<table frame="none">
<title>__FreeBSD_version-Werte</title>
<tgroup cols="3">
<thead>
<row>
<entry>Wert</entry>
<entry>Datum</entry>
<entry>Release</entry>
</row>
</thead>
<tbody>
<row>
<entry>119411</entry>
<entry></entry>
<entry>2.0-RELEASE</entry>
</row>
<row>
<entry>199501, 199503</entry>
<entry>19.&nbsp;März&nbsp;1995</entry>
<entry>2.1-CURRENT</entry>
</row>
<row>
<entry>199504</entry>
<entry>9.&nbsp;April&nbsp;1995</entry>
<entry>2.0.5-RELEASE</entry>
</row>
<row>
<entry>199508</entry>
<entry>26.&nbsp;August&nbsp;1995</entry>
<entry>2.2-CURRENT vor 2.1</entry>
</row>
<row>
<entry>199511</entry>
<entry>10.&nbsp;November&nbsp;1995</entry>
<entry>2.1.0-RELEASE</entry>
</row>
<row>
<entry>199512</entry>
<entry>10.&nbsp;November&nbsp;1995</entry>
<entry>2.2-CURRENT vor 2.1.5</entry>
</row>
<row>
<entry>199607</entry>
<entry>10.&nbsp;Juli&nbsp;1996</entry>
<entry>2.1.5-RELEASE</entry>
</row>
<row>
<entry>199608</entry>
<entry>12.&nbsp;Juli&nbsp;1996</entry>
<entry>2.2-CURRENT vor 2.1.6</entry>
</row>
<row>
<entry>199612</entry>
<entry>15.&nbsp;November&nbsp;1996</entry>
<entry>2.1.6-RELEASE</entry>
</row>
<row>
<entry>199612</entry>
<entry></entry>
<entry>2.1.7-RELEASE</entry>
</row>
<row>
<entry>220000</entry>
<entry>19.&nbsp;Februar&nbsp;1997</entry>
<entry>2.2-RELEASE</entry>
</row>
<row>
<entry>(nicht geändert)</entry>
<entry></entry>
<entry>2.2.1-RELEASE</entry>
</row>
<row>
<entry>(nicht geändert)</entry>
<entry></entry>
<entry>2.2-STABLE nach 2.2.1-RELEASE</entry>
</row>
<row>
<entry>221001</entry>
<entry>15.&nbsp;April&nbsp;1997</entry>
<entry>2.2-STABLE nach texinfo-3.9</entry>
</row>
<row>
<entry>221002</entry>
<entry>30.&nbsp;April&nbsp;1997</entry>
<entry>2.2-STABLE nach top</entry>
</row>
<row>
<entry>222000</entry>
<entry>16.&nbsp;Mai&nbsp;1997</entry>
<entry>2.2.2-RELEASE</entry>
</row>
<row>
<entry>222001</entry>
<entry>19.&nbsp;Mai&nbsp;1997</entry>
<entry>2.2-STABLE nach 2.2.2-RELEASE</entry>
</row>
<row>
<entry>225000</entry>
<entry>2.&nbsp;Oktober&nbsp;1997</entry>
<entry>2.2.5-RELEASE</entry>
</row>
<row>
<entry>225001</entry>
<entry>20.&nbsp;November&nbsp;1997</entry>
<entry>2.2-STABLE nach 2.2.5-RELEASE</entry>
</row>
<row>
<entry>225002</entry>
<entry>27.&nbsp;Dezember&nbsp;1997</entry>
<entry>2.2-STABLE nach der Aufnahme von ldconfig -R</entry>
</row>
<row>
<entry>226000</entry>
<entry>24.&nbsp;März&nbsp;1998</entry>
<entry>2.2.6-RELEASE</entry>
</row>
<row>
<entry>227000</entry>
<entry>21.&nbsp;Juli&nbsp;1998</entry>
<entry>2.2.7-RELEASE</entry>
</row>
<row>
<entry>227001</entry>
<entry>21.&nbsp;Juli&nbsp;1998</entry>
<entry>2.2-STABLE nach 2.2.7-RELEASE</entry>
</row>
<row>
<entry>227002</entry>
<entry>19.&nbsp;September&nbsp;1998</entry>
<entry>2.2-STABLE nach &man.semctl.2; Änderung</entry>
</row>
<row>
<entry>228000</entry>
<entry>29.&nbsp;November&nbsp;1998</entry>
<entry>2.2.8-RELEASE</entry>
</row>
<row>
<entry>228001</entry>
<entry>29.&nbsp;November&nbsp;1998</entry>
<entry>2.2-STABLE nach 2.2.8-RELEASE</entry>
</row>
<row>
<entry>300000</entry>
<entry>19.&nbsp;Februar&nbsp;1996</entry>
<entry>3.0-CURRENT vor &man.mount.2; Änderung</entry>
</row>
<row>
<entry>300001</entry>
<entry>24.&nbsp;September&nbsp;1997</entry>
<entry>3.0-CURRENT nach &man.mount.2; Änderung</entry>
</row>
<row>
<entry>300002</entry>
<entry>2.&nbsp;Juni&nbsp;1998</entry>
<entry>3.0-CURRENT nach &man.semctl.2; Änderung</entry>
</row>
<row>
<entry>300003</entry>
<entry>7.&nbsp;Juni&nbsp;1998</entry>
<entry>3.0-CURRENT nach ioctl arg Änderungen</entry>
</row>
<row>
<entry>300004</entry>
<entry>3.&nbsp;September&nbsp;1998</entry>
<entry>3.0-CURRENT nach ELF-Konvertierung</entry>
</row>
<row>
<entry>300005</entry>
<entry>16.&nbsp;Oktober&nbsp;1998</entry>
<entry>3.0-RELEASE</entry>
</row>
<row>
<entry>300006</entry>
<entry>16.&nbsp;Oktober&nbsp;1998</entry>
<entry>3.0-CURRENT nach 3.0-RELEASE</entry>
</row>
<row>
<entry>300007</entry>
<entry>22.&nbsp;Januar&nbsp;1999</entry>
<entry>3.0-STABLE nach 3/4 Zweig</entry>
</row>
<row>
<entry>310000</entry>
<entry>9.&nbsp;Februar&nbsp;1999</entry>
<entry>3.1-RELEASE</entry>
</row>
<row>
<entry>310001</entry>
<entry>27.&nbsp;März&nbsp;1999</entry>
<entry>3.1-STABLE nach 3.1-RELEASE</entry>
</row>
<row>
<entry>310002</entry>
<entry>14.&nbsp;April&nbsp;1999</entry>
<entry>3.1-STABLE nach Änderung der C++
Konstruktor/Destruktor-Reihenfolge</entry>
</row>
<row>
<entry>320000</entry>
<entry></entry>
<entry>3.2-RELEASE</entry>
</row>
<row>
<entry>320001</entry>
<entry>8.&nbsp;Mai&nbsp;1999</entry>
<entry>3.2-STABLE</entry>
</row>
<row>
<entry>320002</entry>
<entry>29.&nbsp;August&nbsp;1999</entry>
<entry>3.2-STABLE nach binär-inkompatibler IPFW und
Socket-Änderungen</entry>
</row>
<row>
<entry>330000</entry>
<entry>2.&nbsp;September&nbsp;1999</entry>
<entry>3.3-RELEASE</entry>
</row>
<row>
<entry>330001</entry>
<entry>16.&nbsp;September&nbsp;1999</entry>
<entry>3.3-STABLE</entry>
</row>
<row>
<entry>330002</entry>
<entry>24.&nbsp;November&nbsp;1999</entry>
<entry>3.3-STABLE nach Hinzufügen von &man.mkstemp.3;
zur libc</entry>
</row>
<row>
<entry>340000</entry>
<entry>5.&nbsp;Dezember&nbsp;1999</entry>
<entry>3.4-RELEASE</entry>
</row>
<row>
<entry>340001</entry>
<entry>17.&nbsp;Dezember&nbsp;1999</entry>
<entry>3.4-STABLE</entry>
</row>
<row>
<entry>350000</entry>
<entry>20.&nbsp;Juni&nbsp;2000</entry>
<entry>3.5-RELEASE</entry>
</row>
<row>
<entry>350001</entry>
<entry>12.&nbsp;Juli&nbsp;2000</entry>
<entry>3.5-STABLE</entry>
</row>
<row>
<entry>400000</entry>
<entry>22.&nbsp;Januar&nbsp;1999</entry>
<entry>4.0-CURRENT nach 3.4 Zweig</entry>
</row>
<row>
<entry>400001</entry>
<entry>20.&nbsp;Februar&nbsp;1999</entry>
<entry>4.0-CURRENT nach der Änderung im Verhalten des
dynamischen Linkers.</entry>
</row>
<row>
<entry>400002</entry>
<entry>13.&nbsp;März&nbsp;1999</entry>
<entry>4.0-CURRENT nach Änderung der C++
Konstruktor/Destruktor Reihenfolge.</entry>
</row>
<row>
<entry>400003</entry>
<entry>27.&nbsp;März&nbsp;1999</entry>
<entry>4.0-CURRENT nach funktionierendem &man.dladdr.3;.</entry>
</row>
<row>
<entry>400004</entry>
<entry>5.&nbsp;April&nbsp;1999</entry>
<entry>4.0-CURRENT nach der __deregister_frame_info
Fehlerbehebung für den dynamischen Linker (auch
4.0-CURRENT nach EGCS 1.1.2 Integration).</entry>
</row>
<row>
<entry>400005</entry>
<entry>27.&nbsp;April&nbsp;1999</entry>
<entry>4.0-CURRENT nach &man.suser.9; API Änderung
(auch 4.0-CURRENT nach newbus).</entry>
</row>
<row>
<entry>400006</entry>
<entry>31.&nbsp;Mai&nbsp;1999</entry>
<entry>4.0-CURRENT nach Änderung der
cdevsw-Registrierung.</entry>
</row>
<row>
<entry>400007</entry>
<entry>17.&nbsp;Juni&nbsp;1999</entry>
<entry>4.0-CURRENT nach Hinzufügen von so_cred
für Zugangsberechtigungen auf Socket-Ebene.</entry>
</row>
<row>
<entry>400008</entry>
<entry>20.&nbsp;Juni&nbsp;1999</entry>
<entry>4.0-CURRENT nach Hinzufügen eines poll
Syscall-Wrappers zur libc_r.</entry>
</row>
<row>
<entry>400009</entry>
<entry>20.&nbsp;Juli&nbsp;1999</entry>
<entry>4.0-CURRENT nach der Änderung des Kernel
<literal>dev_t</literal>-Typs zum <literal>struct
specinfo</literal>-Zeiger.</entry>
</row>
<row>
<entry>400010</entry>
<entry>25.&nbsp;September&nbsp;1999</entry>
<entry>4.0-CURRENT nach dem Beseitigen eines Fehlers in
&man.jail.2;.</entry>
</row>
<row>
<entry>400011</entry>
<entry>29.&nbsp;September&nbsp;1999</entry>
<entry>4.0-CURRENT nach der <literal>sigset_t</literal>
Datentyp Änderung.</entry>
</row>
<row>
<entry>400012</entry>
<entry>15.&nbsp;November&nbsp;1999</entry>
<entry>4.0-CURRENT nach dem Wechsel zum GCC
2.95.2-Compiler.</entry>
</row>
<row>
<entry>400013</entry>
<entry>4.&nbsp;Dezember&nbsp;1999</entry>
<entry>4.0-CURRENT nach Hinzufügen der erweiterbaren
Linux Mode ioctl-Routinen.</entry>
</row>
<row>
<entry>400014</entry>
<entry>18.&nbsp;Januar&nbsp;2000</entry>
<entry>4.0-CURRENT nach dem OpenSSL-Import.</entry>
</row>
<row>
<entry>400015</entry>
<entry>27.&nbsp;Januar&nbsp;2000</entry>
<entry>4.0-CURRENT nach der C++ ABI Änderung in GCC
2.95.2 von -fvtable-thunks zu -fno-vtable-thunks als
Standard.</entry>
</row>
<row>
<entry>400016</entry>
<entry>27.&nbsp;Februar&nbsp;2000</entry>
<entry>4.0-CURRENT nach OpenSSH-Import.</entry>
</row>
<row>
<entry>400017</entry>
<entry>13.&nbsp;März&nbsp;2000</entry>
<entry>4.0-RELEASE</entry>
</row>
<row>
<entry>400018</entry>
<entry>17.&nbsp;März&nbsp;2000</entry>
<entry>4.0-STABLE nach 4.0-RELEASE</entry>
</row>
<row>
<entry>400019</entry>
<entry>5.&nbsp;Mai&nbsp;2000</entry>
<entry>4.0-STABLE nach der Einführung von
verzögerten Prüfsummen.</entry>
</row>
<row>
<entry>400020</entry>
<entry>4.&nbsp;Juni&nbsp;2000</entry>
<entry>4.0-STABLE nach dem Einpflegen des
libxpg4-Quelltextes in die libc.</entry>
</row>
<row>
<entry>400021</entry>
<entry>8.&nbsp;Juli&nbsp;2000</entry>
<entry>4.0-STABLE nach der Aktualisierung von Binutils auf
2.10.0, Änderungen der binären ELF-Markierungen,
Aufnahme von tcsh ins Basissystem.</entry>
</row>
<row>
<entry>410000</entry>
<entry>14.&nbsp;Juli&nbsp;2000</entry>
<entry>4.1-RELEASE</entry>
</row>
<row>
<entry>410001</entry>
<entry>29.&nbsp;Juli&nbsp;2000</entry>
<entry>4.1-STABLE nach 4.1-RELEASE</entry>
</row>
<row>
<entry>410002</entry>
<entry>16.&nbsp;September&nbsp;2000</entry>
<entry>4.1-STABLE nachdem &man.setproctitle.3; von der
libutil in die libc verschoben wurde.</entry>
</row>
<row>
<entry>411000</entry>
<entry>25.&nbsp;September&nbsp;2000</entry>
<entry>4.1.1-RELEASE</entry>
</row>
<row>
<entry>411001</entry>
<entry></entry>
<entry>4.1.1-STABLE nach 4.1.1-RELEASE</entry>
</row>
<row>
<entry>420000</entry>
<entry>31.&nbsp;Oktober&nbsp;2000</entry>
<entry>4.2-RELEASE</entry>
</row>
<row>
<entry>420001</entry>
<entry>10.&nbsp;Januar&nbsp;2001</entry>
<entry>4.2-STABLE nach Kombinaion von libgcc.a und
libgcc_r.a und zugehörigen Änderungen der
GCC-Bindungen.</entry>
</row>
<row>
<entry>430000</entry>
<entry>6.&nbsp;März&nbsp;2001</entry>
<entry>4.3-RELEASE</entry>
</row>
<row>
<entry>430001</entry>
<entry>18.&nbsp;Mai&nbsp;2001</entry>
<entry>4.3-STABLE nach der Einführung von
wint_t.</entry>
</row>
<row>
<entry>430002</entry>
<entry>22.&nbsp;Juli&nbsp;2001</entry>
<entry>4.3-STABLE nach dem Einpflegen der PCI
Stromstatus-API.</entry>
</row>
<row>
<entry>440000</entry>
<entry>1.&nbsp;August&nbsp;2001</entry>
<entry>4.4-RELEASE</entry>
</row>
<row>
<entry>440001</entry>
<entry>23.&nbsp;Oktober&nbsp;2001</entry>
<entry>4.4-STABLE nach der Einführung von
d_thread_t.</entry>
</row>
<row>
<entry>440002</entry>
<entry>4.&nbsp;November&nbsp;2001</entry>
<entry>4.4-STABLE nach den Änderungen der
mount-Struktur (betrifft Dateisystem-Kernelmodule).
</entry>
</row>
<row>
<entry>440003</entry>
<entry>18.&nbsp;Dezember&nbsp;2001</entry>
<entry>4.4-STABLE nachdem die Userland-Komponenten von
smbfs importiert worden sind.</entry>
</row>
<row>
<entry>450000</entry>
<entry>20.&nbsp;Dezember&nbsp;2001</entry>
<entry>4.5-RELEASE</entry>
</row>
<row>
<entry>450001</entry>
<entry>24.&nbsp;Februar&nbsp;2002</entry>
<entry>4.5-STABLE nach der Umbenennung von Elementen der
USB-Struktur.</entry>
</row>
<row>
<entry>450004</entry>
<entry>16.&nbsp;April&nbsp;2002</entry>
<entry>4.5-STABLE nachdem die
<literal>sendmail_enable</literal> &man.rc.conf.5;
Variable geändert worden ist, um den Wert
<literal>NONE</literal> zu akzeptieren.</entry>
</row>
<row>
<entry>450005</entry>
<entry>27.&nbsp;April&nbsp;2002</entry>
<entry>4.5-STABLE nachdem XFree86 4 als Standard zum Bauen
der Pakete benutzt wird.</entry>
</row>
<row>
<entry>450006</entry>
<entry>1.&nbsp;Mai&nbsp;2002</entry>
<entry>4.5-STABLE nach dem Reparieren des Empfangsfilters,
welcher anfällig für einfache DoS-Attacken
war.</entry>
</row>
<row>
<entry>460000</entry>
<entry>21.&nbsp;Juni&nbsp;2002</entry>
<entry>4.6-RELEASE</entry>
</row>
<row>
<entry>460001</entry>
<entry>21.&nbsp;Juni&nbsp;2002</entry>
<entry>4.6-STABLE &man.sendfile.2; repariert, um mit der
Dokumentation übereinzustimmen, und nicht mehr die
Anzahl der gesendeten Header mit der Anzahl der Daten,
welche aus der Datei geschickt werden, gegenzurechnen.</entry>
</row>
<row>
<entry>460002</entry>
<entry>19.&nbsp;Juli&nbsp;2002</entry>
<entry>4.6.2-RELEASE</entry>
</row>
<row>
<entry>460100</entry>
<entry>26.&nbsp;Juni&nbsp;2002</entry>
<entry>4.6-STABLE</entry>
</row>
<row>
<entry>460101</entry>
<entry>26.&nbsp;Juni&nbsp;2002</entry>
<entry>4.6-STABLE nach dem Einfließen von `sed -i' aus
CURRENT.</entry>
</row>
<row>
<entry>460102</entry>
<entry>1.&nbsp;September&nbsp;2002</entry>
<entry>4.6-STABLE nach dem Einfließen von vielen
neuen pkg_install-Funktionen aus HEAD (HEAD = die
aktuellste und letzte Version des
Quellverzeichnisbaumes).</entry>
</row>
<row>
<entry>470000</entry>
<entry>8.&nbsp;Oktober&nbsp;2002</entry>
<entry>4.7-RELEASE</entry>
</row>
<row>
<entry>470100</entry>
<entry>9.&nbsp;Oktober&nbsp;2002</entry>
<entry>4.7-STABLE</entry>
</row>
<row>
<entry>470101</entry>
<entry>10.&nbsp;November&nbsp;2002</entry>
<entry>Beginn von generierten __std{in,out,err}p
Referenzen statt __sF. Dies ändert std{in,out,err}
von einem Ausdruck während des Kompilierens zu einem
Laufzeitausdruck.</entry>
</row>
<row>
<entry>470102</entry>
<entry>23.&nbsp;Januar&nbsp;2003</entry>
<entry>4.7-STABLE nach dem Einfliessen von
mbuf-Änderungen, um m_aux mbufs mit denen von m_tag
zu ersetzen</entry>
</row>
<row>
<entry>470103</entry>
<entry>14.&nbsp;Februar&nbsp;2003</entry>
<entry>4.7-STABLE erhält OpenSSL 0.9.7</entry>
</row>
<row>
<entry>480000</entry>
<entry>30.&nbsp;März&nbsp;2003</entry>
<entry>4.8-RELEASE</entry>
</row>
<row>
<entry>480100</entry>
<entry>5.&nbsp;April&nbsp;2003</entry>
<entry>4.8-STABLE</entry>
</row>
<row>
<entry>480101</entry>
<entry>22.&nbsp;Mai&nbsp;2003</entry>
<entry>4.8-STABLE nachdem &man.realpath.3; Thread-sicher
gemacht wurde.</entry>
</row>
<row>
<entry>480102</entry>
<entry>10.&nbsp;August&nbsp;2003</entry>
<entry>4.8-STABLE Änderung der 3ware-API in twe.</entry>
</row>
<row>
<entry>490000</entry>
<entry>27.&nbsp;Oktober&nbsp;2003</entry>
<entry>4.9-RELEASE</entry>
</row>
<row>
<entry>490100</entry>
<entry>27.&nbsp;Oktober&nbsp;2003</entry>
<entry>4.9-STABLE</entry>
</row>
<row>
<entry>490101</entry>
<entry>8.&nbsp;Januar&nbsp;2004</entry>
<entry>4.9-STABLE nachdem e_sid zu der Struktur
kinfo_eproc hinzugefügt wurde.</entry>
</row>
<row>
<entry>490102</entry>
<entry>4.&nbsp;Februar&nbsp;2004</entry>
<entry>4.9-STABLE nach dem Einfliessen der
libmap-Funktionalität für rtld.</entry>
</row>
<row>
<entry>491000</entry>
<entry>25.&nbsp;Mai&nbsp;2004</entry>
<entry>4.10-RELEASE</entry>
</row>
<row>
<entry>491100</entry>
<entry>1.&nbsp;Juni&nbsp;2004</entry>
<entry>4.10-STABLE</entry>
</row>
<row>
<entry>491101</entry>
<entry>11.&nbsp;August&nbsp;2004</entry>
<entry>4.10-STABLE nach dem Einfliessen von Revision
20040629 der Paket-Werkzeuge aus CURRENT.</entry>
</row>
<row>
<entry>491102</entry>
<entry>16.&nbsp;November&nbsp;2004</entry>
<entry>4.10-STABLE nach der Fehlerbehebung in der VM, um
das Freigeben von fiktiven Speicherseiten korrekt zu
handhaben.</entry>
</row>
<row>
<entry>492000</entry>
<entry>17.&nbsp;Dezember&nbsp;2004</entry>
<entry>4.11-RELEASE</entry>
</row>
<row>
<entry>492100</entry>
<entry>17.&nbsp;Dezember&nbsp;2004</entry>
<entry>4.11-STABLE</entry>
</row>
<row>
<entry>492101</entry>
<entry>18.&nbsp;April&nbsp;2006</entry>
<entry>4.11-STABLE nach dem Hinzufügen von
libdata/ldconfig Verzeichnissen zu den
mtree-Dateien.</entry>
</row>
<row>
<entry>500000</entry>
<entry>13.&nbsp;März&nbsp;2000</entry>
<entry>5.0-CURRENT</entry>
</row>
<row>
<entry>500001</entry>
<entry>18.&nbsp;April&nbsp;2000</entry>
<entry>5.0-CURRENT nach Hinzufügen von
zusätzlichen Feldern in den ELF-Headern und
Ändern der Methode zur ELF-Markierung von
Binärdateien.</entry>
</row>
<row>
<entry>500002</entry>
<entry>2.&nbsp;Mai&nbsp;2000</entry>
<entry>5.0-CURRENT nach kld-Metadaten
Änderungen.</entry>
</row>
<row>
<entry>500003</entry>
<entry>18.&nbsp;Mai&nbsp;2000</entry>
<entry>5.0-CURRENT nach buf/bio Änderungen.</entry>
</row>
<row>
<entry>500004</entry>
<entry>26.&nbsp;Mai&nbsp;2000</entry>
<entry>5.0-CURRENT nach binutils Aktualisierung.</entry>
</row>
<row>
<entry>500005</entry>
<entry>3.&nbsp;Juni&nbsp;2000</entry>
<entry>5.0-CURRENT nach dem Einfliessen des libxpg4
Quelltextes in die libc und der Einführung der
TASKQ-Schnittstelle.</entry>
</row>
<row>
<entry>500006</entry>
<entry>10.&nbsp;Juni&nbsp;2000</entry>
<entry>5.0-CURRENT nach dem Hinzufügen der
AGP-Schnittstellen.</entry>
</row>
<row>
<entry>500007</entry>
<entry>29.&nbsp;Juni&nbsp;2000</entry>
<entry>5.0-CURRENT nach der Aktualisierung von Perl auf
Version 5.6.0.</entry>
</row>
<row>
<entry>500008</entry>
<entry>7.&nbsp;Juli&nbsp;2000</entry>
<entry>5.0-CURRENT nach der Aktualisierung des
KAME-Quelltextes zu den 2000/07-Quellen.</entry>
</row>
<row>
<entry>500009</entry>
<entry>14.&nbsp;Juli&nbsp;2000</entry>
<entry>5.0-CURRENT nach ether_ifattach() und
ether_ifdetach() Änderungen.</entry>
</row>
<row>
<entry>500010</entry>
<entry>16.&nbsp;Juli&nbsp;2000</entry>
<entry>5.0-CURRENT nachdem die mtree-Standards zurück
zur ursprünglichen Variante geändert wurden; -L
hinzugefügt, um Symlinks zu folgen.</entry>
</row>
<row>
<entry>500011</entry>
<entry>18.&nbsp;Juli&nbsp;2000</entry>
<entry>5.0-CURRENT nachdem die kqueue-API geändert
worden ist.</entry>
</row>
<row>
<entry>500012</entry>
<entry>2.&nbsp;September&nbsp;2000</entry>
<entry>5.0-CURRENT nachdem &man.setproctitle.3; von
libutil nach libc verschoben worden ist.</entry>
</row>
<row>
<entry>500013</entry>
<entry>10.&nbsp;September&nbsp;2000</entry>
<entry>5.0-CURRENT nach dem ersten SMPng-Commit.</entry>
</row>
<row>
<entry>500014</entry>
<entry>4.&nbsp;Januar&nbsp;2001</entry>
<entry>5.0-CURRENT nachdem &lt;sys/select.h&gt; nach
&lt;sys/selinfo.h&gt; verschoben worden ist.</entry>
</row>
<row>
<entry>500015</entry>
<entry>10.&nbsp;Januar&nbsp;2001</entry>
<entry>5.0-CURRENT nach dem Kombinieren von libgcc.a und
libgcc_r.a und damit verbundene Änderungen an
GCC-Bindungen.</entry>
</row>
<row>
<entry>500016</entry>
<entry>24.&nbsp;Januar&nbsp;2001</entry>
<entry>5.0-CURRENT nach der Änderung das
Zusammenbinden von libc und libc_r zu erlauben, womit die
-pthread Option veraltet ist.</entry>
</row>
<row>
<entry>500017</entry>
<entry>18.&nbsp;Februar&nbsp;2001</entry>
<entry>5.0-CURRENT nach dem Umschalten von struct ucred zu
struct xucred, um die vom Kernel exportierte API für
mount u.a.zu stabilisieren.</entry>
</row>
<row>
<entry>500018</entry>
<entry>24.&nbsp;Februar&nbsp;2001</entry>
<entry>5.0-CURRENT nach dem Hinzufügen der CPUTYPE
make Variable zum Kontrollieren von CPU-spezifischen
Optimierungen.</entry>
</row>
<row>
<entry>500019</entry>
<entry>9.&nbsp;Juni&nbsp;2001</entry>
<entry>5.0-CURRENT nach dem Verschieben von
machine/ioctl_fd.h nach sys/fdcio.h</entry>
</row>
<row>
<entry>500020</entry>
<entry>15.&nbsp;Juni&nbsp;2001</entry>
<entry>5.0-CURRENT nach der Umbenennung der
locale-Namen.</entry>
</row>
<row>
<entry>500021</entry>
<entry>22.&nbsp;Juni&nbsp;2001</entry>
<entry>5.0-CURRENT nach dem Bzip2-Import. Kennzeichnet
auch, dass S/Key entfernt wurde.</entry>
</row>
<row>
<entry>500022</entry>
<entry>12.&nbsp;Juli&nbsp;2001</entry>
<entry>5.0-CURRENT nach SSE Unterstützung.</entry>
</row>
<row>
<entry>500023</entry>
<entry>14.&nbsp;September&nbsp;2001</entry>
<entry>5.0-CURRENT nach KSE-Meilenstein 2.</entry>
</row>
<row>
<entry>500024</entry>
<entry>1.&nbsp;Oktober&nbsp;2001</entry>
<entry>5.0-CURRENT nach d_thread_t, und nachdem UUCP in
die Ports verschoben worden ist.</entry>
</row>
<row>
<entry>500025</entry>
<entry>4.&nbsp;Oktober&nbsp;2001</entry>
<entry>5.0-CURRENT nach Änderungen in der ABI bei der
Weitergabe von Deskriptoren und Berechtigungen auf 64 Bit
Plattformen.</entry>
</row>
<row>
<entry>500026</entry>
<entry>9.&nbsp;Oktober&nbsp;2001</entry>
<entry>5.0-CURRENT nachdem XFree86 4 als Standard zum
Erstellen der Pakete benutzt wird und die neue libc
strnstr()-Funktion hinzugefügt wurde.</entry>
</row>
<row>
<entry>500027</entry>
<entry>10.&nbsp;Oktober&nbsp;2001</entry>
<entry>5.0-CURRENT nachdem die neue libc
strcasestr()-Funktion hinzugefügt wurde.</entry>
</row>
<row>
<entry>500028</entry>
<entry>14.&nbsp;Dezember&nbsp;2001</entry>
<entry>5.0-CURRENT nachdem die Userland-Komponenten von
smbfs importiert wurden.</entry>
</row>
<row>
<entry>(nicht geändert)</entry>
<entry></entry>
<entry>5.0-CURRENT nachdem die neuen C99-Ganzzahlen mit
spezifischer Breite hinzugefügt wurden.</entry>
</row>
<row>
<entry>500029</entry>
<entry>29.&nbsp;Januar&nbsp;2002</entry>
<entry>5.0-CURRENT nachdem eine Änderung im
Rückgabewert von &man.sendfile.2; gemacht
wurde.</entry>
</row>
<row>
<entry>500030</entry>
<entry>15.&nbsp;Februar&nbsp;2002</entry>
<entry>5.0-CURRENT nach der Einführung des Types
<literal>fflags_t</literal>, welches die passende
Größe für Dateiflags hat.</entry>
</row>
<row>
<entry>500031</entry>
<entry>24.&nbsp;Februar&nbsp;2002</entry>
<entry>5.0-CURRENT nach der Umbenennung der USB
elements-Struktur.</entry>
</row>
<row>
<entry>500032</entry>
<entry>16.&nbsp;März&nbsp;2002</entry>
<entry>5.0-CURRENT nach der Einführung von Perl
5.6.1.</entry>
</row>
<row>
<entry>500033</entry>
<entry>3.&nbsp;April&nbsp;2002</entry>
<entry>5.0-CURRENT nachdem die
<literal>sendmail_enable</literal> &man.rc.conf.5;
Variable geändert worden ist, um den Wert
<literal>NONE</literal> zu akzeptieren.</entry>
</row>
<row>
<entry>500034</entry>
<entry>30.&nbsp;April&nbsp;2002</entry>
<entry>5.0-CURRENT nachdem mtx_init() einen dritten
Parameter entgegen nimmt.</entry>
</row>
<row>
<entry>500035</entry>
<entry>13.&nbsp;Mai&nbsp;2002</entry>
<entry>5.0-CURRENT mit GCC 3.1.</entry>
</row>
<row>
<entry>500036</entry>
<entry>17.&nbsp;Mai&nbsp;2002</entry>
<entry>5.0-CURRENT ohne Perl in /usr/src</entry>
</row>
<row>
<entry>500037</entry>
<entry>29.&nbsp;Mai&nbsp;2002</entry>
<entry>5.0-CURRENT nach dem Hinzufügen von
&man.dlfunc.3;</entry>
</row>
<row>
<entry>500038</entry>
<entry>24.&nbsp;Juli&nbsp;2002</entry>
<entry>5.0-CURRENT nachdem die Typen von einigen Elementen
der sockbuf-Struktur geändert wurden und nachdem die
Struktur neu geordnet wurde.</entry>
</row>
<row>
<entry>500039</entry>
<entry>1.&nbsp;September&nbsp;2002</entry>
<entry>5.0-CURRENT nach dem GCC 3.2.1 Import. Und auch
nachdem die Header nicht mehr _BSD_FOO_T_ sondern
_FOO_T_DECLARED benutzen. Dieser Wert kann auch als
konservative Schätzung für den Beginn der
Unterstützung des &man.bzip2.1; Pakets verwendet
werden.</entry>
</row>
<row>
<entry>500040</entry>
<entry>20.&nbsp;September&nbsp;2002</entry>
<entry>5.0-CURRENT nachdem verschiedene Änderungen an
Plattenfunktionen gemacht wurden, um die Anhängigkeit
von Interna der disklabel-Struktur zu entfernen.</entry>
</row>
<row>
<entry>500041</entry>
<entry>1.&nbsp;Oktober&nbsp;2002</entry>
<entry>5.0-CURRENT nach dem Hinzufügen von
&man.getopt.long.3; zur libc.</entry>
</row>
<row>
<entry>500042</entry>
<entry>15.&nbsp;Oktober&nbsp;2002</entry>
<entry>5.0-CURRENT nach der Aktualisierung von Binutils
auf 2.13, bei denen die FreeBSD-Emulation, vec und das
Ausgabeformat geändert wurden.</entry>
</row>
<row>
<entry>500043</entry>
<entry>1.&nbsp;November&nbsp;2002</entry>
<entry>5.0-CURRENT nach dem Hinzufügen schwacher
pthread_XXX Stubs zur libc, womit libXThrStub.so veraltet
ist. 5.0-RELEASE.</entry>
</row>
<row>
<entry>500100</entry>
<entry>17.&nbsp;Januar&nbsp;2003</entry>
<entry>5.0-CURRENT nach dem Erstellen des
RELENG_5_0-Zweiges</entry>
</row>
<row>
<entry>500101</entry>
<entry>19.&nbsp;Februar&nbsp;2003</entry>
<entry>&lt;sys/dkstat.h&gt; ist leer und sollte nicht
inkludiert werden.</entry>
</row>
<row>
<entry>500102</entry>
<entry>25.&nbsp;Februar&nbsp;2003</entry>
<entry>5.0-CURRENT nach der Änderung in der
d_mmap_t-Schnittstelle.</entry>
</row>
<row>
<entry>500103</entry>
<entry>26.&nbsp;Februar&nbsp;2003</entry>
<entry>5.0-CURRENT nachdem taskqueue_swi geädert
wurde, um ohne Giant zu arbeiten, und taskqueue_swi_giant
hinzugefügt wurde, um Giant zu verwenden.</entry>
</row>
<row>
<entry>500104</entry>
<entry>27.&nbsp;Februar&nbsp;2003</entry>
<entry>cdevsw_add() und cdevsw_remove() gibt es nicht
länger. Auftauchen der
MAJOR_AUTO-Allokationsmöglichkeit.</entry>
</row>
<row>
<entry>500105</entry>
<entry>4.&nbsp;März&nbsp;2003</entry>
<entry>5.0-CURRENT nach der neuen
cdevsw-Initialisierungsmethode.</entry>
</row>
<row>
<entry>500106</entry>
<entry>8.&nbsp;März&nbsp;2003</entry>
<entry>devstat_add_entry() wurde durch
devstat_new_entry() ersetzt.</entry>
</row>
<row>
<entry>500107</entry>
<entry>15.&nbsp;März&nbsp;2003</entry>
<entry>Devstat Schnittstellenänderung; siehe
sys/sys/param.h 1.149.</entry>
</row>
<row>
<entry>500108</entry>
<entry>15.&nbsp;März&nbsp;2003</entry>
<entry>Token-Ring Schnittstellenänderungen.</entry>
</row>
<row>
<entry>500109</entry>
<entry>25.&nbsp;März&nbsp;2003</entry>
<entry>Hinzufügen von vm_paddr_t.</entry>
</row>
<row>
<entry>500110</entry>
<entry>28.&nbsp;März&nbsp;2003</entry>
<entry>5.0-CURRENT nachdem &man.realpath.3;
Thread-sicher gemacht wurde.</entry>
</row>
<row>
<entry>500111</entry>
<entry>9.&nbsp;April&nbsp;2003</entry>
<entry>5.0-CURRENT nachdem &man.usbhid.3; mit
NetBSD synchronisiert wurde.</entry>
</row>
<row>
<entry>500112</entry>
<entry>17.&nbsp;April&nbsp;2003</entry>
<entry>5.0-CURRENT nach der neuen NSS Implementierung
und Hinzufügen der POSIX.1 getpw*_r, getgr*_r
Funktionen.</entry>
</row>
<row>
<entry>500113</entry>
<entry>2.&nbsp;Mai&nbsp;2003</entry>
<entry>5.0-CURRENT nach Entfernen des alten
rc-Systems.</entry>
</row>
<row>
<entry>501000</entry>
<entry>4.&nbsp;Juni&nbsp;2003</entry>
<entry>5.1-RELEASE.</entry>
</row>
<row>
<entry>501100</entry>
<entry>2.&nbsp;Juni&nbsp;2003</entry>
<entry>5.1-CURRENT nach dem Erstellen des RELENG_5_1
Zweiges.</entry>
</row>
<row>
<entry>501101</entry>
<entry>29.&nbsp;Juni&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem die Semantik von
sigtimedwait(2) and sigwaitinfo(2) korrigiert
wurden.</entry>
</row>
<row>
<entry>501102</entry>
<entry>3.&nbsp;Juli&nbsp;2003</entry>
<entry>5.1-CURRENT nach dem Hinzufügen der lockfunc und
lockfuncarg-Felder zu &man.bus.dma.tag.create.9;.</entry>
</row>
<row>
<entry>501103</entry>
<entry>31.&nbsp;Juli&nbsp;2003</entry>
<entry>5.1-CURRENT nach der Integration des GCC 3.3.1-pre
20030711 Snapshots.</entry>
</row>
<row>
<entry>501104</entry>
<entry>5.&nbsp;August&nbsp;2003</entry>
<entry>5.1-CURRENT 3ware-API Änderungen in twe.</entry>
</row>
<row>
<entry>501105</entry>
<entry>17.&nbsp;August&nbsp;2003</entry>
<entry>5.1-CURRENT Unterstützung von dynamisch
gebundenen /bin und /sbin und Verschieben von Bibliotheken
nach /lib.</entry>
</row>
<row>
<entry>501106</entry>
<entry>8.&nbsp;September&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem im Kernel Unterstützung
für Coda 6.x hinzugefügt wurden.</entry>
</row>
<row>
<entry>501107</entry>
<entry>17.&nbsp;September&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem die 16550 UART-Konstanten von
<filename>&lt;dev/sio/sioreg.h&gt;</filename> nach
<filename>&lt;dev/ic/ns16550.h&gt;</filename> verschoben
wurden. Und nachdem die libmap Funktionalität
vorbehaltlos vom rtld unterstützt wurde.</entry>
</row>
<row>
<entry>501108</entry>
<entry>23.&nbsp;September&nbsp;2003</entry>
<entry>5.1-CURRENT nach Aktualisierung der PFIL_HOOKS API.</entry>
</row>
<row>
<entry>501109</entry>
<entry>27.&nbsp;September&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem kiconv(3) hinzugefügt
wurde.</entry>
</row>
<row>
<entry>501110</entry>
<entry>28.&nbsp;September&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem der standardmäßige
Ablauf von open und close in cdevsw geändert
wurde.</entry>
</row>
<row>
<entry>501111</entry>
<entry>16.&nbsp;Oktober&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem das Layout von cdevsw
geändert wurde.</entry>
</row>
<row>
<entry>501112</entry>
<entry>16.&nbsp;Oktober&nbsp;2003</entry>
<entry>5.1-CURRENT nach dem Hinzufügen von
Mehrfachvererbung in kobj.</entry>
</row>
<row>
<entry>501113</entry>
<entry>31.&nbsp;Oktober&nbsp;2003</entry>
<entry>5.1-CURRENT nach der if_xname Änderung in der
Struktur ifnet</entry>
</row>
<row>
<entry>501114</entry>
<entry>16.&nbsp;November&nbsp;2003</entry>
<entry>5.1-CURRENT nachdem /bin und /sbin geändert
wurden, um sie dynamisch zu binden.</entry>
</row>
<row>
<entry>502000</entry>
<entry>7.&nbsp;Dezember&nbsp;2003</entry>
<entry>5.2-RELEASE</entry>
</row>
<row>
<entry>502010</entry>
<entry>23.&nbsp;Februar&nbsp;2004</entry>
<entry>5.2.1-RELEASE</entry>
</row>
<row>
<entry>502100</entry>
<entry>7.&nbsp;Dezember&nbsp;2003</entry>
<entry>5.2-CURRENT nach dem Erstellen des RELENG_5_2-Zweiges.</entry>
</row>
<row>
<entry>502101</entry>
<entry>19.&nbsp;Dezember&nbsp;2003</entry>
<entry>5.2-CURRENT nachdem die
__cxa_atexit/__cxa_finalize Funktionen zur libc
hinzugefügt wurden.</entry>
</row>
<row>
<entry>502102</entry>
<entry>30.&nbsp;Januar&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem die Standard-Thread Bibliothek
von libc_r zu libpthread geändert wurde.</entry>
</row>
<row>
<entry>502103</entry>
<entry>21.&nbsp;Februar&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Gerätetreiber API
Megapatch.</entry>
</row>
<row>
<entry>502104</entry>
<entry>25.&nbsp;Februar&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem getopt_long_only()
hinzugefügt wurde.</entry>
</row>
<row>
<entry>502105</entry>
<entry>5.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem NULL für C in ((void *)0)
geändert wurde, was mehr Warnungen erzeugt.</entry>
</row>
<row>
<entry>502106</entry>
<entry>8.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem pf beim Bauen und Installieren
mit eingebunden wird.</entry>
</row>
<row>
<entry>502107</entry>
<entry>10.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem time_t auf der sparc64-Plattform
in einen 64-bit Wert geändert wurde.</entry>
</row>
<row>
<entry>502108</entry>
<entry>12.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem sich die Unterstützung
für den Intel C/C++-Compiler in einigen Headern und
execve(2) geändert hat, um sich strikter an POSIX zu
halten.</entry>
</row>
<row>
<entry>502109</entry>
<entry>22.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nach der Einführung der
bus_alloc_resource_any API</entry>
</row>
<row>
<entry>502110</entry>
<entry>27.&nbsp;März&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Hinzufügen von UTF-8
locales</entry>
</row>
<row>
<entry>502111</entry>
<entry>11.&nbsp;April&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Entfernen der getvfsent(3)
API</entry>
</row>
<row>
<entry>502112</entry>
<entry>13.&nbsp;April&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Hinzufügen der .warning
Directive für make.</entry>
</row>
<row>
<entry>502113</entry>
<entry>4.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem ttyioctl() zwingend erforderlich
für serielle Treiber gemacht wurde.</entry>
</row>
<row>
<entry>502114</entry>
<entry>13.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Import des
ALTQ-Frameworks.</entry>
</row>
<row>
<entry>502115</entry>
<entry>14.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem sema_timedwait(9) geändert
wurde, 0 bei Erfolg und einen von 0 verschiedenen
Fehlercode im Falle eines Fehlers
zurückzuliefern.</entry>
</row>
<row>
<entry>502116</entry>
<entry>16.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Ändern der Kernel
Struktur dev_t, in ein Zeiger auf die Struktur cdev *</entry>
</row>
<row>
<entry>502117</entry>
<entry>17.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Ändern der Kernelstruktur
udev_t in dev_t.</entry>
</row>
<row>
<entry>502118</entry>
<entry>17.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem Unterstützung für
CLOCK_VIRTUAL und CLOCK_PROF zu clock_gettime(2) und
clock_getres(2) hinzugefügt wurde.</entry>
</row>
<row>
<entry>502119</entry>
<entry>22.&nbsp;Juni&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem die Überprüfung des
Klonens von Netzwerk-Schnittstellen geändert
wurde.</entry>
</row>
<row>
<entry>502120</entry>
<entry>2.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Einfliessen von Revision
20040629 der Paket-Werkzeuge.</entry>
</row>
<row>
<entry>502121</entry>
<entry>9.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem Bluetooth-Quelltext als nicht
i386-spezifisch markiert wurde.</entry>
</row>
<row>
<entry>502122</entry>
<entry>11.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nach der Einführung des KDB
Debugger Frameworks, der Umwandlung des DDB in ein Backend
und der Einführung des GDB-Backends.</entry>
</row>
<row>
<entry>502123</entry>
<entry>12.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem VFS_ROOT geändert wurde,
eine Struktur thread als Argument zu aktzeptieren, wie
vflush. Die Struktur kinfo_proc enthält nun einen
Zeiger auf Benutzer Daten. Der Umstieg auf
<literal>xorg</literal> als standardmäßige X
Implementierung wurde auch zu dieser Zeit
durchgeführt.</entry>
</row>
<row>
<entry>502124</entry>
<entry>24.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem die Art und Weise, wie rc.d-Skripte
von Ports und Altlasten gestartet werden, getrennt wurde.</entry>
</row>
<row>
<entry>502125</entry>
<entry>28.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem die vorherige Änderung
rückgängig gemacht wurde.</entry>
</row>
<row>
<entry>502126</entry>
<entry>31.&nbsp;Juli&nbsp;2004</entry>
<entry>5.2-CURRENT nach dem Entfernen von
kmem_alloc_pageable() und dem Import von GCC 3.4.2.</entry>
</row>
<row>
<entry>502127</entry>
<entry>2.&nbsp;August&nbsp;2004</entry>
<entry>5.2-CURRENT nachdem die UMA Kernel API
geändert wurde, um Konstruktoren und
Initialisierungsmethoden zu erlauben
fehlzuschlagen.</entry>
</row>
<row>
<entry>502128</entry>
<entry>8.&nbsp;August&nbsp;2004</entry>
<entry>5.2-CURRENT nach der Änderung in der vfs_mount
Signatur sowie allgemeines Ersetzen von PRISON_ROOT durch
SUSER_ALLOWJAIL in der suser(9) API.</entry>
</row>
<row>
<entry>503000</entry>
<entry>23.&nbsp;August&nbsp;2004</entry>
<entry>5.3-BETA/RC vor der Änderung der pfil-API.</entry>
</row>
<row>
<entry>503001</entry>
<entry>22.&nbsp;September&nbsp;2004</entry>
<entry>5.3-RELEASE</entry>
</row>
<row>
<entry>503100</entry>
<entry>16.&nbsp;Oktober&nbsp;2004</entry>
<entry>5.3-STABLE nach dem Erstellen des RELENG_5_3-Zweiges.</entry>
</row>
<row>
<entry>503101</entry>
<entry>3.&nbsp;Dezember&nbsp;2004</entry>
<entry>5.3-STABLE nach dem Hinzufügen von
Fülloptionen im Stile der libc zu
&man.strftime.3;.</entry>
</row>
<row>
<entry>503102</entry>
<entry>13.&nbsp;Februar&nbsp;2005</entry>
<entry>5.3-STABLE nachdem OpenBSD's nc(1) von CURRENT
importiert wurde.</entry>
</row>
<row>
<entry>503103</entry>
<entry>27.&nbsp;Februar&nbsp;2005</entry>
<entry>5.4-PRERELEASE nach dem Einfliessen der Reparaturen
aus CURRENT, in
<filename>&lt;src/include/stdbool.h&gt;</filename> und
<filename>&lt;src/sys/i386/include/_types.h&gt;</filename>,
um die GCC-Kompatibilität des Intel C/C++-Compilers
zu benutzen.</entry>
</row>
<row>
<entry>503104</entry>
<entry>28.&nbsp;Februar&nbsp;2005</entry>
<entry>5.4-PRERELEASE nach dem Einfliessen der
Änderung aus CURRENT in ifi_epoch statt der lokalen
Zeit die Betriebszeit des Systems zu benutzen.</entry>
</row>
<row>
<entry>503105</entry>
<entry>2.&nbsp;März&nbsp;2005</entry>
<entry>5.4-PRERELEASE nach dem Einfliessen der Reparaturen
von EOVERFLOW in vswprintf(3) aus CURRENT.</entry>
</row>
<row>
<entry>504000</entry>
<entry>3.&nbsp;April&nbsp;2005</entry>
<entry>5.4-RELEASE.</entry>
</row>
<row>
<entry>504100</entry>
<entry>3.&nbsp;April&nbsp;2005</entry>
<entry>5.4-STABLE nach dem Erstellen des
RELENG_5_4-Zweiges.</entry>
</row>
<row>
<entry>504101</entry>
<entry>11.&nbsp;Mai&nbsp;2005</entry>
<entry>5.4-STABLE nach dem Vergrößern der
standardmäßigen Stackgröße für
Threads.</entry>
</row>
<row>
<entry>504102</entry>
<entry>24.&nbsp;Juni&nbsp;2005</entry>
<entry>5.4-STABLE nach dem Hinzufügen von sha256.</entry>
</row>
<row>
<entry>504103</entry>
<entry>3.&nbsp;Oktober&nbsp;2005</entry>
<entry>5.4-STABLE nach dem Einfliessen von if_bridge aus
CURRENT.</entry>
</row>
<row>
<entry>504104</entry>
<entry>13.&nbsp;November&nbsp;2005</entry>
<entry>5.4-STABLE nach dem Einfliessen von bsdiff und
portsnap aus CURRENT.</entry>
</row>
<row>
<entry>504105</entry>
<entry>17.&nbsp;Januar&nbsp;2006</entry>
<entry>5.4-STABLE nach dem Einfliessen der Änderung
von ldconfig_local_dirs aus CURRENT.</entry>
</row>
<row>
<entry>505000</entry>
<entry>12.&nbsp;Mai&nbsp;2006</entry>
<entry>5.5-RELEASE.</entry>
</row>
<row>
<entry>505100</entry>
<entry>12.&nbsp;Mai&nbsp;2006</entry>
<entry>5.5-STABLE nach dem Erstellen des RELENG_5_5-Zweiges.</entry>
</row>
<row>
<entry>600000</entry>
<entry>18.&nbsp;August&nbsp;2004</entry>
<entry>6.0-CURRENT</entry>
</row>
<row>
<entry>600001</entry>
<entry>27.&nbsp;August&nbsp;2004</entry>
<entry>6.0-CURRENT nach der festen Aktivierung von
PFIL_HOOKS im Kernel.</entry>
</row>
<row>
<entry>600002</entry>
<entry>30.&nbsp;August&nbsp;2004</entry>
<entry>6.0-CURRENT nach der anfänglichen
Einführung von ifi_epoch zur Struktur if_data. Wurde
nach ein paar Tagen wieder rückgängig gemacht.
Benutzen Sie diesen Wert bitte nicht.</entry>
</row>
<row>
<entry>600003</entry>
<entry>8.&nbsp;September&nbsp;2004</entry>
<entry>6.0-CURRENT nach dem erneuten Hinzufügen des
Elements ifi_epoch zur Struktur if_data.</entry>
</row>
<row>
<entry>600004</entry>
<entry>29.&nbsp;September&nbsp;2004</entry>
<entry>6.0-CURRENT nach dem Hinzufügen der Struktur
inpcb als Argument in der pfil API.</entry>
</row>
<row>
<entry>600005</entry>
<entry>5.&nbsp;Oktober&nbsp;2004</entry>
<entry>6.0-CURRENT nach dem Hinzufügen des "-d
DESTDIR" Schalters zu newsyslog.</entry>
</row>
<row>
<entry>600006</entry>
<entry>4.&nbsp;November&nbsp;2004</entry>
<entry>6.0-CURRENT nach dem Hinzufügen von
Fülloptionen im Style der libc zu
&man.strftime.3;.</entry>
</row>
<row>
<entry>600007</entry>
<entry>12.&nbsp;Dezember&nbsp;2004</entry>
<entry>6.0-CURRENT nach dem Hinzufügen von 802.11
Framework Neuerungen.</entry>
</row>
<row>
<entry>600008</entry>
<entry>25.&nbsp;Januar&nbsp;2005</entry>
<entry>6.0-CURRENT Änderung an den VOP_*VOBJECT()
Funktionen und Einführung des MNTK_MPSAFE Schalters
für Dateisysteme, welche ohne Giant arbeiten.</entry>
</row>
<row>
<entry>600009</entry>
<entry>4.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Hinzufügen von cpufreq
Framework und Treibern.</entry>
</row>
<row>
<entry>600010</entry>
<entry>6.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem OpenBSD's nc(1) importiert
wurde.</entry>
</row>
<row>
<entry>600011</entry>
<entry>12.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem der Anschein von
<literal>matherr()</literal> Unterstützung in SVID2
entfernt wurde.</entry>
</row>
<row>
<entry>600012</entry>
<entry>15.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Vergrößern der
standardmäßigen Stackgröße für
Threads.</entry>
</row>
<row>
<entry>600013</entry>
<entry>19.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Einfliessen der Reparaturen in
<filename>&lt;src/include/stdbool.h&gt;</filename> und
<filename>&lt;src/sys/i386/include/_types.h&gt;</filename>,
um die GCC-Kompatibilität des Intel C/C++-Compilers
zu benutzen.</entry>
</row>
<row>
<entry>600014</entry>
<entry>21.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem die Überprüfungen auf
EOVERFLOW in vswprintf(3) korrigiert wurden.</entry>
</row>
<row>
<entry>600015</entry>
<entry>25.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Einfliessen der Änderung,
in ifi_epoch, statt der lokalen Zeit, die Betriebzeit des
Systems zu benutzen.</entry>
</row>
<row>
<entry>600016</entry>
<entry>26.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem das Format von LC_CTYPE auf der
Festplatte verändert wurde.</entry>
</row>
<row>
<entry>600017</entry>
<entry>27.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem das Format der NLS-Kataloge auf
der Festplatte verändert wurde.</entry>
</row>
<row>
<entry>600018</entry>
<entry>27.&nbsp;Februar&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem das Format von LC_COLLATE auf
der Festplatte verändert wurde.</entry>
</row>
<row>
<entry>600019</entry>
<entry>28.&nbsp;Februar&nbsp;2005</entry>
<entry>Installation der acpica Include-Dateien in
/usr/include.</entry>
</row>
<row>
<entry>600020</entry>
<entry>9.&nbsp;März&nbsp;2005</entry>
<entry>Hinzufügen des MSG_NOSIGNAL Schalters zur
send(2) API.</entry>
</row>
<row>
<entry>600021</entry>
<entry>17.&nbsp;März&nbsp;2005</entry>
<entry>Hinzufügen von Feldern zu cdevsw</entry>
</row>
<row>
<entry>600022</entry>
<entry>21.&nbsp;März&nbsp;2005</entry>
<entry>gtar wurde aus dem Basissystem entfernt.</entry>
</row>
<row>
<entry>600023</entry>
<entry>13.&nbsp;April&nbsp;2005</entry>
<entry>Die Optionen LOCAL_CREDS, LOCAL_CONNWAIT für
Sockets wurde zu unix(4) hinzugefügt.</entry>
</row>
<row>
<entry>600024</entry>
<entry>19.&nbsp;April&nbsp;2005</entry>
<entry>&man.hwpmc.4; und zugehörige Werkzeuge wurden
zu 6.0-CURRENT hinzugefügt.</entry>
</row>
<row>
<entry>600025</entry>
<entry>26.&nbsp;April&nbsp;2005</entry>
<entry>Die Struktur icmphdr wurden zu 6.0-CURRENT
hinzugefügt.</entry>
</row>
<row>
<entry>600026</entry>
<entry>3.&nbsp;Mai&nbsp;2005</entry>
<entry>pf Aktualisierung auf 3.7.</entry>
</row>
<row>
<entry>600027</entry>
<entry>6.&nbsp;Mai&nbsp;2005</entry>
<entry>Kernel libalias und ng_nat wurden
eingeführt.</entry>
</row>
<row>
<entry>600028</entry>
<entry>13.&nbsp;Mai&nbsp;2005</entry>
<entry>POSIX ttyname_r(3) wurde über unistd.h und
libc zur Verfügung gestellt.</entry>
</row>
<row>
<entry>600029</entry>
<entry>29.&nbsp;Mai&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem libpcap zu Version v0.9.1 alpha
096 aktualisiert wurde.</entry>
</row>
<row>
<entry>600030</entry>
<entry>5.&nbsp;Juni&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Import von NetBSDs
if_bridge(4).</entry>
</row>
<row>
<entry>600031</entry>
<entry>10.&nbsp;Juni&nbsp;2005</entry>
<entry>6.0-CURRENT nachdem die Struktur ifnet aus dem
Treiber softcs herausgelöst wurde.</entry>
</row>
<row>
<entry>600032</entry>
<entry>11.&nbsp;Juli&nbsp;2005</entry>
<entry>6.0-CURRENT nach dem Import von libpcap
v0.9.1.</entry>
</row>
<row>
<entry>600033</entry>
<entry>25.&nbsp;Juli&nbsp;2005</entry>
<entry>6.0-STABLE nachdem die Versionen aller gemeinsam
genutzten Bibliotheken, welche seit RELENG_5 nicht
geändert wurden, erhöht wurden.</entry>
</row>
<row>
<entry>600034</entry>
<entry>13.&nbsp;August&nbsp;2005</entry>
<entry>6.0-STABLE nachdem das Argument credential zu der
dev_clone-Ereignisbehandlung hinzugefügt wurde.
6.0-RELEASE.</entry>
</row>
<row>
<entry>600100</entry>
<entry>1.&nbsp;November&nbsp;2005</entry>
<entry>6.0-STABLE nach dem Erstellen des
6.0-RELEASE-Zweiges.</entry>
</row>
<row>
<entry>600101</entry>
<entry>21.&nbsp;Dezember&nbsp;2005</entry>
<entry>6.0-STABLE nach dem Aufnehmen von Skripten aus den
local_startup-Verzeichnissen in &man.rcorder.8; des
Basissystems.</entry>
</row>
<row>
<entry>600102</entry>
<entry>30.&nbsp;Dezember&nbsp;2005</entry>
<entry>6.0-STABLE nach dem Aktualisieren der ELF-Typen und
Konstanten.</entry>
</row>
<row>
<entry>600103</entry>
<entry>15.&nbsp;Januar&nbsp;2006</entry>
<entry>6.0-STABLE nach dem Einfliessen der pidfile(3)-API
aus CURRENT.</entry>
</row>
<row>
<entry>600104</entry>
<entry>17.&nbsp;Januar&nbsp;2006</entry>
<entry>6.0-STABLE nach dem Einfliessen der Änderung
von ldconfig_local_dirs aus CURRENT.</entry>
</row>
<row>
<entry>600105</entry>
<entry>26.&nbsp;Februar&nbsp;2006</entry>
<entry>6.0-STABLE nach der NLS-Katalogunterstützung
von csh(1).</entry>
</row>
<row>
<entry>601000</entry>
<entry>6.&nbsp;Mai&nbsp;2006</entry>
<entry>6.1-RELEASE</entry>
</row>
<row>
<entry>601100</entry>
<entry>6.&nbsp;Mai&nbsp;2006</entry>
<entry>6.1-STABLE nach 6.1-RELEASE.</entry>
</row>
<row>
<entry>601101</entry>
<entry>22.&nbsp;Juni&nbsp;2006</entry>
<entry>6.1-STABLE nach dem Import von csup.</entry>
</row>
<row>
<entry>601102</entry>
<entry>11.&nbsp;Juli&nbsp;2006</entry>
<entry>6.1-STABLE nach der iwi(4)-Aktualisierung.</entry>
</row>
<row>
<entry>601103</entry>
<entry>17.&nbsp;Juli&nbsp;2006</entry>
<entry>6.1-STABLE nach der Aktualisierung der
Namensauflösung zu BIND9 und Aufnahme der
ablaufinvarianten Versionen der netdb-Funktionen.</entry>
</row>
<row>
<entry>601104</entry>
<entry>8.&nbsp;August&nbsp;2006</entry>
<entry>6.1-STABLE nachdem Unterstützung für DSO
(dynamic shared objects - gemeinsam genutzte, dynamische
Objekte) in OpenSSL aktiviert wurde.</entry>
</row>
<row>
<entry>601105</entry>
<entry>2.&nbsp;September&nbsp;2006</entry>
<entry>6.1-STABLE nachdem 802.11 Reparaturen die API der
IEEE80211_IOC_STA_INFO ioctl geändert haben.</entry>
</row>
<row>
<entry>602000</entry>
<entry>15.&nbsp;November&nbsp;2006</entry>
<entry>6.2-RELEASE</entry>
</row>
<row>
<entry>602100</entry>
<entry>15.&nbsp;September&nbsp;2006</entry>
<entry>6.2-STABLE nach 6.2-RELEASE.</entry>
</row>
<row>
<entry>602101</entry>
<entry>12.&nbsp;Dezember&nbsp;2006</entry>
<entry>6.2-STABLE nach dem Hinzufügen der Wi-Spy
Eigenart.</entry>
</row>
<row>
<entry>602102</entry>
<entry>28.&nbsp;Dezember&nbsp;2006</entry>
<entry>6.2-STABLE nachdem pci_find_extcap() hinzugefügt
wurde.</entry>
</row>
<row>
<entry>602103</entry>
<entry>16.&nbsp;Januar&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen der dlsym
Änderung aus CURRENT, ein angefordertes Symbol sowohl
in der spezifizierten dso, als auch in den impliziten
Abhängigkeiten nachzuschlagen.</entry>
</row>
<row>
<entry>602104</entry>
<entry>28.&nbsp;Januar&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von ng_deflate(4)
und ng_pred1(4) netgraph Knoten und neuen Kompressions-
und -Verschlüsselungmodi für den ng_ppp(4)
Knoten aus CURRENT.</entry>
</row>
<row>
<entry>602105</entry>
<entry>20.&nbsp;Februar&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen der BSD lizensierten
Version von &man.gzip.1;, welche von NetBSD portiert wurde
aus CURRENT.</entry>
</row>
<row>
<entry>602106</entry>
<entry>31.&nbsp;März&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen der PCI MSI und
MSI-X Unterstützung aus CURRENT.</entry>
</row>
<row>
<entry>602107</entry>
<entry>6.&nbsp;April&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von ncurses 5.6 und
Unterstützung für Multibyte-Zeichen aus
CURRENT.</entry>
</row>
<row>
<entry>602108</entry>
<entry>11.&nbsp;April&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen des 'SG'
Peripheriegerätes aus CURRENT in CAM, welches einen
Teil der SCSI SG passthrough Geräte API von Linux
enthält.</entry>
</row>
<row>
<entry>602109</entry>
<entry>17.&nbsp;April&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von readline 5.2
Patchset 002 aus CURRENT.</entry>
</row>
<row>
<entry>602110</entry>
<entry>2.&nbsp;Mai&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von
pmap_invalidate_cache(), pmap_change_attr(),
pmap_mapbios(), pmap_mapdev_attr(), und pmap_unmapbios()
für amd64 und i386 aus CURRENT.</entry>
</row>
<row>
<entry>602111</entry>
<entry>11.&nbsp;Juni&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von BOP_BDFLUSH aus
CURRENT und dem daraus resultierendem Bruch mit dem
Dateisystemmodul KBI.</entry>
</row>
<row>
<entry>602112</entry>
<entry>21.&nbsp;September&nbsp;2007</entry>
<entry>6.2-STABLE nach dem Einpflegen von libutil(3) aus
CURRENT.</entry>
</row>
<row>
<entry>602113</entry>
<entry>25.&nbsp;Oktober&nbsp;2007</entry>
<entry>6.2-STABLE, nach der Trennung in "wide und
single byte ctype". Neu kompilierte Binärdateien,
die ctype.h referenzieren, erfordern möglicherweise
ein neues Symbol, __mb_sb_limit, das auf älteren
Systemen nicht verfügbar ist.</entry>
</row>
<row>
<entry>602114</entry>
<entry>30.&nbsp;Oktober&nbsp;2007</entry>
<entry>6.2-STABLE, nachdem die ctype
ABI-Aufwärtskompatibilität wiederhergestellt
wurde.</entry>
</row>
<row>
<entry>602115</entry>
<entry>21.&nbsp;November&nbsp;2007</entry>
<entry>FreeBSD 6.2-STABLE nach der Entfernung/Eliminierung
der wide und single Byte ctype-Trennung</entry>
</row>
<row>
<entry>603000</entry>
<entry>25.&nbsp;November&nbsp;2007</entry>
<entry>6.3-RELEASE</entry>
</row>
<row>
<entry>603100</entry>
<entry>25.&nbsp;November&nbsp;2007</entry>
<entry>6.3-STABLE nach 6.3-RELEASE.</entry>
</row>
<row>
<entry>603101</entry>
<entry>7.&nbsp;Dezember&nbsp;2007</entry>
<entry>6.3-STABLE, nachdem der Support für den
Multibyte-Datentyp im Bit-Makro gefixt wurde.</entry>
</row>
<row>
<entry>603102</entry>
<entry>24.&nbsp;April&nbsp;2008</entry>
<entry>6.3-STABLE nach Hinzufügen von l_sysid zu
struct&nbsp;flock.</entry>
</row>
<row>
<entry>603103</entry>
<entry>27.&nbsp;Mai&nbsp;2008</entry>
<entry>6.3-STABLE nach Einfließen der
<function>memrchr</function>-Funktion.</entry>
</row>
<row>
<entry>603104</entry>
<entry>15.&nbsp;Juni&nbsp;2008</entry>
<entry>6.3-STABLE nach Übernahme der
Unterstützung von <literal>:u</literal> als
Variablenwandler in make(1).</entry>
</row>
<row>
<entry>604000</entry>
<entry>4.&nbsp;Oktober&nbsp;2008</entry>
<entry>6.4-RELEASE</entry>
</row>
<row>
<entry>604100</entry>
<entry>4.&nbsp;Oktober&nbsp;2008</entry>
<entry>6.4-STABLE nach 6.4-RELEASE.</entry>
</row>
<row>
<entry>700000</entry>
<entry>11.&nbsp;Juli&nbsp;2005</entry>
<entry>7.0-CURRENT.</entry>
</row>
<row>
<entry>700001</entry>
<entry>23.&nbsp;Juli&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem die Versionen aller gemeinsam
genutzten Bibliotheken, welche seit RELENG_5 nicht
geändert wurden, erhöht wurden.</entry>
</row>
<row>
<entry>700002</entry>
<entry>13.&nbsp;August&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem ein Berechtigungs-Argument zur
dev_clone-Ereignisroutine hinzugefügt wurde.</entry>
</row>
<row>
<entry>700003</entry>
<entry>25.&nbsp;August&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem memmem(3) zur libc
hinzugefügt wurde.</entry>
</row>
<row>
<entry>700004</entry>
<entry>30.&nbsp;Oktober&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem die Argumente der
Kernelfunktion solisten(9) modifiziert wurden, um einen
Backlog-Parameter (Anzahl der maximalen wartenden
Verbindungen) zu akzeptieren.</entry>
</row>
<row>
<entry>700005</entry>
<entry>11.&nbsp;November&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem IFP2ENADDR() geändert
wurde, einen Zeiger auf IF_LLADDR()
zurückzugeben.</entry>
</row>
<row>
<entry>700006</entry>
<entry>11.&nbsp;November&nbsp;2005</entry>
<entry>7.0-CURRENT nach dem Hinzufügen des
<literal>if_addr</literal>-Elements zur Struktur
<literal>ifnet</literal> und dem Entfernen von
IFP2ENADDR().</entry>
</row>
<row>
<entry>700007</entry>
<entry>2.&nbsp;Dezember&nbsp;2005</entry>
<entry>7.0-CURRENT nach dem Aufnehmen von Skripten aus den
local_startup Verzeichnissen in &man.rcorder.8; des
Basissystems.</entry>
</row>
<row>
<entry>700008</entry>
<entry>5.&nbsp;Dezember&nbsp;2005</entry>
<entry>7.0-CURRENT nach dem Entfernen der MNT_NODEV
mount-Option.</entry>
</row>
<row>
<entry>700009</entry>
<entry>19.&nbsp;Dezember&nbsp;2005</entry>
<entry>7.0-CURRENT nach ELF-64 Typen Änderungen und
Symbol Versionierung.</entry>
</row>
<row>
<entry>700010</entry>
<entry>20.&nbsp;Dezember&nbsp;2005</entry>
<entry>7.0-CURRENT nach Hinzufügen der hostb und
vgapci Treiber, Hinzufügen von pci_find_extcap() und
Änderung der AGP Treiber die Apertur nicht
länger abzubilden.</entry>
</row>
<row>
<entry>700011</entry>
<entry>31.&nbsp;Dezember&nbsp;2005</entry>
<entry>7.0-CURRENT nachdem auf allen Plattformen
außer Alpha tv_sec in time_t umgewandelt
wurde.</entry>
</row>
<row>
<entry>700012</entry>
<entry>8.&nbsp;Januar&nbsp;2006</entry>
<entry>7.0-CURRENT nach Änderung von
ldconfig_local_dirs.</entry>
</row>
<row>
<entry>700013</entry>
<entry>12.&nbsp;Januar&nbsp;2006</entry>
<entry>7.0-CURRENT nach Änderung in
<filename>/etc/rc.d/abi</filename> um
<filename>/compat/linux/etc/ld.so.cache</filename> als
Symlink in ein schreibgeschütztes Dateisystem zu
unterstützen.</entry>
</row>
<row>
<entry>700014</entry>
<entry>26.&nbsp;Januar&nbsp;2006</entry>
<entry>7.0-CURRENT nach pts Import.</entry>
</row>
<row>
<entry>700015</entry>
<entry>26.&nbsp;März&nbsp;2006</entry>
<entry>7.0-CURRENT nach Einführung von Version 2 der
&man.hwpmc.4;'s ABI.</entry>
</row>
<row>
<entry>700016</entry>
<entry>22.&nbsp;April&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen von
&man.fcloseall.3; zur libc.</entry>
</row>
<row>
<entry>700017</entry>
<entry>13.&nbsp;Mai&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Entfernen von ip6fw.</entry>
</row>
<row>
<entry>700018</entry>
<entry>15.&nbsp;Juli&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Import von snd_emu10kx.</entry>
</row>
<row>
<entry>700019</entry>
<entry>29.&nbsp;Juli&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Import von OpenSSL
0.9.8b.</entry>
</row>
<row>
<entry>700020</entry>
<entry>3.&nbsp;September&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen der
bus_dma_get_tag-Funktion</entry>
</row>
<row>
<entry>700021</entry>
<entry>4.&nbsp;September&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Import von libpcap 0.9.4 und
tcpdump 3.9.4.</entry>
</row>
<row>
<entry>700022</entry>
<entry>9.&nbsp;September&nbsp;2006</entry>
<entry>7.0-CURRENT nach der dlsym Änderung, ein
angefordertes Symbol sowohl in der spezifizierten dso, als
auch in den impliziten Abhängigkeiten
nachzuschlagen.</entry>
</row>
<row>
<entry>700023</entry>
<entry>23.&nbsp;September&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen neuer
Sound-IOCTLs für die OSSv4-Mixer-API.</entry>
</row>
<row>
<entry>700024</entry>
<entry>28.&nbsp;September&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Import von OpenSSL
0.9.8d.</entry>
</row>
<row>
<entry>700025</entry>
<entry>11.&nbsp;November&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen der
libelf.</entry>
</row>
<row>
<entry>700026</entry>
<entry>26.&nbsp;November&nbsp;2006</entry>
<entry>7.0-CURRENT nach größeren
Änderungen an den Sound sysctls.</entry>
</row>
<row>
<entry>700027</entry>
<entry>30.&nbsp;November&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen der
Wi-Spy-Eigenart.</entry>
</row>
<row>
<entry>700028</entry>
<entry>15.&nbsp;Dezember&nbsp;2006</entry>
<entry>7.0-CURRENT nach dem Hinzufügen von
sctp-Aufrufen zur libc.</entry>
</row>
<row>
<entry>700029</entry>
<entry>26.&nbsp;Januar&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Ersetzen von GNU &man.gzip.1;
durch eine von NetBSD portierte Version, die unter
BSD-Lizenz steht.</entry>
</row>
<row>
<entry>700030</entry>
<entry>7.&nbsp;Februar&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Entfernen der IPIP
Tunnelkapselung (VIFF_TUNNEL) aus dem IPv4
Multicast-Forwarding-Quelltext.</entry>
</row>
<row>
<entry>700031</entry>
<entry>23.&nbsp;Februar&nbsp;2007</entry>
<entry>7.0-CURRENT nach den Modifizierungen an
bus_setup_intr() (newbus).</entry>
</row>
<row>
<entry>700032</entry>
<entry>2.&nbsp;März&nbsp;2007</entry>
<entry>7.0-CURRENT nach der Aufnahme der Firmware für
ipw(4) und iwi(4).</entry>
</row>
<row>
<entry>700033</entry>
<entry>9.&nbsp;März&nbsp;2007</entry>
<entry>7.0-CURRENT nach Unterstützung für
Multibyte-Zeichen.</entry>
</row>
<row>
<entry>700034</entry>
<entry>19.&nbsp;März&nbsp;2007</entry>
<entry>7.0-CURRENT nach Änderungen, wie insmntque(),
getnewvnode() und vfs_hash_insert() arbeiten.</entry>
</row>
<row>
<entry>700035</entry>
<entry>26.&nbsp;März&nbsp;2007</entry>
<entry>7.0-CURRENT nach Hinzufügen eines
Benachrichtigungsmechanismus für CPU
Frequenzänderungen.</entry>
</row>
<row>
<entry>700036</entry>
<entry>6.&nbsp;April&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Import des ZFS
Dateisystemes.</entry>
</row>
<row>
<entry>700037</entry>
<entry>8.&nbsp;April&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Einpflegen des 'SG'
Peripheriegerätes in CAM, welches einen Teil der SCSI
SG passthrough Geräte API von Linux
enthält.</entry>
</row>
<row>
<entry>700038</entry>
<entry>30.&nbsp;April&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem &man.getenv.3;, &man.putenv.3;,
&man.setenv.3; und &man.unsetenv.3; geändert wurden,
um POSIX konform zu sein.</entry>
</row>
<row>
<entry>700039</entry>
<entry>1.&nbsp;Mai&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem die Änderungen von 700038
rückgängig gemacht wurden.</entry>
</row>
<row>
<entry>700040</entry>
<entry>10.&nbsp;Mai&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Hinzufügen von
&man.flopen.3; zur libutil.</entry>
</row>
<row>
<entry>700041</entry>
<entry>13.&nbsp;Mai&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem Symbol Versionierung aktiviert
und die standardmäßige Thread-Bibliothek zu
libthr geändert wurde.</entry>
</row>
<row>
<entry>700042</entry>
<entry>19.&nbsp;Mai&nbsp;2007</entry>
<entry>7.0-CURRENT nach dem Import von GCC 4.2.0.</entry>
</row>
<row>
<entry>700043</entry>
<entry>21.&nbsp;Mai&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem die Versionen aller
Shared-Libraries, welche seit RELENG_6 nicht geändert
wurden, erhöht worden sind.</entry>
</row>
<row>
<entry>700044</entry>
<entry>7.&nbsp;Juni&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem das Argument für
vn_open()/VOP_OPEN() vom Dateideskriptorindex zur Struktur
file * geädert wurde.</entry>
</row>
<row>
<entry>700045</entry>
<entry>10.&nbsp;Juni&nbsp;2007</entry>
<entry>7.0-CURRENT nachdem &man.pam.nologin.8;
geädert wurde, eine Kontoverwaltungs-Funktion statt
einer Authentifizierungsfunktion für das
PAM-Framework zur Verfügung zu stellen.</entry>
</row>
<row>
<entry>700046</entry>
<entry>11.&nbsp;Juni&nbsp;2007</entry>
<entry>7.0-CURRENT nach aktualisierter 802.11 wireless
Unterstützung.</entry>
</row>
<row>
<entry>700047</entry>
<entry>11.&nbsp;Juni&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem
TCP-LRO-Schnittstellen-Ressourcen hinzugefügt
wurden.</entry>
</row>
<row>
<entry>700048</entry>
<entry>12.&nbsp;Juni&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem die RFC&nbsp;3678
API-Unterstützung zum IPv4-Stack hinzugefügt
wurde. Veraltetes RFC&nbsp;1724-Verhalten
des IP_MULTICAST_IF ioctl wurde entfernt;
0.0.0.0/8 darf nicht länger als Schnittstellen-Index
benutzt werden. Stattdessen sollte die Struktur ipmreqn
verwendet werden.</entry>
</row>
<row>
<entry>700049</entry>
<entry>3.&nbsp;Juli&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem pf von OpenBSD&nbsp;4.1
importiert wurde</entry>
</row>
<row>
<entry>(nicht geändert)</entry>
<entry></entry>
<entry>7.0-CURRENT, nachdem die IPv6-Unterstützung
um FAST_IPSEC erweitert, KAME IPSEC entfernt und
FAST_IPSEC in IPSEC umbenannt wurde.</entry>
</row>
<row>
<entry>700050</entry>
<entry>4.&nbsp;Juli&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem Aufrufe von
setenv/putenv/usw. von der traditionellen
BSD-Art und Weise nach POSIX konvertiert
wurden.</entry>
</row>
<row>
<entry>700051</entry>
<entry>4.&nbsp;Juli&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem neue Systemaufrufe
(mmap/lseek/usw.) implementiert wurden.</entry>
</row>
<row>
<entry>700052</entry>
<entry>6.&nbsp;Juli&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem die I4B-Header nach
include/i4b verschoben wurden.</entry>
</row>
<row>
<entry>700053</entry>
<entry>30.&nbsp;September&nbsp;2007</entry>
<entry>7.0-CURRENT, nachdem die Unterstützung
für PCI Domänen hinzugefügt
wurde.</entry>
</row>
<row>
<entry>700054</entry>
<entry>25.&nbsp;Oktober&nbsp;2007</entry>
<entry>7.0-CURRENT, nach der Trennung in "wide und
single byte ctype".</entry>
</row>
<row>
<entry>700055</entry>
<entry>28.&nbsp;Oktober&nbsp;2007</entry>
<entry>7.0-RELEASE sowie 7.0-CURRENT, nachdem die
ABI-Abwärtskompatibilität für die
FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD-
sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit
verbunden war, dass die ABI der PCIOCGETCONF IOCTL
erneut deaktiviert werden musste.</entry>
</row>
<row>
<entry>700100</entry>
<entry>22.&nbsp;Dezember&nbsp;2007</entry>
<entry>7.0-STABLE nach 7.0-RELEASE.</entry>
</row>
<row>
<entry>700101</entry>
<entry>8.&nbsp;Februar&nbsp;2008</entry>
<entry>7.0-STABLE nach Einführung von
m_collapse().</entry>
</row>
<row>
<entry>700102</entry>
<entry>30.&nbsp;März&nbsp;2008</entry>
<entry>7.0-STABLE nach Einfließen von
kdb_enter_why().</entry>
</row>
<row>
<entry>700103</entry>
<entry>10.&nbsp;April&nbsp;2008</entry>
<entry>7.0-STABLE nach Hinzufügen von l_sysid zu
struct&nbsp;flock.</entry>
</row>
<row>
<entry>700104</entry>
<entry>11.&nbsp;April&nbsp;2008</entry>
<entry>7.0-STABLE nach Übernahme von
procstat(1).</entry>
</row>
<row>
<entry>700105</entry>
<entry>11.&nbsp;April&nbsp;2008</entry>
<entry>7.0-STABLE nach Einführung von
umtx-Features.</entry>
</row>
<row>
<entry>700106</entry>
<entry>15.&nbsp;April&nbsp;2008</entry>
<entry>7.0-STABLE nach Hinzufügen der
Unterstützung von &man.write.2; zu
&man.psm.4;.</entry>
</row>
<row>
<entry>700107</entry>
<entry>20.&nbsp;April&nbsp;2008</entry>
<entry>7.0-STABLE nach Hinzufügen des Befehls
F_DUP2FD zu &man.fcntl.2;.</entry>
</row>
<row>
<entry>700108</entry>
<entry>5.&nbsp;Mai&nbsp;2008</entry>
<entry>7.0-STABLE nach einigen Änderungen an
&man.lockmgr.9;, welche die Einbindung von
<filename>sys/lock.h</filename> zur Verwendung von
&man.lockmgr.9; voraussetzen.</entry>
</row>
<row>
<entry>700109</entry>
<entry>27.&nbsp;Mai&nbsp;2008</entry>
<entry>7.0-STABLE nach Einfließen der
<function>memrchr</function>-Funktion.</entry>
</row>
<row>
<entry>700110</entry>
<entry>5.&nbsp;August&nbsp;2008</entry>
<entry>7.0-STABLE nach Einführung eines Clients
für den Kernel&nbsp;NFS&nbsp;lockd.</entry>
</row>
<row>
<entry>700111</entry>
<entry>20.&nbsp;August&nbsp;2008</entry>
<entry>7.0-STABLE nach Hinzufügen einer
Unterstützung von physisch fortlaufender
Jumbo&nbsp;Frames.</entry>
</row>
<row>
<entry>700112</entry>
<entry>27.&nbsp;August&nbsp;2008</entry>
<entry>7.0-STABLE nach Einfließen einer
Kernelunterstützung für DTrace.</entry>
</row>
<row>
<entry>701000</entry>
<entry>25.&nbsp;November&nbsp;2008</entry>
<entry>7.1-RELEASE</entry>
</row>
<row>
<entry>701100</entry>
<entry>25.&nbsp;November&nbsp;2008</entry>
<entry>7.1-STABLE nach 7.1-RELEASE.</entry>
</row>
<row>
<entry>701101</entry>
<entry>10.&nbsp;Januar&nbsp;2009</entry>
<entry>7.1-STABLE nach Übernahme von
<function>strndup</function>.</entry>
</row>
<row>
<entry>701102</entry>
<entry>17.&nbsp;Januar&nbsp;2009</entry>
<entry>7.1-STABLE nach Hinzufügen einer
Unterstützung von cpuctl(4).</entry>
</row>
<row>
<entry>701103</entry>
<entry>7.&nbsp;Februar&nbsp;2009</entry>
<entry>7.1-STABLE nach Einfließen der
Unterstützung von Jails mit keinen oder mehreren
IPv4-/IPv6-Adressen.</entry>
</row>
<row>
<entry>701104</entry>
<entry>14.&nbsp;Februar&nbsp;2009</entry>
<entry>7.1-STABLE, nachdem der Besitzer des Suspend in
struct mount gespeichert wird und die Funktion
vfs_susp_clean in struct vfsops aufgenommen
ist.</entry>
</row>
<row>
<entry>701105</entry>
<entry>12.&nbsp;März&nbsp;2009</entry>
<entry>7.1-STABLE nach der inkompatiblen Änderung
am sysctl kern.ipc.shmsegs, um die Anforderung
größerer Segmente von gemeinsam genutzten
SysV-Speicher auf 64bit-Architekturen zu
erlauben.</entry>
</row>
<row>
<entry>701106</entry>
<entry>14.&nbsp;März&nbsp;2009</entry>
<entry>7.1-STABLE nach der Übernahme einer
Fehlerbehebung für Warteoperationen, die
POSIX-Semaphore verwenden.</entry>
</row>
<row>
<entry>702000</entry>
<entry>15.&nbsp;April&nbsp;2009</entry>
<entry>7.2-RELEASE</entry>
</row>
<row>
<entry>702100</entry>
<entry>15.&nbsp;April&nbsp;2009</entry>
<entry>7.2-STABLE nach 7.2-RELEASE.</entry>
</row>
<row>
<entry>702101</entry>
<entry>15.&nbsp;Mai&nbsp;2009</entry>
<entry>7.2-STABLE, nachdem ichsmb(4) dahingehend
geändert wurde, dass es links-ausgerichtete
Adressierung von Slaves verwendet, um anderen
SMBus-Kontrollertreibern zu entsprechen.</entry>
</row>
<row>
<entry>702102</entry>
<entry>28.&nbsp;Mai&nbsp;2009</entry>
<entry>7.2-STABLE nach dem Einfließen der Funktion
<function>fdopendir</function>.</entry>
</row>
<row>
<entry>702103</entry>
<entry>06.&nbsp;Juni&nbsp;2009</entry>
<entry>7.2-STABLE nach dem Einfließen von PmcTools.</entry>
</row>
<row>
<entry>702104</entry>
<entry>14.&nbsp;Juli&nbsp;2009</entry>
<entry>7.2-STABLE nach dem Einfließen des
Systemaufrufs <function>closefrom</function>.</entry>
</row>
<row>
<entry>702105</entry>
<entry>31.&nbsp;Juli&nbsp;2009</entry>
<entry>7.2-STABLE nach dem Einfließen der
Änderung an der SYSVIPC-ABI.</entry>
</row>
<row>
<entry>702106</entry>
<entry>14.&nbsp;September&nbsp;2009</entry>
<entry>7.2-STABLE nach dem Einfließen der
PAT-Verbesserungen für x86-Prozessoren sowie dem
Hinzufügen von d_mmap_single() und des
VM-Objekttyps für scatter/gather-Listen.</entry>
</row>
<row>
<entry>703000</entry>
<entry>9.&nbsp;Februar&nbsp;2010</entry>
<entry>7.3-RELEASE</entry>
</row>
<row>
<entry>703100</entry>
<entry>9.&nbsp;Februar&nbsp;2010</entry>
<entry>7.3-STABLE nach 7.3-RELEASE.</entry>
</row>
<row>
<entry>704000</entry>
<entry>22.&nbsp;Dezember&nbsp;2010</entry>
<entry>7.4-RELEASE</entry>
</row>
<row>
<entry>704100</entry>
<entry>22.&nbsp;Dezember&nbsp;2010</entry>
<entry>7.4-STABLE, nachdem 7.4-RELEASE erzeugt
wurde.</entry>
</row>
<row>
<entry>800000</entry>
<entry>11.&nbsp;Oktober&nbsp;2007</entry>
<entry>8.0-CURRENT. Nach der Trennung in "wide und
single byte ctype".</entry>
</row>
<row>
<entry>800001</entry>
<entry>16.&nbsp;Oktober&nbsp;2007</entry>
<entry>8.0-CURRENT, nachdem libpcap 0.9.8 und
tcpdump 3.9.8 importiert wurden.</entry>
</row>
<row>
<entry>800002</entry>
<entry>21.&nbsp;Oktober&nbsp;2007</entry>
<entry>8.0-CURRENT, nachdem kthread_create() und
Konsorten in kproc_create() usw. umbenannt
wurden.</entry>
</row>
<row>
<entry>800003</entry>
<entry>24.&nbsp;Oktober&nbsp;2007</entry>
<entry>8.0-CURRENT, nachdem die
ABI-Abwärtskompatibilität für die
FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD-
sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit
verbunden war, dass die ABI der PCIOCGETCONF IOCTL
erneut deaktiviert werden musste.</entry>
</row>
<row>
<entry>800004</entry>
<entry>12.&nbsp;November&nbsp;2007</entry>
<entry>8.0-CURRENT, nachdem der agp(4) Treiber verschoben
wurde von src/sys/pci nach src/sys/dev/agp.</entry>
</row>
<row>
<entry>800005</entry>
<entry>4.&nbsp;Dezember&nbsp;2007</entry>
<entry>8.0-CURRENT nach <ulink
url="http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_mbuf.c#rev1.35">Änderungen
am Jumbo&nbsp;Frame&nbsp;Allocator</ulink>.</entry>
</row>
<row>
<entry>800006</entry>
<entry>7.&nbsp;Dezember&nbsp;2007</entry>
<entry>8.0-CURRENT, nach dem Hinzufügen der
callgraph capture Funktionalität zu &man.hwpmc.4;.</entry>
</row>
<row>
<entry>800007</entry>
<entry>25.&nbsp;Dezember&nbsp;2007</entry>
<entry>8.0-CURRENT nach dem Hinzufügen von "why"
als Argument in kdb_enter().</entry>
</row>
<row>
<entry>800008</entry>
<entry>28.&nbsp;Dezember&nbsp;2007</entry>
<entry>8.0-CURRENT nach Entfernen der Option
LK_EXCLUPGRADE.</entry>
</row>
<row>
<entry>800009</entry>
<entry>9.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung von
&man.lockmgr.disown.9;</entry>
</row>
<row>
<entry>800010</entry>
<entry>10.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderungen am
&man.vn.lock.9;-Prototyp.</entry>
</row>
<row>
<entry>800011</entry>
<entry>13.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderungen an den
Prototypen von &man.VOP.LOCK.9; und
&man.VOP.UNLOCK.9;.</entry>
</row>
<row>
<entry>800012</entry>
<entry>19.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung von
&man.lockmgr.recursed.9;, &man.BUF.RECURSED.9; und
&man.BUF.ISLOCKED.9; sowie Entfernung von
<function>BUF_REFCNT()</function>.</entry>
</row>
<row>
<entry>800013</entry>
<entry>23.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der
<quote>ASCII</quote>-Kodierung.</entry>
</row>
<row>
<entry>800014</entry>
<entry>24.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderungen am
&man.lockmgr.9;-Prototyp und Entfernung von
<function>lockcount()</function> sowie
<function>LOCKMGR_ASSERT()</function>.</entry>
</row>
<row>
<entry>800015</entry>
<entry>26.&nbsp;Januar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Erweiterung der Datentypen der
&man.fts.3;-Strukturen.</entry>
</row>
<row>
<entry>800016</entry>
<entry>1.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen eines neuen
Parameters zu MEXTADD(9).</entry>
</row>
<row>
<entry>800017</entry>
<entry>6.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Optionen
LK_NODUP und LK_NOWITNESS in die
&man.lockmgr.9;-Umgebung.</entry>
</row>
<row>
<entry>800018</entry>
<entry>8.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von
m_collapse.</entry>
</row>
<row>
<entry>800019</entry>
<entry>9.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen einer Arbeits-,
Wurzel- und Jailverzeichnisunterstützung zur
sysctl-Variable kern.proc.filedesc.</entry>
</row>
<row>
<entry>800020</entry>
<entry>13.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktionen
&man.lockmgr.assert.9; und
<function>BUF_ASSERT</function>.</entry>
</row>
<row>
<entry>800021</entry>
<entry>15.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung von
&man.lockmgr.args.9; und Entfernung der Option
LK_INTERNAL.</entry>
</row>
<row>
<entry>800022</entry>
<entry>(zurückgezogen)</entry>
<entry>8.0-CURRENT nach Setzen von BSD&nbsp;&man.ar.1;
als Systemstandard.</entry>
</row>
<row>
<entry>800023</entry>
<entry>25.&nbsp;Februar&nbsp;2008</entry>
<entry>8.0-CURRENT nach Prototypenänderungen an
&man.lockstatus.9; und &man.VOP.ISLOCKED.9;, eigens zur
Abschaffung des Parameters
<literal>struct&nbsp;thread</literal>.</entry>
</row>
<row>
<entry>800024</entry>
<entry>1.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Beseitigung der Funktionen
<function>lockwaiters</function> und
<function>BUF_LOCKWAITERS</function>, Änderung
des Rückgabewerts der Funktion
<function>brelvp</function> von void nach int sowie
Einführung neuer Optionen für
&man.lockinit.9;.</entry>
</row>
<row>
<entry>800025</entry>
<entry>8.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen des Kommandos
F_DUP2FD zu &man.fcntl.2;.</entry>
</row>
<row>
<entry>800026</entry>
<entry>12.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderung des Parameters
für die Priorität an cv_broadcastpri, sodass
0 für keine Priorität steht.</entry>
</row>
<row>
<entry>800027</entry>
<entry>24.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderung der
Monitoring&nbsp;ABI von BPF, als Zero-Copy&nbsp;Puffer
hinzugefügt wurden.</entry>
</row>
<row>
<entry>800028</entry>
<entry>26.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von l_sysid zu
struct&nbsp;flock.</entry>
</row>
<row>
<entry>800029</entry>
<entry>28.&nbsp;März&nbsp;2008</entry>
<entry>8.0-CURRENT nach Wiedereingliederung der Funktion
<function>BUF_LOCKWAITERS</function> und
Hinzufügen von &man.lockmgr.waiters.9;.</entry>
</row>
<row>
<entry>800030</entry>
<entry>1.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktionen
&man.rw.try.rlock.9; und &man.rw.try.wlock.9;.</entry>
</row>
<row>
<entry>800031</entry>
<entry>6.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktionen
<function>lockmgr_rw</function> und
<function>lockmgr_args_rw</function>.</entry>
</row>
<row>
<entry>800032</entry>
<entry>8.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Implementierung des
Systemaufrufs openat und seiner Verwandten,
Einführung der Option O_EXEC in &man.open.2; und
Bereitstellung der entsprechenden Systemaufrufe
innerhalb der
&linux;-Kompatibilitätsumgebung.</entry>
</row>
<row>
<entry>800033</entry>
<entry>8.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen der
Unterstützung von &man.write.2; in der nativen
Operationsebene von &man.psm.4;. Es können nun
beliebig Kommandos nach
<devicename>/dev/psm%d</devicename> geschrieben und
der Status dann von dort gelesen werden.</entry>
</row>
<row>
<entry>800034</entry>
<entry>10.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktion
<function>memrchr</function>.</entry>
</row>
<row>
<entry>800035</entry>
<entry>16.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktion
<function>fdopendir</function>.</entry>
</row>
<row>
<entry>800036</entry>
<entry>20.&nbsp;April&nbsp;2008</entry>
<entry>8.0-CURRENT nach Umstellung des Standards 802.11
auf Unterstützung von Multi-BSS (auch
vaps).</entry>
</row>
<row>
<entry>800037</entry>
<entry>9.&nbsp;Mai&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen einer
Unterstützung für
Multi&nbsp;Routing-Tabellen (siehe setfib(1),
setfib(2)).</entry>
</row>
<row>
<entry>800038</entry>
<entry>26.&nbsp;Mai&nbsp;2008</entry>
<entry>8.0-CURRENT nach Entfernen von netatm und
ISDN4BSD sowie dem Hinzufügen der
Compact C Type (CTF)-Tools.</entry>
</row>
<row>
<entry>800039</entry>
<entry>14.&nbsp;Juni&nbsp;2008</entry>
<entry>8.0-CURRENT nach Entfernen von sgtty.</entry>
</row>
<row>
<entry>800040</entry>
<entry>26.&nbsp;Juni&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung eines Clients
für den Kernel&nbsp;NFS&nbsp;lockd.</entry>
</row>
<row>
<entry>800041</entry>
<entry>22.&nbsp;Juli&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von
arc4random_buf(3) und arc4random_uniform(3).</entry>
</row>
<row>
<entry>800042</entry>
<entry>8.&nbsp;August&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von
cpuctl(4).</entry>
</row>
<row>
<entry>800043</entry>
<entry>13.&nbsp;August&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderung von bpf(4) zur
Verwendung einer einzelnen Gerätedatei anstatt
von Klonierung.</entry>
</row>
<row>
<entry>800044</entry>
<entry>17.&nbsp;August&nbsp;2008</entry>
<entry>8.0-CURRENT nach Übernahme des ersten Teils
aus dem vimage-Projekt durch Erweitern globaler
Variablen um den Präfix V_. Zukünftig werden
die virtualisierten Variablen dann mit Hilfe von
Makros in ihre globalen Namen aufgelöst.</entry>
</row>
<row>
<entry>800045</entry>
<entry>20.&nbsp;August&nbsp;2008</entry>
<entry>8.0-CURRENT nach Eingliederung des
MPSAFE&nbsp;TTY-Layers, einschließlich
Änderungen an diversen Treibern und Werkzeugen,
die mit ihm kommunizieren.</entry>
</row>
<row>
<entry>800046</entry>
<entry>8.&nbsp;September&nbsp;2008</entry>
<entry>8.0-CURRENT nach Abschottung der GDT pro CPU auf
der AMD64-Architektur.</entry>
</row>
<row>
<entry>800047</entry>
<entry>10.&nbsp;September&nbsp;2008</entry>
<entry>8.0-CURRENT nach Entfernen von VSVTX, VSGID und
VSUID.</entry>
</row>
<row>
<entry>800048</entry>
<entry>16.&nbsp;September&nbsp;2008</entry>
<entry>8.0-CURRENT nach Anpassung des Codes für
Kernel&nbsp;NFS&nbsp;mount, sodass einzelne
Mountoptionen im Parameter struct&nbsp;iovec an
nmount() akzeptiert werden und nicht nur ein
großes struct&nbsp;nfs_args.</entry>
</row>
<row>
<entry>800049</entry>
<entry>17.&nbsp;September&nbsp;2008</entry>
<entry>8.0-CURRENT nach Entfernen von &man.suser.9; und
&man.suser.cred.9;.</entry>
</row>
<row>
<entry>800050</entry>
<entry>20.&nbsp;Oktober&nbsp;2008</entry>
<entry>8.0-CURRENT nach API-Änderungen im Umgang
mit dem Buffer&nbsp;Cache.</entry>
</row>
<row>
<entry>800051</entry>
<entry>23.&nbsp;Oktober&nbsp;2008</entry>
<entry>8.0-CURRENT nach Entfernen der Makros
&man.MALLOC.9; und &man.FREE.9;.</entry>
</row>
<row>
<entry>800052</entry>
<entry>28.&nbsp;Oktober&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung von accmode_t
und Umbennung des Parameters a_mode an VOP_ACCESS nach
a_accmode.</entry>
</row>
<row>
<entry>800053</entry>
<entry>2.&nbsp;November&nbsp;2008</entry>
<entry>8.0-CURRENT nach Änderung des Prototyps von
&man.vfs.busy.9; und Einführung der Optionen
MBF_NOWAIT sowie MBF_MNTLSTLOCK.</entry>
</row>
<row>
<entry>800054</entry>
<entry>22.&nbsp;November&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von Funktionen
im Bereich buf_ring, Memory&nbsp;Barriers und ifnet,
um mehrere Sendeschlangen auf Hardwareebene für
Karten zu ermöglichen, die dies
unterstützen, sowie einer
Ring&nbsp;Buffer-Implementierung ohne Lock, um
Treibern zu ermöglichen, Paketschlangen
effizienter zu verwalten.</entry>
</row>
<row>
<entry>800055</entry>
<entry>27.&nbsp;November&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen einer
Unterstützung für &intel;&nbsp;Core, Core2
und Atom zu &man.hwpmc.4;.</entry>
</row>
<row>
<entry>800056</entry>
<entry>29.&nbsp;November&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung von Jails mit
mehreren oder gar keinen IPv4-/IPv6-Adressen.</entry>
</row>
<row>
<entry>800057</entry>
<entry>1.&nbsp;Dezember&nbsp;2008</entry>
<entry>8.0-CURRENT nach Wechsel zum
ath_hal&nbsp;Quellcode.</entry>
</row>
<row>
<entry>800058</entry>
<entry>12.&nbsp;Dezember&nbsp;2008</entry>
<entry>8.0-CURRENT nach Einführung der Funktion
VOP_VPTOCNP.</entry>
</row>
<row>
<entry>800059</entry>
<entry>15.&nbsp;Dezember&nbsp;2008</entry>
<entry>8.0-CURRENT gliedert das neue ARPv2 ein.</entry>
</row>
<row>
<entry>800060</entry>
<entry>19.&nbsp;Dezember&nbsp;2008</entry>
<entry>8.0-CURRENT nach Hinzufügen von
makefs.</entry>
</row>
<row>
<entry>800061</entry>
<entry>15.&nbsp;Januar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Umsetzung von
TCP&nbsp;Appropriate&nbsp;Byte&nbsp;Counting.</entry>
</row>
<row>
<entry>800062</entry>
<entry>28.&nbsp;Januar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Entfernen von minor(),
minor2unit(), unit2minor() usw.</entry>
</row>
<row>
<entry>800063</entry>
<entry>18.&nbsp;Februar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderung der
GENERIC-Konfiguration zur Verwendung des
USB2-Stack und Hinzufügen von fdevname(3).</entry>
</row>
<row>
<entry>800064</entry>
<entry>23.&nbsp;Februar&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem der USB2-Stack nach dev/usb
verschoben wurde, um es zu ersetzen.</entry>
</row>
<row>
<entry>800065</entry>
<entry>26.&nbsp;Februar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Umbenennen aller Funktionen in
libmp(3).</entry>
</row>
<row>
<entry>800066</entry>
<entry>27.&nbsp;Februar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Anpassung des devfs-Verhaltens
im Zusammenhang mit USB.</entry>
</row>
<row>
<entry>800067</entry>
<entry>28.&nbsp;Februar&nbsp;2009</entry>
<entry>8.0-CURRENT nach Hinzufügen von getdelim(),
getline(), stpncpy(), strnlen(), wcsnlen(),
wcscasecmp() und wcsncasecmp().</entry>
</row>
<row>
<entry>800068</entry>
<entry>2.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT nach Umbenennen der Geräteklasse
ushub in uhub.</entry>
</row>
<row>
<entry>800069</entry>
<entry>9.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT nach Umbenennen von libusb20.so.1 in
libusb.so.1.</entry>
</row>
<row>
<entry>800070</entry>
<entry>9.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Einführung von IGMPv3
und Source-Specific-Multicast&nbsp;(SSM) in den
IPv4-Stack.</entry>
</row>
<row>
<entry>800071</entry>
<entry>14.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Anpassung von gcc zur
Verwendung der C99-Inline-Semantik in den Modi c99 und
gnu99.</entry>
</row>
<row>
<entry>800072</entry>
<entry>15.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem die Option IFF_NEEDSGIANT
entfernt wurde; Netzwerktreiber, die nicht MPSAFE
sind, werden nicht mehr unterstützt.</entry>
</row>
<row>
<entry>800073</entry>
<entry>18.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem die dynamische Ersetzung von
Zeichenkettenkürzeln für rpath und
benötigte Pfade implementiert wurde.</entry>
</row>
<row>
<entry>800074</entry>
<entry>24.&nbsp;März&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Einfließen von
tcpdump&nbsp;4.0.0 und libpcap&nbsp;1.0.0.</entry>
</row>
<row>
<entry>800075</entry>
<entry>6.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem die Deklarationen von
struct&nbsp;vnet_net, struct&nbsp;vnet_inet und
struct&nbsp;vnet_ipfw geändert wurden.</entry>
</row>
<row>
<entry>800076</entry>
<entry>9.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen von
Laufzeitprofilen in dummynet.</entry>
</row>
<row>
<entry>800077</entry>
<entry>14.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Entfernen von VOP_LEASE()
und vop_vector.vop_lease.</entry>
</row>
<row>
<entry>800078</entry>
<entry>15.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem die Felder aus
struct&nbsp;rt_weight zu struct&nbsp;rt_metrics und
struct&nbsp;rt_metrics_lite hinzugefügt wurden,
wobei die Deklaration von struct&nbsp;rt_metrics_lite
geändert wurde. RTM_VERSION wurde
hochgezählt (zurückgezogen).</entry>
</row>
<row>
<entry>800079</entry>
<entry>15.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem Pointer auf
struct&nbsp;llentry zu struct&nbsp;route und
struct&nbsp;route_in6 hinzugefügt wurden.</entry>
</row>
<row>
<entry>800080</entry>
<entry>15.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderung der Deklaration
von struct&nbsp;inpcb.</entry>
</row>
<row>
<entry>800081</entry>
<entry>19.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderung der Deklaration
von struct&nbsp;malloc_type.</entry>
</row>
<row>
<entry>800082</entry>
<entry>21.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderung der Deklaration
von struct&nbsp;ifnet und Hinzufügen von if_ref()
und if_rele() zur Verwaltung von Referenzen auf
ifnet.</entry>
</row>
<row>
<entry>800083</entry>
<entry>22.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Implementierung einer
systemnahen Bluetooth-HCI-API.</entry>
</row>
<row>
<entry>800084</entry>
<entry>29.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderungen an IPv6-SSM und
MLDv2.</entry>
</row>
<row>
<entry>800085</entry>
<entry>30.&nbsp;April&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem der Bau von VIMAGE-Kernel
mit einem aktiven Image unterstützt wird.</entry>
</row>
<row>
<entry>800086</entry>
<entry>8.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach Hinzufügen der
Unterstützung für Eingabezeilen mit
beliebiger Länge durch patch(1).</entry>
</row>
<row>
<entry>800087</entry>
<entry>11.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach einigen Änderungen im
Zusammenhang mit dem VFS-KPI. Der Thread-Parameter
wurde von den FSD-Teilen des VFS entfernt.
<function>VFS_*</function>-Funktionen benötigen
den Kontext nicht mehr, da er sich immer auf
<varname>curthread</varname> bezieht. In wenigen
Sonderfällen ist das bisherige Verhalten nicht
geändert worden.</entry>
</row>
<row>
<entry>800088</entry>
<entry>20.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderungen am
net80211-Monitormodus.</entry>
</row>
<row>
<entry>800089</entry>
<entry>23.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen der
Unterstützung von UDP-Kontrollblocks.</entry>
</row>
<row>
<entry>800090</entry>
<entry>23.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Virtualisierung der
Schnittstellenklonierung.</entry>
</row>
<row>
<entry>800091</entry>
<entry>27.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen von
hierarchischen Jails und dem Entfernen des globalen
securelevel.</entry>
</row>
<row>
<entry>800092</entry>
<entry>29.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Änderung des
<function>sx_init_flags()</function>-KPI.
<constant>SX_ADAPTIVESPIN</constant> wurde
zurückgezogen und eine neue Option
<constant>SX_NOADAPTIVE</constant> wurde
eingeführt, um die umgekehrte Logik zu
behandeln.</entry>
</row>
<row>
<entry>800093</entry>
<entry>29.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen von
mnt_xflag zu struct&nbsp;mount.</entry>
</row>
<row>
<entry>800094</entry>
<entry>30.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen von
&man.VOP.ACCESSX.9;.</entry>
</row>
<row>
<entry>800095</entry>
<entry>30.&nbsp;Mai&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Änderung des
Polling-KPI. Die Polling-Handler liefern nun die Zahl
der verarbeiteten Pakete zurück. Die neue Option
<constant>IFCAP_POLLING_NOCOUNT</constant> wurde
weiter eingeführt, um anzugeben, dass der
Rückgabewert nicht von Bedeutung ist und das
Zählen der Pakete ausgelassen werden
soll.</entry>
</row>
<row>
<entry>800096</entry>
<entry>1.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Aktualisierung der
netisr-Implementierung und nachdem die Weise, wie FIBs
gespeichert werden und wie auf sie zugegriffen wird,
geändert wurde.</entry>
<!--
Waren ursprünglich 96 und 97 und wurden wegen
Zahlenmangel zusammengefasst.
-->
</row>
<row>
<entry>800097</entry>
<entry>8.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach Einführung der
Destruktor-Infrastruktur für vnet
einschließlich Hooks.</entry>
</row>
<row>
<entry>800097</entry>
<entry>11.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach Einführung eines
Erkennungssystems für ausgehende Pakete, die
direkt wieder in netgraph gelangen und deswegen
eingereiht werden. Dabei wurde auch die Definition von
struct thread geändert.</entry>
</row>
<row>
<entry>800098</entry>
<entry>14.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Einfließen von OpenSSL
0.9.8k.</entry>
</row>
<row>
<entry>800099</entry>
<entry>22.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Aktualisierung von NGROUPS
und dem Verschieben der Routing-Virtualisierung in ein
eigenes VImage-Modul.</entry>
</row>
<row>
<entry>800100</entry>
<entry>24.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach Änderung der
SYSVIPC-ABI.</entry>
</row>
<row>
<entry>800101</entry>
<entry>29.&nbsp;Juni&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Entfernen der
zeichenorientierten Geräte aus /dev/net, von
denen für jede Schnittstelle eines
existiert.</entry>
</row>
<row>
<entry>800102</entry>
<entry>12.&nbsp;Juli&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem struct sackhint, struct
tcpcb und struct tcpstat mit Padding-Bytes
aufgefüllt wurden.</entry>
</row>
<row>
<entry>800103</entry>
<entry>13.&nbsp;Juli&nbsp;2009</entry>
<entry>8.0-CURRENT, nachdem struct tcpopt durch struct
toeopt in der Schnittstelle zwischen dem TOE-Treiber
und dem TCP-SYN-Cache ersetzt wurde.</entry>
</row>
<row>
<entry>800104</entry>
<entry>19.&nbsp;Juli&nbsp;2009</entry>
<entry>8.0-CURRENT nach dem Hinzufügen einer
vnet-spezifischen Speicherzuweisung, die auf dem
Linker-Set-Verfahren basiert.</entry>
</row>
<row>
<entry>800105</entry>
<entry>19.&nbsp;Juli&nbsp;2009</entry>
<entry>8.0-CURRENT nach der Inkrementierung der
Versionsnummer aller Shared-Libraries, die
Symbol-Versioning nicht aktiviert haben.</entry>
</row>
<row>
<entry>800106</entry>
<entry>24.&nbsp;Juli&nbsp;2009</entry>
<entry>8.0-CURRENT nach Einführung des
VM-Objekttyps OBJT_SG.</entry>
</row>
<row>
<entry>800107</entry>
<entry>2.&nbsp;August&nbsp;2009</entry>
<entry>8.0-CURRENT nach Befreiung des Newbus-Subsystems
von Giant durch Hinzufügen von sxlock und
8.0-RELEASE.</entry>
</row>
<row>
<entry>800108</entry>
<entry>21.&nbsp;November&nbsp;2009</entry>
<entry>8.0-CURRENT nach Implementierung des
kevent-Filters EVFILT_USER.</entry>
</row>
<row>
<entry>800500</entry>
<entry>7.&nbsp;Januar&nbsp;2010</entry>
<entry>8.0-STABLE nach Erhöhung von
<literal>__FreeBSD_version</literal>, damit
<command>pkg_add -r</command> packages-8-stable
verwendet.</entry>
</row>
<row>
<entry>800501</entry>
<entry>24.&nbsp;Januar&nbsp;2010</entry>
<entry>8.0-STABLE, nachdem die Prototypen von
<function>scandir(3)</function> und
<function>alphasort(3)</function> geändert
wurden, um der SUSv4 zu entsprechen.</entry>
</row>
<row>
<entry>800502</entry>
<entry>31.&nbsp;Januar&nbsp;2010</entry>
<entry>8.0-STABLE nach Hinzufügen von
<function>sigpause(3)</function>.</entry>
</row>
<row>
<entry>800503</entry>
<entry>25.&nbsp;Februar&nbsp;2010</entry>
<entry>8.0-STABLE nach dem Hinzufügen der ioctls
SIOCGIFDESCR und SIOCSIFDESCR für
Netzwerk-Schnittstellen. Diese ioctls können,
nach dem Vorbild von OpenBSD, dazu verwendet werden,
Schnittstellenbeschreibungen zu bearbeiten und
auszulesen.</entry>
</row>
<row>
<entry>800504</entry>
<entry>1.&nbsp;März&nbsp;2010</entry>
<entry>8.0-STABLE, nachdem x86emu, ein Software-Emulator
von OpenBSD für x86-Prozessoren im Real-Mode, von
CURRENT übernommen wurde.</entry>
</row>
<row>
<entry>800505</entry>
<entry>18.&nbsp;Mai&nbsp;2010</entry>
<entry>8.0-STABLE nach dem Einfließen von liblzma,
xz, xzdec und lzmainfo.</entry>
</row>
<row>
<entry>801000</entry>
<entry>14.&nbsp;Juni&nbsp;2010</entry>
<entry>8.1-RELEASE</entry>
</row>
<row>
<entry>801500</entry>
<entry>14.&nbsp;Juni&nbsp;2010</entry>
<entry>8.1-STABLE nach 8.1-RELEASE.</entry>
</row>
<row>
<entry>801501</entry>
<entry>November 3, 2010</entry>
<entry>8.1-STABLE nach der KBI-Änderung in
struct sysentve und der Implementierung von
PL_FLAG_SCE/SCX/EXEC/SI und
pl_siginfo für ptrace(PT_LWPINFO) .</entry>
</row>
<row>
<entry>802000</entry>
<entry>22.&nbsp;Dezember&nbsp;2010</entry>
<entry>8.2-RELEASE</entry>
</row>
<row>
<entry>802500</entry>
<entry>22.&nbsp;Dezember&nbsp;2010</entry>
<entry>8.2-STABLE, nachdem 8.2-RELEASE erzeugt
wurde.</entry>
</row>
<row>
<entry>802501</entry>
<entry>28.&nbsp;Februar&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem DTrace aktualisiert wurde (so wird
nun auch Userland-Tracing unterstützt).</entry>
</row>
<row>
<entry>802502</entry>
<entry>6.&nbsp;März&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem log2 und log2f in libm aufgenommen
wurden.</entry>
</row>
<row>
<entry>802503</entry>
<entry>1.&nbsp;Mai&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem gcc auf die letzte unter der GPLv2
stehenden Version (aus dem FSF gcc-4_2-Zweig) aktualisiert
wurde.</entry>
</row>
<row>
<entry>802504</entry>
<entry>28.&nbsp;Mai&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem KPI sowie die Infrastruktur zur
Unterstützung von <quote>modular congestion
control</quote> implementiert wurden.</entry>
</row>
<row>
<entry>802505</entry>
<entry>28.&nbsp;Mai&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem die KPIs Hhook und Khelp
implementiert wurden.</entry>
</row>
<row>
<entry>802506</entry>
<entry>M28.&nbsp;Mai&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem OSD in die Struktur tcpcb
eingebaut wurde.</entry>
</row>
<row>
<entry>802507</entry>
<entry>6.&nbsp;Juni&nbsp;2011</entry>
<entry>8.2-STABLE nach dem Import von ZFS v28.</entry>
</row>
<row>
<entry>802508</entry>
<entry>8.&nbsp;Juni&nbsp;2011</entry>
<entry>8.2-STABLE, nach dem Entfernen der Methode
sv_schedtail struct sysvec.</entry>
</row>
<row>
<entry>802509</entry>
<entry>14.&nbsp;Juli&nbsp;2011</entry>
<entry>8.2-STABLE, nachdem die binutils um die
SSSE3-Unterstützung erweitert wurden.</entry>
</row>
<row>
<entry>802510</entry>
<entry>19.&nbsp;Juli&nbsp;2011</entry>
<entry>8.2-STABLE, nach dem Hinzufügen des Flags
RFTSIGZMB zu <function>rfork(2)</function>.</entry>
</row>
<row>
<entry>900000</entry>
<entry>22.&nbsp;August&nbsp;2009</entry>
<entry>9.0-CURRENT.</entry>
</row>
<row>
<entry>900001</entry>
<entry>8.&nbsp;September&nbsp;2009</entry>
<entry>9.0-CURRENT nach dem Import von x86emu, einem
Software-Emulator von OpenBSD für x86-Prozessoren
im Real-Mode.</entry>
</row>
<row>
<entry>900002</entry>
<entry>23.&nbsp;September&nbsp;2009</entry>
<entry>9.0-CURRENT nach Implementierung des
kevent-Filters EVFILT_USER.</entry>
</row>
<row>
<entry>900003</entry>
<entry>2.&nbsp;Dezember&nbsp;2009</entry>
<entry>9.0-CURRENT nach Hinzufügen von
<function>sigpause(3)</function> und der
PIE-Unterstützung zu csu.</entry>
</row>
<row>
<entry>900004</entry>
<entry>6.&nbsp;Dezember&nbsp;2009</entry>
<entry>9.0-CURRENT nach Hinzufügen von libulog und
dessen
libutempter-Kompatibilitätsschnittstelle.</entry>
</row>
<row>
<entry>900005</entry>
<entry>12.&nbsp;Dezember&nbsp;2009</entry>
<entry>9.0-CURRENT nach Hinzufügen von
<function>sleepq_sleepcnt()</function>, das dazu
verwendet werden kann, die Anzahl der in einer
bestimmten Warteschlange eingereihten Threads
abzufragen.</entry>
</row>
<row>
<entry>900006</entry>
<entry>4.&nbsp;Januar&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem die Prototypen von
<function>scandir(3)</function> und
<function>alphasort(3)</function> geändert
wurden, um der SUSv4 zu entsprechen.</entry>
</row>
<row>
<entry>900007</entry>
<entry>13.&nbsp;Januar&nbsp;2010</entry>
<entry>9.0-CURRENT nach dem Entfernen von utmp(5) und
dem Hinzufügen von utmpx (siehe
<function>getutxent(3)</function>) zur besseren
Erfassung von Benutzeranmeldungen und
Systemereignissen.</entry>
</row>
<row>
<entry>900008</entry>
<entry>20.&nbsp;Januar&nbsp;2010</entry>
<entry>9.0-CURRENT nach der Einführung von BSDL
bc/dc zur Ersetzung von GNU bc/dc.</entry>
</row>
<row>
<entry>900009</entry>
<entry>26.&nbsp;Januar&nbsp;2010</entry>
<entry>9.0-CURRENT nach dem Hinzufügen der ioctls
SIOCGIFDESCR und SIOCSIFDESCR für
Netzwerk-Schnittstellen. Diese ioctls können,
nach dem Vorbild von OpenBSD, dazu verwendet werden,
Schnittstellenbeschreibungen zu bearbeiten und
auszulesen.</entry>
</row>
<row>
<entry>900010</entry>
<entry>22.&nbsp;März&nbsp;2010</entry>
<entry>9.0-CURRENT nach dem Import von zlib
1.2.4.</entry>
</row>
<row>
<entry>900011</entry>
<entry>24.&nbsp;April&nbsp;2010</entry>
<entry>9.0-CURRENT nach Hinzufügen von Soft Updates
Journaling.</entry>
</row>
<row>
<entry>900012</entry>
<entry>10.&nbsp;Mai&nbsp;2010</entry>
<entry>9.0-CURRENT nach Hinzufügen von liblzma, xz,
xzdec und lzmainfo.</entry>
</row>
<row>
<entry>900013</entry>
<entry>24.&nbsp;Mai&nbsp;2010</entry>
<entry>9.0-CURRENT nach Einbringen von
USB-Fehlerbehebungen in linux(4).</entry>
</row>
<row>
<entry>900014</entry>
<entry>10.&nbsp;Juni&nbsp;2010</entry>
<entry>9.0-CURRENT nach Hinzufügen von
Clang.</entry>
</row>
<row>
<entry>900015</entry>
<entry>22.&nbsp;Juli&nbsp;2010</entry>
<entry>9.0-CURRENT nach dem Import von BSD grep.</entry>
</row>
<row>
<entry>900016</entry>
<entry>28.&nbsp;Juli&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem mti_zone zu
struct malloc_type_internal hinzugefügt
wurde.</entry>
</row>
<row>
<entry>900017</entry>
<entry>23.&nbsp;August&nbsp;2010</entry>
<entry>9.0-CURRENT nach dem Zurückkehren zu GNU
grep als Standard und Hinzufügen der Option
WITH_BSD_GREP.</entry>
</row>
<row>
<entry>900018</entry>
<entry>24.&nbsp;August&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem das von
<function>pthread_kill(3)</function> generierte Signal
in si_code als SI_LWP bezeichnet wird. Zuvor war
si_code SI_USER.</entry>
</row>
<row>
<entry>900019</entry>
<entry>28.&nbsp;August&nbsp;2010</entry>
<entry>9.0-CURRENT nach Hinzufügen des Schalters
MAP_PREFAULT_READ zu
<function>mmap(2)</function>.</entry>
</row>
<row>
<entry>900020</entry>
<entry>9.&nbsp;September&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem
<quote>drain</quote>-Funktionalität
in sbufs integriert wurde (wodurch sich auch das
Layout von struct sbuf geändert hat).</entry>
</row>
<row>
<entry>900021</entry>
<entry>13.&nbsp;September&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem <quote>Userland
tracing</quote> in DTrace eingeführt
wurde.</entry>
</row>
<row>
<entry>900022</entry>
<entry>2.&nbsp;Oktober&nbsp;2010</entry>
<entry>9.0-CURRENT nach Hinzufügen der
BSDL man-Utilities (und gleichzeitigem
Entfernen der GNU/GPL man-Utilities).</entry>
</row>
<row>
<entry>900023</entry>
<entry>11.&nbsp;Oktober&nbsp;2010</entry>
<entry>9.0-CURRENT nach der Aktualisierung von
xz auf den git-Snapshot 20101010.</entry>
</row>
<row>
<entry>900024</entry>
<entry>11.&nbsp;November&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem libgcc.a durch
libcompiler_rt.a.</entry>
</row>
<row>
<entry>900025</entry>
<entry>12.&nbsp;November&nbsp;2010</entry>
<entry>9.0-CURRENT nach der Einführung
von <quote>modularised congestion
control</quote>.</entry>
</row>
<row>
<entry>900026</entry>
<entry>30.&nbsp;November&nbsp;2010</entry>
<entry>9.0-CURRENT nach der Einführung von
<quote>Serial Management Protocol (SMP)
passthrough</quote> sowie den XPT_SMP_IO und
XPT_GDEV_ADVINFO CAM CCBs.</entry>
</row>
<row>
<entry>900027</entry>
<entry>5.&nbsp;Dezember&nbsp;2010</entry>
<entry>9.0-CURRENT, nachdem log2 zu libm
hinzugefügt wurde.</entry>
</row>
<row>
<entry>900028</entry>
<entry>21.&nbsp;Dezember&nbsp;2010</entry>
<entry>9.0-CURRENT, nach dem HInzufügen von Hhook
(Helper Hook), Khelp (Kernel Helpers) und Object Specific
Data (OSD) KPIs.</entry>
</row>
<row>
<entry>900029</entry>
<entry>28.&nbsp;Dezember&nbsp;2010</entry>
<entry>9.0-CURRENT, nach der TCP-Stack modifiziert wurde, um
es den Khelp-Modulen zu erlauben, mit ihm über
Helper Hook Points zu kommunizieren und Verbindungsdaten
im TCP-Kontrollblock zu speichern.</entry>
</row>
<row>
<entry>900030</entry>
<entry>12.&nbsp;Januar&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem libdialog auf die Version
20100428 aktualisiert wurde.</entry>
</row>
<row>
<entry>900031</entry>
<entry>7.&nbsp;Februar&nbsp;2011</entry>
<entry>9.0-CURRENT, nach dem Hinzufügen von
<function>pthread_getthreadid_np(3)</function>.</entry>
</row>
<row>
<entry>900032</entry>
<entry>8.&nbsp;Februar&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem Prototyp und Symbol für
uio_yield entfernt wurden.</entry>
</row>
<row>
<entry>900033</entry>
<entry>18.&nbsp;Februar&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem die binutils auf Version
2.17.50 aktualisiert wurden.</entry>
</row>
<row>
<entry>900034</entry>
<entry>8.&nbsp;März&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem die Struktur
sysvec (sv_schedtail) modifiziert wurde.</entry>
</row>
<row>
<entry>900035</entry>
<entry>29.&nbsp;März&nbsp;20111</entry>
<entry>9.0-CURRENT, nach dem Update des im
Basissystem enthaltenen gcc sowie von libstdc++
auf die letzten unter GPLv2 lizenzierten Versionen.</entry>
</row>
<row>
<entry>900036</entry>
<entry>18.&nbsp;April&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem libobjc und die Unterstützung
für Objective-C aus dem Basissystem entfernt
wurden.</entry>
</row>
<row>
<entry>900037</entry>
<entry>13.&nbsp;Mai&nbsp;2011</entry>
<entry>9.0-CURRENT, nach dem Import der
libprocstat(3)-Bibliothek sowie von fuser(1) in das
Basissystem.</entry>
</row>
<row>
<entry>900038</entry>
<entry>22.&nbsp;Mai&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem ein Lock-Flag zu VFS_FHTOVP(9)
hinzugefügt wurde.</entry>
</row>
<row>
<entry>900039</entry>
<entry>28.&nbsp;Juni&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem pf von OpenBSD&nbsp;4.5 importiert
wurde.</entry>
</row>
<row>
<entry>900040</entry>
<entry>19. Juli 2011</entry>
<entry>Standardmäßige Erhöhung von MAXCPU für &os; auf
64 für amd64 und ia64 und auf 128 für XLP
(mips).</entry>
</row>
<row>
<entry>900041</entry>
<entry>13.&nbsp;August&nbsp;2011</entry>
<entry>9.0-CURRENT, nachdem Capsicum-Funktionalitäten
implementiert wurden. Zusätzlich wurde fget(9) um ein
Rechte-Argument erweitert.</entry>
</row>
<row>
<entry>900042</entry>
<entry>28. August 2011</entry>
<entry>Versionssprünge für Shared-Libraries deren ABI
sich geändert hat, in Vorbereitung für 9.0.</entry>
</row>
<row>
<entry>900043</entry>
<entry>2. September 2011</entry>
<entry>Automatische Erkennung von USB-Massenspeicher
Geräten, die das no synchronize cache SCSI Kommando
nicht unterstützen.</entry>
</row>
<row>
<entry>900044</entry>
<entry>10. September 2011</entry>
<entry>Re-factor auto-quirk.</entry>
</row>
<row>
<entry>900045</entry>
<entry>13. Oktober 2011</entry>
<entry>Allen nicht-kompatiblen
Systemaufruf-Einstiegspunkten wurde ein sys_
vorangestellt.</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>Beachten Sie, dass 2.2-STABLE sich nach dem
2.2.5-RELEASE manchmal als <quote>2.2.5-STABLE</quote>
identifiziert. Das Muster war früher das Jahr gefolgt
von dem Monat, aber wir haben uns entschieden, ab 2.2. einen
geradlinigeren Ansatz mit major/minor-Nummern zu benutzen.
Dies liegt daran, dass gleichzeitiges Entwickeln an mehreren
Zweigen es unmöglich macht, die Versionen nur mit Hilfe
des Datums des Releases zu unterteilen. Wenn Sie jetzt einen
Port erstellen brauchen Sie sich nicht um alte -CURRENTs zu
kümmern; diese sind hier nur als Referenz
augeführt.</para>
</note>
</sect1>
<sect1 id="dads-after-port-mk">
<title>Etwas hinter die
<filename>bsd.port.mk</filename>-Anweisung schreiben</title>
<para>Schreiben Sie bitte nichts hinter die <literal>.include
&lt;bsd.port.mk&gt;</literal>-Zeile. Normalerweise kann dies
vermieden werden, indem Sie die Datei
<filename>bsd.port.pre.mk</filename> irgendwo in der Mitte
Ihres <filename>Makefile</filename>s und
<filename>bsd.port.post.mk</filename> am Ende
einfügen.</para>
<note>
<para>Sie dürfen entweder nur das
<filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>-Paar
oder <filename>bsd.port.mk</filename> alleine
hinzufügen; vermischen Sie diese Verwendungen
nicht!</para>
</note>
<para><filename>bsd.port.pre.mk</filename> definiert nur
einige Variablen, welche in Tests im
<filename>Makefile</filename> benutzt werden können,
<filename>bsd.port.post.mk</filename> definiert den
Rest.</para>
<para>Hier sind einige wichtige Variablen, welche in
<filename>bsd.port.pre.mk</filename> definiert sind (dies ist
keine vollständige Liste, lesen Sie bitte
<filename>bsd.port.mk</filename> für eine
vollständige Auflistung).</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry>Variable</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>ARCH</makevar></entry>
<entry>Die Architektur, wie von <command>uname
-m</command> zurückgegeben (z.B.
<literal>i386</literal>)</entry>
</row>
<row>
<entry><makevar>OPSYS</makevar></entry>
<entry>Der Typ des Betriebsystems, wie von <command>uname
-s</command> zurückgegeben (z.B.
<literal>FreeBSD</literal>)</entry>
</row>
<row>
<entry><makevar>OSREL</makevar></entry>
<entry>Die Release Version des Betriebssystems (z.B.,
<literal>2.1.5</literal> oder
<literal>2.2.7</literal>)</entry>
</row>
<row>
<entry><makevar>OSVERSION</makevar></entry>
<entry>Die numerische Version des Betriebssystems;
gleichbedeutend mit <link
linkend="freebsd-versions"><literal>__FreeBSD_version</literal></link>.</entry>
</row>
<row>
<entry><makevar>PORTOBJFORMAT</makevar></entry>
<entry>Das Objektformat des Systems
(<literal>elf</literal> oder <literal>aout</literal>;
beachten Sie, dass für <quote>moderne</quote>
Versionen von FreeBSD <literal>aout</literal> veraltet
ist).</entry>
</row>
<row>
<entry><makevar>LOCALBASE</makevar></entry>
<entry>Die Basis des <quote>local</quote>
Verzeichnisbaumes (z.B.
<literal>/usr/local/</literal>)</entry>
</row>
<row>
<entry><makevar>PREFIX</makevar></entry>
<entry>Wo der Port sich selbst installiert (siehe <link
linkend="porting-prefix"> Mehr Informationen über
<makevar>PREFIX</makevar></link>).</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para>Falls Sie die Variablen <makevar>USE_IMAKE</makevar>,
<makevar>USE_X_PREFIX</makevar>, oder
<makevar>MASTERDIR</makevar> definieren müssen, sollten
Sie dies vor dem Einfügen von
<filename>bsd.port.pre.mk</filename> machen.</para>
</note>
<para>Hier sind ein paar Beispiele von Dingen, die Sie hinter
die Anweisung <filename>bsd.port.pre.mk</filename> schreiben
können:</para>
<programlisting># lang/perl5 muss nicht kompliliert werden, falls perl5 schon auf dem System ist
.if ${OSVERSION} &gt; 300003
BROKEN= perl ist im System
.endif
# nur eine Versionsnummer für die ELF Version der shlib
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif
# die Software erstellt schon eine Verknüpfung fü ELF, aber nicht fü a.out
post-install:
.if ${PORTOBJFORMAT} == "aout"
${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif</programlisting>
<para>Sie haben sich daran erinnert Tabulator statt
Leerzeichen nach <literal>BROKEN=</literal> und
<literal>TCL_LIB_FILE=</literal> zu benutzen, oder?
<!-- smiley -->:-).</para>
</sect1>
<sect1 id="dads-sh-exec">
<title>Benutzen Sie die <function>exec</function>-Anweisung in
Wrapper-Skripten</title>
<para>Falls der Port ein Shellskript installiert, dessen Zweck
es ist ein anderes Programm zu starten, und falls das Starten
des Programmes die letzte Aktion des Skripts ist, sollten Sie
sicherstellen, dass Sie die Funktion <function>exec</function>
dafür benutzen; zum Beispiel:</para>
<programlisting>#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"</programlisting>
<para>Die Funktion <function>exec</function> ersetzt den
Shell-Prozess mit dem angegebenen Programm. Falls
<function>exec</function> ausgelassen wird, verbleibt der
Shell-Prozess im Speicher während das Programm
ausgefährt wird und verbraucht unnötig
Systemressourcen.</para>
</sect1>
<sect1 id="dads-rational">
<title>Aufgaben vernünftig lösen</title>
<para>Das <filename>Makefile</filename> sollte die
nötigen Schritte einfach und vernünftig
durchführen. Wenn Sie ein einige Zeilen einsparen oder
die Lesbarkeit verbessern können, dann machen Sie dies
bitte. Beispiele sind: Ein make-Konstrukt
<literal>.if</literal> anstatt eines Shellkonstrukt
<literal>if</literal> zu verwenden, anstatt
<maketarget>do-extract</maketarget> neu zu definieren, dies
mit <makevar>EXTRACT*</makevar> machen, oder
<makevar>GNU_CONFIGURE</makevar> anstelle von
<literal>CONFIGURE_ARGS += --prefix=&dollar;{PREFIX}</literal>
zu verwenden.</para>
<para>Falls Sie sich in einer Situation wiederfinden, in der
Sie viel Code neu schreiben müssen, um etwas zu testen,
sollten Sie zuerst <filename>bsd.port.mk</filename> erneut
konsultieren und nachprüfen ob es nicht bereits eine
Lösung für Ihr Problem enthält. Es ist zwar
schwer zu lesen, beinhaltet jedoch eine Menge kurzer
Lösungen für viele scheinbar schwierige
Probleme.</para>
</sect1>
<sect1 id="dads-cc">
<title>Berücksichtigen Sie sowohl <makevar>CC</makevar> als
auch <makevar>CXX</makevar></title>
<para>Der Port sollte sowohl die <makevar>CC</makevar>- wie
auch die <makevar>CXX</makevar>-Variable berücksichtigen.
Damit ist gemeint, dass der Port diese Variablen nicht ohne
Rücksicht auf eventuell schon gesetzte Werte einfach
überschreiben sollte; stattdessen sollten neue Werte an
schon existierende angehängt werden. Dadurch können
Build-Optionen, die alle Ports betreffen, global definiert
werden.</para>
<para>Falls der Port diese Variablen nicht
berücksichtigt, sollte <literal>NO_PACKAGE=ignores either
cc or cxx</literal> ins <filename>Makefile</filename>
eingefügt werden.</para>
<para>Im Folgenden wird ein Beispiel eines
<filename>Makefile</filename>s gezeigt, welches die beiden
Variablen <makevar>CC</makevar> und <makevar>CXX</makevar>
berücksichtigt. Beachten Sie das
<makevar>?=</makevar>:</para>
<programlisting>CC?= gcc</programlisting>
<programlisting>CXX?= g++</programlisting>
<para>Nachfolgend ein Beispiel, welches weder
<makevar>CC</makevar> noch <makevar>CXX</makevar>
berücksichtigt:</para>
<programlisting>CC= gcc</programlisting>
<programlisting>CXX= g++</programlisting>
<para>Die Variablen <makevar>CC</makevar> und
<makevar>CXX</makevar> können auf FreeBSD-Systemen in
<filename>/etc/make.conf</filename> definiert werden. Im
ersten Beispiel wird ein Wert nur dann gesetzt, falls dieser
vorher noch nicht gesetzt war, um so systemweite Definitionen
zu berücksichtigen. Im zweiten Beispiel werden die
Variablen ohne Rücksicht überschrieben.</para>
</sect1>
<sect1 id="dads-cflags">
<title>Berücksichtigen Sie
<makevar>CFLAGS</makevar></title>
<para>Der Port sollte die Variable <makevar>CFLAGS</makevar>
berücksichtigen. Damit ist gemeint, dass der Port den
Wert dieser Variablen nicht absolut setzen und damit
existierende Werte überschreiben sollte; stattdessen
sollte er weitere Werte der Variablen durch Anhängen
hinzufügen. Dadurch können Build-Optionen, die alle
Ports betreffen, global definiert werden.</para>
<para>Falls der Port diese Variablen nicht
berücksichtigt, sollte <literal>NO_PACKAGE=ignores
cflags</literal> ins <filename>Makefile</filename>
eingefügt werden.</para>
<para>Im Folgenden wird ein Beispiel eines
<filename>Makefile</filename>s gezeigt, welches die Variable
<makevar>CFLAGS</makevar> berücksichtigt. Beachten Sie
das <makevar>+=</makevar>:</para>
<programlisting>CFLAGS+= -Wall -Werror</programlisting>
<para>Nachfolgend finden Sie ein Beispiel, welches die
<makevar>CFLAGS</makevar>-Variable nicht
berücksichtigt:</para>
<programlisting>CFLAGS= -Wall -Werror</programlisting>
<para>Die Variable <makevar>CFLAGS</makevar> wird auf
FreeBSD-Systemen in <filename>/etc/make.conf</filename>
definiert. Im ersten Beispiel werden weitere Flags an die
Variable <makevar>CFLAGS</makevar> angehängt und somit
der bestehende Wert nicht gelöscht. Im zweiten Beispiel
wird die Variable ohne Rücksicht
überschrieben.</para>
<para>Sie sollten Optimierungsflags aus
<filename>Makefile</filename>s Dritter entfernen. Die
<makevar>CFLAGS</makevar> des Systems beinhalten systemweite
Optimierungsflags. Ein Beispiel eines unveränderten
<filename>Makefile</filename>s:</para>
<programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting>
<para>Werden nun systemweite Optimierungsflags verwendet so
würde das <filename>Makefile</filename> in etwa
folgendermaßen aussehen:</para>
<programlisting>CFLAGS+= -DHAVE_SOUND</programlisting>
</sect1>
<sect1 id="dads-pthread">
<title>Threading-Bibliotheken</title>
<para>Die Threading-Bibliothek muss mit Hilfe eines speziellen
Linker-Flags <literal>-pthread</literal> in die
Binärdateien unter &os; gebunden werden. Falls ein Port
auf ein direktes Verlinken gegen <literal>-lpthread</literal>
oder <literal>-lc_r</literal> besteht, passen Sie den Port
bitte so an, dass er die durch das Port-Framework
bereitgestellte Variable <makevar>PTHREAD_LIBS</makevar>
verwendet. Diese Variable hat üblicherweise den Wert
<literal>-pthread</literal>, kann aber auf einigen
Architekturen und &os;-Versionen abweichende Werte haben und
daher sollte nie <literal>-pthread</literal> direkt in Patches
geschrieben werden, sondern immer
<makevar>PTHREAD_LIBS</makevar>.</para>
<note>
<para>Falls durch das Setzen von
<makevar>PTHREAD_LIBS</makevar> der Bau des Ports mit der
Fehlermeldung <literal>unrecognized option
'-pthread'</literal> abbricht, kann die Verwendung des
<command>gcc</command> als Linker durch setzen von
<makevar>CONFIGURE_ENV</makevar> auf
<literal>LD=${CC}</literal> helfen. Die Option
<literal>-pthread</literal> wird nicht direkt von
<command>ld</command> unterstützt.</para>
</note>
</sect1>
<sect1 id="dads-freedback">
<title>Rückmeldungen</title>
<para>Brauchbare Änderungen/Patches sollten an den
ursprünglichen Autor/Maintainer der Software geschickt
werden, damit diese in der nächsten Version der Software
mit aufgenommen werden können. Dadurch wird Ihre Aufgabe
für die nächste Version der Software deutlich
einfacher.</para>
</sect1>
<sect1 id="dads-readme">
<title><filename>README.html</filename></title>
<para>Nehmen Sie bitte keine <filename>README.html</filename>
in den Port auf. Diese Datei ist kein Bestandteil der
CVS-Sammlung sondern wird durch <command>make readme</command>
erzeugt.</para>
</sect1>
<sect1 id="dads-noinstall">
<title>Einen Port durch <makevar>BROKEN</makevar>,
<makevar>FORBIDDEN</makevar> oder <makevar>IGNORE</makevar> als
nicht installierbar markieren</title>
<para>In manchen Fällen sollten Benutzer davon abgehalten
werden einen Port zu installieren. Um einem Benutzer
mitzuteilen, dass ein Port nicht installiert werden sollte,
gibt es mehrere Variablen für <command>make</command>,
die im <filename>Makefile</filename> des Ports genutzt werden
können. Der Wert der folgenden
<command>make</command>-Variablen wird dem Benutzer als Grund
für die Ablehnung der Installation des Ports
zurückgegeben. Bitte benutzen Sie die richtige
<command>make</command>-Variable, denn jede enthält eine
völlig andere Bedeutung für den Benutzer und das
automatische System, das von dem <filename>Makefile</filename>
abhängt, wie <link linkend="build-cluster">der
Ports-Build-Custer</link>, <link
linkend="freshports">FreshPorts</link> und <link
linkend="portsmon">portsmon</link>.</para>
<sect2 id="dads-noinstall-variables">
<title>Variablen</title>
<itemizedlist>
<listitem>
<para><makevar>BROKEN</makevar> ist reserviert für
Ports, welche momentan nicht korrekt kompiliert,
installiert oder deinstalliert werden. Es sollte
für Ports benutzt werden, von denen man annimmt,
dass dies ein temporäres Problem ist.</para>
<para>Falls angegeben, wird der Build-Cluster dennoch
versuchen den Port zu bauen, um zu sehen, ob das
zugrunde liegende Problem behoben wurde (das ist jedoch
im Allgemeinen nicht der Fall).</para>
<para>Benutzen Sie <makevar>BROKEN</makevar> zum
Beispiel, wenn ein Port:</para>
<itemizedlist>
<listitem>
<para>nicht kompiliert</para>
</listitem>
<listitem>
<para>beim Konfiguration- oder Installation-Prozess
scheitert</para>
</listitem>
<listitem>
<para>Dateien außerhalb von
<filename>${LOCALBASE}</filename> installiert</para>
</listitem>
<listitem>
<para>beim Deinstallieren nicht alle seine Dateien
sauber entfernt (jedoch kann es akzeptable und
wünschenswert sein, Dateien, die vom Nutzer
verändert wurden, nicht zu entfernen)</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><makevar>FORBIDDEN</makevar> wird für Ports
verwendet, die Sicherheitslücken enthalten oder die
ernste Sicherheitsbedenken für das FreeBSD-System
aufwerfen, wenn sie installiert sind (z.B. ein als
unsicher bekanntes Programm, oder ein Programm, das
einen Dienst zur Verfügung stellt, der leicht
kompromittiert werden kann). Ports sollten als
<makevar>FORBIDDEN</makevar> gekennzeichnet werden,
sobald ein Programm eine Schwachstelle hat und kein
Update veröffentlicht wurde. Idealerweise sollten
Ports so bald wie möglich aktualisiert werden wenn
eine Sicherheitslücke entdeckt wurde, um die Zahl
verwundbarer FreeBSD-Hosts zu verringern (wir
schätzen es für unsere Sicherheit bekannt zu
sein), obwohl es manchmal einen beachtlichen Zeitabstand
zwischen der Bekanntmachung einer Schwachstelle und dem
entsprechenden Update gibt. Bitte kennzeichnen Sie einen
Port nicht aus irgendeinem Grund außer Sicherheit
als <makevar>FORBIDDEN</makevar>.</para>
</listitem>
<listitem>
<para><makevar>IGNORE</makevar> ist für Ports
reserviert, die aus anderen Gründen nicht gebaut
werden sollten. Es sollte für Ports verwendet
werden, in denen ein strukturelles Problem vermutet
wird. Der Build-Cluster wird unter keinen Umständen
Ports, die mit <makevar>IGNORE</makevar> markiert sind,
erstellen. Verwenden Sie <makevar>IGNORE</makevar> zum
Beispiel, wenn ein Port:</para>
<itemizedlist>
<listitem>
<para>kompiliert, aber nicht richtig läuft</para>
</listitem>
<listitem>
<para>nicht auf der installierten Version von &os;
läuft</para>
</listitem>
<listitem>
<para>&os; Kernelquelltext zum Bauen benötigt,
aber der Benutzer diese nicht installiert hat</para>
</listitem>
<listitem>
<para>ein Distfile benötigt, welches aufgrund
von Lizenzbeschränkungen nicht automatisch
abgerufen werden kann</para>
</listitem>
<listitem>
<para>nicht korrekt mit einem momentan installiertem
Port arbeitet (der Port hängt zum Beispiel von
<filename role="package">www/apache21</filename> ab,
aber <filename
role="package">www/apache13</filename> ist
installiert)</para>
</listitem>
</itemizedlist>
<note>
<para>Wenn ein Port mit einem momentan installiertem
Port kollidiert (zum Beispiel, wenn beide eine Datei
an die selbe Stelle installieren, diese aber eine
andere Funktion hat), benutzen Sie stattdessen
<makevar>CONFLICTS</makevar>.
<makevar>CONFLICTS</makevar> setzt
<makevar>IGNORE</makevar> dann
selbstständig.</para>
</note>
</listitem>
<listitem>
<para>Um einen Port nur auf bestimmte
Systemarchitekturen mit <makevar>IGNORE</makevar> zu
markieren, gibt es zwei Variablen, die automatisch
<makevar>IGNORE</makevar> für Sie setzen:
<makevar>ONLY_FOR_ARCHS</makevar> und
<makevar>NOT_FOR_ARCHS</makevar>. Beispiele:</para>
<programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting>
<programlisting>NOT_FOR_ARCHS= alpha ia64 sparc64</programlisting>
<para>Eine eigene <makevar>IGNORE</makevar>-Ausgabe kann
mit <makevar>ONLY_FOR_ARCHS_REASON</makevar> und
<makevar>NOT_FOR_ARCHS_REASON</makevar> festgelegt
werden. Für eine bestimmte Architektur sind
Angaben durch
<makevar>ONLY_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></makevar>
und
<makevar>NOT_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></makevar>
möglich.</para>
</listitem>
<listitem>
<para>Wenn ein Port i386-Binärdateien
herunterlädt und installiert, sollte
<makevar>IA32_BINARY_PORT</makevar> gesetzt werden. Wenn
die Variable gesetzt ist, wird überprüft, ob
das Verzeichnis <filename>/usr/lib32</filename> für
IA32-Versionen der Bibliotheken vorhanden ist, und ob
der Kernel mit IA32-Kompatibilität gebaut wurde.
Wenn eine dieser zwei Voraussetzungen nicht erfüllt
ist, wird <makevar>IGNORE</makevar> automatisch
gesetzt.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="dads-noinstall-notes">
<title>Anmerkungen zur Implementierung</title>
<para>Zeichenketten sollten nicht in Anführungszeichen
gesetzt werden. Auch die Wortwahl der Zeichenketten sollte
die Art und Weise beachten, wie die Informationen dem Nutzer
angezeigt werden. Beispiele:</para>
<programlisting>BROKEN= this port is unsupported on FreeBSD 5.x</programlisting>
<programlisting>IGNORE= is unsupported on FreeBSD 5.x</programlisting>
<para>resultieren in den folgenden Ausgaben von
<command>make describe</command>:</para>
<programlisting>===&gt; foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.</programlisting>
<programlisting>===&gt; foobar-0.1 is unsupported on FreeBSD 5.x.</programlisting>
</sect2>
</sect1>
<sect1 id="dads-deprecated">
<title>Kennzeichnen eines Ports zur Entfernung durch
<makevar>DEPRECATED</makevar> oder
<makevar>EXPIRATION_DATE</makevar></title>
<para>Denken Sie bitte daran, dass <makevar>BROKEN</makevar>
und <makevar>FORBIDDEN</makevar> nur als temporärer
Ausweg verwendet werden sollten, wenn ein Port nicht
funktioniert. Dauerhaft defekte Ports sollten komplett aus der
Ports-Sammlung entfernt werden.</para>
<para>Wenn es sinnvoll ist, können Benutzer vor der
anstehenden Entfernung eines Ports mit
<makevar>DEPRECATED</makevar> und
<makevar>EXPIRATION_DATE</makevar> gewarnt werden. Ersteres
ist einfach eine Zeichenkette, die angibt, warum der Port
entfernt werden soll. Letzteres ist eine Zeichenkette im ISO
8601-Format (JJJJ-MM-TT). Beides wird dem Benutzer
gezeigt.</para>
<para>Es ist möglich <makevar>DEPRECATED</makevar> ohne
<makevar>EXPIRATION_DATE</makevar> zu setzen (zum Beispiel, um
eine neuere Version des Ports zu empfehlen), aber das
Gegenteil ist sinnlos.</para>
<para>Es gibt keine Vorschrift wie lange die Vorwarnzeit sein
muss. Gegenwärtig ist es üblich einen Monat für
sicherheitsrelevante Probleme und zwei Monate für
Build-Probleme anzusetzen. Dies gibt allen interessierten
Committern ein wenig Zeit die Probleme zu beheben.</para>
</sect1>
<sect1 id="dads-dot-error">
<title>Vermeiden Sie den Gebrauch des
<literal>.error</literal>-Konstruktes</title>
<para>Der korrekte Weg eines <filename>Makefile</filename>
anzuzeigen, dass der Port aufgrund eines externen Grundes
nicht installiert werden kann (zum Beispiel, weil der Benutzer
eine ungültige Kombination von Build-Optionen angegeben
hat), ist <makevar>IGNORE</makevar> auf einen nicht leeren
Wert zu setzen. Dieser wird dann formatiert und dem Benutzer
von <command>make install</command> ausgegeben.</para>
<para>Es ist ein verbreiteter Fehler <literal>.error</literal>
für diesem Zweck zu verwenden. Das Problem dabei ist,
dass viele automatisierte Werkzeuge, die mit dem Ports-Baum
arbeiten, in dieser Situation fehlschlagen. Am Häufigsten
tritt das Problem beim Versuch
<filename>/usr/ports/INDEX</filename> zu bauen auf (siehe
<xref linkend="make-describe"/>). Jedoch schlagen auch
trivialere Befehle wie <command>make maintainer</command>
in diesem Fall fehl. Dies ist nicht akzeptabel!</para>
<example id="dot-error-breaks-index">
<title>Wie vermeidet man die Verwendung von
<literal>.error</literal></title>
<para>Nehmen Sie an, dass die Zeile
<programlisting>USE_POINTYHAT=yes</programlisting> in
<filename>make.conf</filename> enthalten ist. Der erste der
folgenden zwei <filename>Makefile</filename>-Schnipsel
lässt <command>make index</command> fehlschlagen,
während der zweite dies nicht tut.</para>
<programlisting>.if USE_POINTYHAT
.error "POINTYHAT is not supported"
.endif</programlisting>
<programlisting>.if USE_POINTYHAT
IGNORE=POINTYHAT is not supported
.endif</programlisting>
</example>
</sect1>
<sect1 id="dads-sysctl">
<title>Verwendung von <filename>sysctl</filename></title>
<para>Vom Gebrauch von sysctl wird, außer in Targets,
abgeraten. Das liegt daran, dass die Auswertung aller
<literal>makevar</literal>s, wie sie während
<command>make index</command> verwendet werden, dann den
Befehl ausführen muss, welches den Prozess weiter
verlangsamt.</para>
<para>Die Verwendung von &man.sysctl.8; sollte immer durch die
Variable <makevar>SYSCTL</makevar> erfolgen, da diese den
vollständigen Pfad enthält und überschrieben
werden kann, so dies als notwendig erachtet wird.</para>
</sect1>
<sect1 id="dads-rerolling-distfiles">
<title>Erneutes Ausliefern von Distfiles</title>
<para>Manchmal ändern die Autoren der Software den Inhalt
veröffentlichter Distfiles, ohne den Dateinamen zu
ändern. Sie müssen überprüfen, ob die
Änderungen offizell sind und vom Autor durchgeführt
wurden. Es ist in der Vergangenheit vorgekommen, dass
Distfiles still und heimlich auf dem Download-Server
geändert wurden, um Schaden zu verursachen oder die
Sicherheit der Nutzer zu kompromittieren.</para>
<para>Verschieben Sie das alte Distfile und laden Sie das neue
herunter. Entpacken Sie es und vergleichen Sie den Inhalt
mittels &man.diff.1;. Wenn Sie nichts Verdächtiges sehen
können Sie <filename>distinfo</filename> aktualisieren.
Stellen Sie sicher, dass die Änderungen in Ihrem PR oder
Commit-Protokoll zusammengefasst sind, um zu
Gewährleisten, dass nichts Negatives passiert ist.</para>
<para>Sie können auch mit den Autoren der Software in
Verbindung treten und sich die Änderungen bestätigen
lassen.</para>
</sect1>
<sect1 id="dads-misc">
<title>Verschiedenes</title>
<para>Die Dateien <filename>pkg-descr</filename> und
<filename>pkg-plist</filename> sollten beide doppelt
kontrolliert werden. Wenn Sie einen Port nachprüfen und
glauben, dass man es besser machen kann, dann verbessern Sie
ihn bitte.</para>
<para>Bitte kopieren Sie nicht noch mehr Exemplare der
GNU General Public License in unser System.</para>
<para>Bitte überprüfen Sie alle gesetzlichen Punkte
gründlich! Lassen Sie uns bitte keine illegale Software
verbreiten!</para>
</sect1>
</chapter>
<chapter id="porting-samplem">
<title>Beispiel eines <filename>Makefile</filename></title>
<para>Hier ein Beispiel für ein
<filename>Makefile</filename>, welches als Vorlage für
einen neuen Port dienen kann. Alle zusätzlichen Kommentare
in eckigen Klammern müssen entfernt werden!</para>
<para>Es wird empfohlen, die hier gezeigte Formatierung zu
übernehmen (Reihenfolge der Variablen, Leerzeichen zwischen
einzelnen Abschnitten, usw.). Dadurch werden die wichtigen
Informationen sofort ersichtlich. Zur Überprüfung
Ihres <filename>Makefile</filename>s sollten Sie <link
linkend="porting-portlint">portlint</link> verwenden.</para>
<programlisting>[the header...just to make it easier for us to identify the ports.]
# New ports collection makefile for: xdvi
[the "version required" line is only needed when the PORTVERSION
variable is not specific enough to describe the port.]
# Date created: 26 May 1995
[this is the person who did the original port to FreeBSD, in particular, the
person who wrote the first version of this Makefile. Remember, this should
not be changed when upgrading the port later.]
# Whom: Satoshi Asami &lt;asami@FreeBSD.org&gt;
#
# &dollar;FreeBSD&dollar;
[ ^^^^^^^^^ This will be automatically replaced with RCS ID string by CVS
when it is committed to our repository. If upgrading a port, do not alter
this line back to "&dollar;FreeBSD&dollar;". CVS deals with it automatically.]
#
[section to describe the port itself and the master site - PORTNAME
and PORTVERSION are always first, followed by CATEGORIES,
and then MASTER_SITES, which can be followed by MASTER_SITE_SUBDIR.
PKGNAMEPREFIX and PKGNAMESUFFIX, if needed, will be after that.
Then comes DISTNAME, EXTRACT_SUFX and/or DISTFILES, and then
EXTRACT_ONLY, as necessary.]
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
[do not forget the trailing slash ("/")!
if you are not using MASTER_SITE_* macros]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
[set this if the source is not in the standard ".tar.gz" form]
EXTRACT_SUFX= .tar.Z
[section for distributed patches -- can be empty]
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
[maintainer; *mandatory*! This is the person who is volunteering to
handle port updates, build breakages, and to whom a users can direct
questions and bug reports. To keep the quality of the Ports Collection
as high as possible, we no longer accept new ports that are assigned to
"ports@FreeBSD.org".]
MAINTAINER= asami@FreeBSD.org
COMMENT= A DVI Previewer for the X Window System
[dependencies -- can be empty]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm
[this section is for other standard bsd.port.mk variables that do not
belong to any of the above]
[If it asks questions during configure, build, install...]
IS_INTERACTIVE= yes
[If it extracts to a directory other than ${DISTNAME}...]
WRKSRC= ${WRKDIR}/xdvi-new
[If the distributed patches were not made relative to ${WRKSRC}, you
may need to tweak this]
PATCH_DIST_STRIP= -p1
[If it requires a "configure" script generated by GNU autoconf to be run]
GNU_CONFIGURE= yes
[If it requires GNU make, not /usr/bin/make, to build...]
USE_GMAKE= yes
[If it is an X application and requires "xmkmf -a" to be run...]
USE_IMAKE= yes
[et cetera.]
[non-standard variables to be used in the rules below]
MY_FAVORITE_RESPONSE= "yeah, right"
[then the special rules, in the order they are called]
pre-fetch:
i go fetch something, yeah
post-patch:
i need to do something after patch, great
pre-install:
and then some more stuff before installing, wow
[and then the epilogue]
.include &lt;bsd.port.mk&gt;</programlisting>
</chapter>
<chapter id="keeping-up">
<title>Auf dem Laufenden bleiben</title>
<para>Die &os; Ports-Sammlung verändert sich ständig.
Hier finden Sie einige Informationen, wie Sie auf dem Laufenden
bleiben.</para>
<sect1 id="freshports">
<title>FreshPorts</title>
<para>Einer der einfachsten Wege, um sich über
Aktualisierungen, die bereits durchgeführt wurden, zu
informieren, ist sich bei <ulink
url="http://www.FreshPorts.org/">FreshPorts</ulink>
anzumelden. Sie können dort beliebige Ports
auswählen, die Sie beobachten möchten. Maintainern
wird ausdrücklich empfohlen sich anzumelden, da Sie nicht
nur über Ihre eigenen Änderungen informiert werden,
sondern auch über die aller anderen Committer (Diese sind
oft nötig, um über Änderungen des zugrunde
liegenden Frameworks informiert zu bleiben. Obwohl es
höflich wäre, vorher über solche
Änderungen benachrichtigt zu werden, wird es manchmal
vergessen oder ist einfach nicht möglich. Außerdem
sind die Änderungen manchmal nur sehr klein. Wir erwarten
von jedem in solchen Fällen nach bestem Gewissen zu
urteilen).</para>
<para>Wenn Sie Fresh-Ports benutzen möchten,
benötigen Sie nur einen Account. Falls Sie sich mit einer
<literal>@FreeBSD.org</literal> E-Mailadresse registriert
haben, werden Sie den Anmeldelink am rechten Rand der Seite
finden. Diejenigen, die bereits einen FeshPorts-Account
haben, aber nicht Ihre <literal>@FreeBSD.org</literal>
E-Mailadresse benutzen, können einfach Ihre E-Mailadresse
auf <literal>@FreeBSD.org</literal> ändern, sich
anmelden, und dann die Änderung rückgängig
machen.</para>
<para>FreshPorts bietet auch eine
Überprüfungsfunktion, die automatisch alle Committs
zum &os; Ports-Baum testet. Wenn Sie sich für diesen
Dienst anmelden, werden Sie über alle Fehler, die bei der
Überprüfung Ihres Committs auftreten,
informiert.</para>
</sect1>
<sect1 id="cvsweb">
<title>Die Webschnittstelle zum Quelltext-Repository</title>
<para>Es ist möglich die Dateien des Quellen-Repositories
mit Hilfe einer Webschnittstelle durchzusehen.
Änderungen, die das gesamte Ports-System betreffen,
werden jetzt in der Datei <ulink
url="http://cvsweb.FreeBSD.org/ports/CHANGES">CHANGES</ulink>
dokumentiert. Solche, die nur bestimmte Ports betreffen, in
der Datei <ulink
url="http://cvsweb.FreeBSD.org/ports/UPDATING">UPDATING</ulink>.
Aber die maßgebliche Antwort auf alle Fragen liegt
zweifellos darin, den Quelltext von <ulink
url="http://cvsweb.FreeBSD.org/ports/Mk/bsd.port.mk">bsd.port.mk</ulink>
und dazugehörige Dateien zu lesen.</para>
</sect1>
<sect1 id="ports-mailling-list">
<title>Die &os; Ports-Mailingliste</title>
<para>Wenn Sie Maintainer sind, sollten Sie in Erwägung
ziehen die &a.ports;-Mailingliste zu verfolgen. Wichtige
Änderungen an der grundlegenden Funktionsweise von Ports
werden dort angekündigt und dann in
<filename>CHANGES</filename> committet.</para>
</sect1>
<sect1 id="build-cluster">
<title>Der Cluster zum Bauen von &os;-Ports auf <hostid
role="hostname">pointyhat.FreeBSD.org</hostid></title>
<para>Eine der weniger bekannten Stärken von &os; ist es,
dass ein ganzer Cluster von Maschinen nur dafür
reserviert ist, andauernd die Ports-Sammlung zu bauen, und
zwar für jedes große &os; Release und jede
Tier-1-Architektur. Die Ergebnisse können Sie unter
<ulink url="http://pointyhat.FreeBSD.org/">package building
logs and errors</ulink> finden.</para>
<para>Alle Ports ausser denjenigen, die als
<makevar>IGNORE</makevar> markiert sind, werden gebaut. Ports,
die als <makevar>BROKEN</makevar> markiert sind, werden
dennoch ausprobiert, um zu sehen, ob das zugrunde liegende
Problem gelöst wurde (Dies wird erreicht, indem
<makevar>TRYBROKEN</makevar> an das
<filename>Makefile</filename> des Ports übergeben
wird).</para>
</sect1>
<sect1 id="distfile-survey">
<title>Der &os; Ports-Distfile-Scanner</title>
<para>Der Build-Cluster ist dazu bestimmt, das neueste Release
jedes Ports aus bereits heruntergeladenden Distfiles zu bauen.
Da sich das Internet aber ständig verändert,
können Distfiles schnell verloren gehen. Der <ulink
url="http://www.portscout.org">FreeBSD
Ports-Distfile-Scanner</ulink> versucht jeden
Download-Standort für jeden Port anzufragen, um
herauszufinden, ob jedes Distfile noch verfügbar ist.
Maintainer werden gebeten diesen Bericht regelmäßig
durchzusehen, nicht nur, um den Build-Prozess für die
Nutzer zu beschleunigen, sondern auch um zu vermeiden, dass
auf den Maschinen, die freiwillig zur Verfügung gestellt
werden, um all diese Dateien anzubieten, Ressourcen
verschwendet werden.</para>
</sect1>
<sect1 id="portsmon">
<title>Das &os; Ports-Monitoring-System</title>
<para>Eine weitere praktische Ressource ist das <ulink
url="http://portsmon.FreeBSD.org">FreeBSD
Ports-Monitoring-System</ulink> (auch bekannt als
<literal>portsmon</literal>). Dieses System besteht aus einer
Datenbank, die Informationen von mehreren Quellen bezieht und
es erlaubt diese über ein Webinterface abzufragen.
Momentan werden die Ports-Problemberichte (PRs), die
Fehlerprotokolle des Build-Clusters und die einzelnen Dateien
der Ports-Sammlung verwendet. In Zukunft soll das auf die
Distfile-Prüfung und weitere Informationsquellen
ausgedehnt werden.</para>
<para>Als Ausgangspunkt können Sie alle Informationen
eines Ports mit Hilfe der <ulink
url="http://portsmon.FreeBSD.org/portoverview.py">Übersicht
eines Ports</ulink> betrachten.</para>
<para>Zum Zeitpunkt des Schreibens ist dies die einzige
Quelle, die GNATS PR-Einträge auf Portnamen abbildet
(PR-Einreicher geben den Portnamen nicht immer in der
Zusammenfassung an, obwohl wir uns das wünschen
würden). Also ist <literal>portsmon</literal> ein guter
Anlaufpunkt, wenn Sie herausfinden wollen, ob zu einem
existierenden Port PRs oder Buildfehler eingetragen sind. Oder
um herauszufinden, ob ein neuer Port, den Sie erstellen
wollen, bereits eingereicht wurde.</para>
</sect1>
</chapter>
</book>