diff --git a/de_DE.ISO8859-1/articles/contributing-ports/article.sgml b/de_DE.ISO8859-1/articles/contributing-ports/article.sgml
index 25f8a73360..3718d87484 100644
--- a/de_DE.ISO8859-1/articles/contributing-ports/article.sgml
+++ b/de_DE.ISO8859-1/articles/contributing-ports/article.sgml
@@ -1,934 +1,932 @@
%articles.ent;
]>
Zur FreeBSD Ports-Sammlung beitragen$FreeBSD$Dieser Artikel beschreibt, wie man zur FreeBSD Ports-Sammlung
beitragen kann.Übersetzt von Martin Wilke.SamLawranceMarkLinimon
&tm-attrib.freebsd;
&tm-attrib.general;
Ports, beitragenEinleitungDie Ports-Sammlung ist ständig in Bearbeitung. Wir
wollen unseren Benutzern eine einfach zu verwendende,
aktuelle und qualitativ hochwertige Quelle für Software
von Drittanbietern bereitstellen. Deshalb suchen wir immer
Personen, die etwas von ihrer Zeit aufwenden können,
um uns dabei zu helfen.An der Ports-Sammlung zu arbeiten
ist ein hervorragender Weg, um zu helfen und dem Projekt
etwas zurück zu geben. Egal, ob Sie eine dauerhafte
Funktion oder eine kleine Aufgabe für einen
regnerischen Tag suchen - wir würden uns über
Ihre Hilfe freuen!Als Freiwillige/r setzen Sie sich selbst Grenzen.
Sie sollten sich aber immer bewusst sein, dass andere
Mitglieder der &os; Community möglicherweise auch
etwas von Ihnen erwarten. Sie sollten dies auf jeden
Fall in Ihre Entscheidung mit einbeziehen.Was Sie tun können, um uns zu helfenUm die Ports-Sammlung aktuell und in einem sauberen Zustand
zu halten, sind viele Dinge zu erledigen:Finden Sie eine begehrte oder nützliche
Software und erstellen Sie einen Port.Es gibt eine große Anzahl von Ports, die keinen
Maintainer haben. Werden Sie Maintainer und betreuen Sie einen Port.Wenn Sie einen Port erstellt haben oder betreuen,
vergessen Sie nicht, welche Aufgaben ein Maintainer
hat.Wenn Sie nur eine kleine Aufgabe suchen,
könnten Sie beispielsweise einen Bug oder defekten
Port fixen.Erstellen Sie einen neuen PortEs gibt ein eigenes Handbuch, das beim Erstellen
(und Aktualisieren) von Ports hilft. Es heißt Porter-Handbuch.
Das Porter-Handbuch ist die beste Referenz, um mit
dem Ports-System zu arbeiten. Es enthält Details
darüber, wie das Ports-System funktioniert und wie
man mit/an den Ports arbeitet.Übernahme eines nicht betreuten PortsEinen nicht betreuten Port aussuchenDie Betreuung eines Ports ist ein guter Weg zu helfen.
Nicht betreute Ports bleiben nur aktuell und stabil, wenn ein
Freiwilliger dafür sorgt. Es gibt eine grosse Anzahl
nicht betreuter Ports, daher ist es eine gute Idee für
den Einstieg, einen verwaisten Port zu übernehmen, den
Sie auch regelmässig selbst verwenden.Nicht betreute Ports haben als MAINTAINER
den Wert ports@FreeBSD.org. Eine Liste
der derzeit nicht betreuten Ports sowie Informationen zu deren
aktuellen Fehlern und Problemen können Sie unter
&os; Ports Monitoring System einsehen.Einige Ports beeinflussen durch Abhängigkeiten
und Slave-Port-Beziehungen eine grosse
Anzahl anderer Ports. Generell ist es ratsam, dass
Maintainer über ein Mindestmaß an Erfahrung
verfügen, bevor Sie derartige Ports betreuen.Um herauszufinden, ob ein Port Abhängigkeiten
oder Slave-Ports hat, können Sie im
Master-Port-Index/usr/ports/INDEX nachsehen. (Der Name der
Datei kann bei den einzelnen Releases von FreeBSD variieren,
z.B. INDEX-6). Einige Ports haben
bedingte Abhängigkeiten, die nicht im Standard-Index
INDEX zu finden sind. Wir erwarten, dass
Sie in der Lage sind, solche Ports zu erkennen, indem Sie sich
die Makefiles anderer Ports ansehen.Wie man einen Port übernimmtBitte vergewissern Sie sich, dass Sie die
Aufgaben eines Maintainers
verstanden haben. Lesen Sie bitte auch das
Porter-Handbuch.
Übernehmen Sie nicht mehr Aufgaben, als Sie
bewältigen können.Sie können einen nicht reservierten Port jederzeit
übernehmen, die Entscheidung liegt bei Ihnen. Wenn
Sie dazu bereit sind, setzen Sie MAINTAINER
auf Ihre E-Mail-Adresse und reichen einen Problembericht (PR)
mit den von Ihnen vorgenommenen Änderungen ein. Wenn beim
Kompilieren des Ports Fehler auftreten oder eine Aktualisierung
notwendig ist, können Sie derartige Änderungen dem
selben PR beifügen. Das ist sehr hilfreich, weil sich viele
Committer weigern, die Wartung eines Ports zu übergeben,
wenn jemand nicht die nötige Erfahrung mit &os; vorweisen
kann. Das Einreichen von PRs, die Kompilierfehler beheben oder
Ports aktualisieren, ist der beste Weg, um Erfahrung zu
sammeln.Erstellen Sie Ihren PR mit der
categoryports
und der classchange-request. Ein Committer wird
Ihren PR analysieren, die Änderungen committen und danach
den PR abschließen. Manchmal kann dieser Prozess eine
Weile dauern (auch Committer sind "nur" freiwillige
Helfer!).Die Herausforderung als Ports-Maintainer Dieser Abschnitt erklärt, warum Ports betreut werden
müssen, und beschreibt die Pflichten eines
Ports-Maintainers.Warum müssen Ports betreut werden?Einen Port zu erstellen ist eine einmalige Sache.
Sicherzustellen, dass ein Port aktuell ist und auch in Zukunft
funktioniert, erfordert hingegen eine laufende Betreuung
und einen nicht zu unterschätzenden Arbeitsaufwand.
Maintainer sind Personen, die einen Teil ihrer Zeit dazu
verwenden, einen Port für andere FreeBSD-Anwender aktuell
und einfach installierbar zu halten.Der wichtigste Grund für die Betreuung von Ports
ist der Wunsch, der &os;-Community die neueste und beste
Drittanbieter-Software zur Verfügung zu stellen. Eine
zusätzliche Herausforderung ist die Aufrechterhaltung
der Funktionalität einzelner Ports innerhalb der
sich verändernden Ports-Sammlung.Als Ports-Maintainer werden Sie folgende
Herausforderungen meistern:Neue Software-Versionen und AktualisierungenNeue Versionen und Aktualisierung von bereits
portierter Software werden kontinuierlich
veröffentlicht und müssen in die Ports-Sammlung
integriert werden, um aktuelle Software ausliefern zu
können.Änderungen an Abhängigkeiten ihres
PortsWenn bedeutende Änderungen an den
Abhängigkeiten Ihres Ports gemacht wurden,
kann es vonnöten sein, diesen zu aktualisieren,
damit er weiterhin korrekt funktioniert.Änderungen an abhängigen PortsWenn andere Ports von einem Ihrer betreuten
Ports abhängig sind, müssen Änderungen
eventuell mit anderen Maintainern abgesprochen
werden.Zusammenwirken von anderen Benutzern,
Maintainern und EntwicklernEin Teil der Aufgabe eines Maintainers ist es,
Support zu leisten. Damit ist kein Hauptsupport
für die Software gemeint (wir haben allerdings nichts
dagegen, wenn Sie sich dennoch entscheiden, dies zu tun).
Ihre Aufgabe ist aber, sich um &os;-spezifische
Fragen zu Ihren Ports zu kümmern.Bugs findenEine Portierung könnte vielleicht von
&os;-spezifischen Bugs beeinflusst werden. In einem solchen
Fall ist es Ihre Aufgabe, den Fehler zu finden und zu
beheben. Daher sollten Sie Ihren Port umfassend testen,
um derartige Probleme zu entdecken, bevor Sie einen
Port in die Ports-Sammlung aufnehmen.Änderungen an Ports, Infrastruktur und
LizenzenGelegentlich werden die Werkzeuge für das Bauen von Ports
erneuert oder es wird ein neuer Vorschlag zur
Infrastruktur der Ports-Sammlung gemacht. Sie sollten von
diesen Änderungen wissen, falls Ihre Ports betroffen
sind und aktualisiert werden müssen.Änderungen am Basissystem&os; ist in ständiger Entwicklung.
Änderungen an Software, Bibliotheken, dem Kernel
oder sogar Lizenzänderungen können
Änderungsbedarf an den Ports auslösen.Aufgaben eines MaintainersHalten Sie Ihre Ports aktuellDieser Abschnitt bietet einen kurzen Überblick zu
diesem Thema. Ausführliche Informationen zur
Aktualisierung von Ports finden Sie im Porter-Handbuch.Achten Sie auf AktualisierungenÜberwachen Sie Ihr Programm auf neue Versionen
der Software, Aktualisierungen und Security-Fixes.
Ankündigungen in Mailinglisten oder auf
Nachrichtenseiten im Internet sind dabei sehr
hilfreich. Manchmal werden Sie von Benutzern gefragt
werden, wann Ihr Port eine Aktualisierung bekommt.
Wenn Sie mit anderen Dingen beschäftigt sind oder aus
sonstigen Gründen keine Aktualisierung
bereitstellen können, fragen Sie den Benutzer
doch einfach, ob er Ihnen bei der Aktualisierung
helfen möchte.Es kann auch vorkommen, dass Sie eine automatisch
generierte E-Mail vom
&os; Ports Version Check
bekommen, die Sie darüber informiert, dass eine
aktuellere Version des Distfiles Ihres Ports
verfügbar ist. Weitere Informationen über
dieses System (inklusive einer Erklärung, wie Sie
derartige E-Mails in Zukunft vermeiden können) finden
Sie ebenfalls in einer solchen Nachricht.Aufnehmen von ÄnderungenWenn verfügbar, integrieren Sie die
Veränderungen in den Port. Sie müssen in der
Lage sein, einen Patch zwischen dem alten und dem neuen
Port zu generieren.Nachprüfung und TestÜberprüfen und testen Sie
ihre Änderungen gründlich:Kompilieren, installieren und testen Sie
ihren Port auf so vielen Plattformen und
Architekturen, wie Sie können. Es kommt sehr
häufig vor, dass ein Port auf einem
Entwicklungszweig oder einer Plattform
funktioniert, auf einer anderen Plattform aber Fehler
erzeugt.Stellen Sie sicher, dass die
Abhängigkeiten ihres Ports vollständig
sind. Die empfohlene Vorgehensweise dafür
ist, dass Sie ihre eigenen Ports in einer
Tinderbox kompilieren.
Weitere Informationen zu diesem Thema finden Sie im
Abschnitt Ressourcen
dieses Artikels.Stellen Sie sicher, dass die Liste der zu
installierenden Dateien und Verzeichnisse aktuell
ist.Überprüfen Sie ihren Port mit
&man.portlint.1;. Sehen Sie sich dazu den Abschnitt
Ressourcen an.
Dieser enthält wichtige Informationen zum
Einsatz von portlint.Achten Sie darauf, dass Änderungen an Ihrem
Port nicht den Bau eines anderen Ports verhindern.
Ist dies der Fall, besprechen Sie die von Ihnen
durchgeführten Änderungen mit den
Maintainern der betroffenen Ports. Dies ist besonders
dann wichtig, wenn Ihre Aktualisierung die
Shared Library-Version ändert;
in diesem Fall werden Sie für die abhängigen
Ports einen PORTREVISION-Bump
benötigen, damit diese von automatisierten Werkzeugen
wie &man.portupgrade.1; auf dem neuesten Stand gehalten
werden.Änderungen einreichenReichen Sie ihre Aktualisierungen mit einem PR ein,
welcher die Änderungen erklärt und einen Patch
enthält, der die Änderungen zwischen dem
Original und Ihrer aktualisierten Version umfasst.
Lesen Sie bitte zuerst den Artikel Writing FreeBSD
Problem Reports, der das korrekte Einreichen
von Problemberichten beschreibt.Bitte schicken Sie kein &man.shar.1;-Archiv
des gesamten Ports. Benutzen Sie stattdessen
&man.diff.1; -r. Auf diese Art und
Weise können Committer viel einfacher erkennen,
welche Änderungen vorgenommen wurden. Das
Porter-Handbuch enthält viele nützliche
Informationen zum Upgrading
eines Ports.WartenEs kann nur sehr wenig Zeit vergehen, bis sich ein
Committer mit Ihrem PR befasst. Es kann aber auch mehrere
Wochen dauern, bis eine Reaktion erfolgt - haben Sie bitte
Geduld.Feedback gebenWenn ein Committer Probleme in Ihren Änderungen
entdeckt, wird er Sie darüber informieren. Eine
schnelle Reaktion Ihrerseits ist hilfreich, um Ihren PR
rasch bearbeiten zu können. Außerdem hilft
es Ihnen, den Faden nicht zu verlieren, wenn Sie
versuchen, aufgetretene Probleme zu lösen.Und zuletzt...Ihre Änderungen werden übermittelt und im
Anschluss daran wird Ihr Port aktualisiert. Der
betreffende PR wird danach vom Committer geschlossen.
Herzlichen Glückwunsch, Sie haben es geschafft!Stellen Sie sicher, dass Ihre Ports den Buildprozess
weiterhin erfolgreich durchlaufenDieser Abschnitt beschreibt, wie Sie Probleme entdecken und
beheben, die ihre Ports daran hindern, den Buildprozess
erfolgreich zu durchlaufen.&os; garantiert nur für die
-STABLE-Zweige, dass die
Ports-Sammlung korrekt funktioniert. Sie sollten
5-STABLE oder
6-STABLE benutzen, wobei der letztere
Zweig bevorzugt wird. Theoretisch sollte es ausreichen, das
aktuelle Stable Release des jeweiligen
STABLE-Zweigs einzusetzen (da die ABIs
in der Regel nicht geändert werden), es empfiehlt sich
aber, dem jeweiligen STABLE-Zweig zu folgen.Seit die Mehrheit von &os;-Installationen auf
PC-kompatiblen Maschinen arbeitet
(i386-Architektur) erwarten wir, dass Ihr
Port auf dieser Architektur funktioniert. Da allerdings
immer mehr Leute die amd64-Architektur
nutzen, wird es immer wichtiger, dass Ports auch dort
korrekt funktionieren. Es ist durchaus in Ordnung, um Hilfe
zu fragen, wenn Sie keine solche Maschine besitzen.Häufige Fehler beim Umgang mit
nicht-i386 Maschinen entstehen,
weil Programmierer ür Instanzen und Pointer
ints verwendeten, oder weil der
relativ simple
gcc 2.95-Compiler
genutzt wird. Immer mehr Programmautoren
überarbeiten ihren Code, um diese Fehler zu
beseitigen — wenn der Programmautor seinen Code
allerdings nicht aktiv betreut, müssen Sie dies
eventuell selbst in die Hand nehmen.Sie sollten die folgende Liste durchgehen, um
sicherzustellen, dass Ihr Port gebaut werden kann:Achten Sie auf Build-FehlerÜberprüfen Sie regelmäßig den Ports
Building Cluster pointyhat
und den
- Distfiles Survey,
+ url="http://www.portscout.org">Distfiles-Scanner,
um festzustellen, ob einer Ihrer Ports nicht gebaut oder
die Distfiles nicht geladen werden können (lesen Sie
den Abschnitt Ressourcen
dieses Artikels für weitere Informationen zu diesen
Systemen). Fehlerberichte kommen eventuell auch
von anderen Benutzern oder als automatisierte Meldungen
per E-Mail.Sammeln Sie InformationenWenn Sie ein Problem entdecken, benötigen Sie
als Erstes Informationen, die Ihnen dabei helfen, dieses
Problem zu beheben. Build-Fehler, die von
pointyhat gemeinsam mit Logdateien
verschickt werden, zeigen Ihnen, an welcher Stelle
der Fehler auftritt. Wenn Ihnen ein Fehler von
einem anderen Benutzer mitgeteilt wird, fragen
Sie nach, ob er bereit ist, ihnen Informationen
zukommen zu lassen, die eventuell bei der Diagnose
des Problems helfen können, wie z.B.:Build-Logs.Die Werkzeuge und Optionen, mit denen ein Port
gebaut wurde (inklusive der Optionen in
/etc/make.conf).Eine Liste installierter Pakete auf dem
System kann mit &man.pkg.info.1; erstellt
werden.Die &os;-Version, welche benutzt wird, kann
mit &man.uname.1; -a
ermittelt werden.Wann die Ports-Sammlung das letzte Mal
aktualisiert wurde.Wann die INDEX-Datei
zuletzt aktualisiert wurde.Suchen und finden Sie eine LösungLeider gibt es keinen allgemein gültigen
Weg, dies zu tun. Denken Sie daran: Wenn Probleme
auftauchen bitten Sie einfach jemanden um Hilfe!
Ein guter Anfang ist die Mailingliste &a.ports;.
Auch die Entwickler der Software selbst sind oft sehr
hilfreich.Änderungen übermittelnGenau wie beim Aktualisieren eines Ports
sollten Änderungen integriert, geprüft
und getestet werden. Reichen Sie Ihre Arbeit als
PR ein und geben Sie Feedback, falls dies notwendig
ist.Patches an Programmautoren sendenManchmal müssen Sie Patches erstellen, um
einen Port unter FreeBSD zum Laufen zu bekommen.
Einige (aber nicht alle) Programmautoren nehmen
diese Patches in Ihren Code für das nächste
Release auf. Dies kann den Benutzern anderer BSD-Systeme
helfen und einiges an unnötiger Mehrarbeit ersparen.
Bitte betrachten Sie das Versenden von verwertbaren
Patches an die Autoren als ein Gebot der
Höflichkeit.Ermitteln Sie Bug-Reports und PRs, die Ihre Ports
betreffen&os;-spezifische Bugs werden meistens durch falsche
Annahmen über Build- und Laufzeitumgebungen, die
nicht zu &os; passen, verursacht. Derartige Probleme zu
entdecken ist oft sehr schwierig, glücklicherweise
sind derartige Probleme aber nicht sehr häufig.Folgende Schritte sind notwendig, um sicherzustellen, dass
ihr Port weiterhin wie gewünscht funktioniert:Antworten Sie auf Bug-ReportsBugs können Ihnen als E-Mail durch die
GNATS Problem Report database zugestellt
werden, Sie können Ihnen aber auch direkt von
Benutzern gemeldet werden.Sie sollten innerhalb von 14 Tagen auf PRs und andere
Berichte antworten. Versuchen Sie schnellstmöglich
zu antworten, selbst wenn Sie nur mitteilen können,
dass Sie noch etwas Zeit brauchen, bevor Sie den PR
bearbeiten können.Sammeln Sie InformationenWenn mit dem Bug-Report nicht auch gleichzeitig eine
Lösung übermittelt wird, müssen Sie zuerst
die zum Beheben des Problems nötigen Informationen
sammeln.Wenn der Fehler reproduzierbar ist, können Sie
die meisten Informationen selbst sammeln. Wenn nicht,
bitten Sie die Person, die den Fehler gefunden hat,
diese Informationen für Sie zu sammeln:Eine genaue Beschreibung dessen, was Er/Sie getan
hat, den erwarteten Programmverlauf und den
tatsächlichen Ablauf.Eine Kopie der Eingabedaten, die den Fehler
auslösen.Informationen über das System, auf dem der
Port gebaut und ausgeführt wird, etwa die Liste
der installierten Pakete sowie die Ausgabe von
&man.env.1;.Core dumps.Stack traces.Schließen Sie falsche Reports ausEinige Fehlerberichte sind eventuell falsch. Es kommt
vor, dass ein Programm falsch benutzt wird. Weiterhin
können installierten Pakete veraltet sein und
müssten einfach nur aktualisiert werden. Manchmal
ist ein gemeldeter Fehler auch nicht &os;-spezifisch. In
diesem Fall melden Sie den Fehler den derzeitigen
Entwicklern der Software. Wenn Sie in der Lage sind, den
Fehler zu beheben, können Sie dies natürlich
trotzdem tun und den Entwicklern Ihren Patch zukommen
lassen.Lösungen findenBei Build-Fehlern werden Sie eine Lösung finden
müssen. Denken Sie daran zu fragen, wenn Sie nicht
weiterkommen!Änderungen einreichen oder annehmenGenau so wie bei der Aktualisierung eines Ports
sollten Sie alle Änderungen zuvor analysieren und
testen, um Sie danach als neuen PR (oder als
Folgebericht (follow-up),
falls ein PR zu diesem Problem bereits existiert)
einzureichen. Falls ein anderer Anwender Änderungen
für einen PR eingereicht hat, können Sie einen
Folgebericht erstellen, mit dem Sie die vorgeschlagenen
Änderungen akzeptieren oder (mit einer
Begründung) ablehnen.Support leistenTeilaufgabe eines Maintainers ist es, Support zu leisten
— nicht den Hauptsupport für die Software —
aber für seine Ports und &os;-spezifische Schlampereien
und Probleme. Benutzer kontaktieren Sie vielleicht wegen
Fragen, Anregungen, Problemen und Patches. Die meiste Zeit
werden sich derartige Mitteilungen spezifisch auf &os;
beziehen.Manchmal müssen Sie eventuell ihre diplomatischen
Fähigkeiten auffrischen und Benutzer freundlich an die
korrekten Anlaufstellen für den Hauptsupport verweisen.
Nur selten werden Sie auf eine Person treffen, die Sie fragt,
warum die RPMs nicht aktuell sind oder wie
Sie die Software unter Foo Linux zum Laufen
bringen. Ergreifen Sie die Gelegenheit und berichten Sie,
dass Ihr Port aktuell ist (natürlich nur, wenn er es auch
tatsächlich ist) und schlagen Sie vor, einmal &os;
auszuprobieren.Wenn Sie Glück haben, werden Benutzer und Entwickler
gelegentlich daran denken, dass Sie eine sehr
beschäftigte Person sind, deren Zeit nicht
unerschöpflich, sondern kostbar ist, und werden vielleicht
ein Teil Ihrer Arbeit für Sie übernehmen.
Beispielsweise könnten sie:Einen PR einreichen oder Ihnen Patches schicken.Einen vorhandenen PR untersuchen und eventuell einen
Patch dazu erstellen.Ihnen Änderungen für Ihre Ports zusenden.In diesem Fall ist ihre Hauptaufgabe zeitnahes
Antworten. Der Timeout für nicht ansprechbare Maintainer
beträgt 14 Tage. Nach dieser Periode können
Änderungen ohne ihre Prüfung eingereicht werden.
Diese Personen haben sich die Arbeit gemacht, etwas für
Sie zu übernehmen, versuchen Sie daher, möglichst
rasch zu antworten. Danach überprüfen, akzeptieren,
verändern oder diskutieren Sie diese Änderungen mit
den betroffenen Personen so schnell wie möglich.Wenn Sie vermitteln können, dass Sie deren Arbeit
zu schätzen wissen (und das sollten Sie), dann werden Sie
eine bessere Chance haben, dass diese Personen ihnen auch in
Zukunft etwas Arbeit abnehmen. :-)Defekte Ports finden und reparierenEs gibt zwei wirklich gute Anlaufstellen, um Ports
zu finden, die ihre Aufmerksamkeit benötigen.Sie können das Web
Interface der Problem Reports-Datenbank nutzen, um nach
ungelösten Problemen zu suchen. Die Mehrheit der PRs, die
zu Ports eingereicht werden, betreffen Aktualisierungsprobleme,
aber mit ein bißchen Recherche in den Übersichten
und Zusammenfassungen sollten Sie das eine oder andere
Interessante finden. (Die Kategorie sw-bug
ist ein guter Platz, um mit der Arbeit zu beginnen).Die zweite Anlaufstelle ist das &os; Ports Monitoring
System. Hier können Sie nicht betreute Ports mit
Build-Fehlern und Ports, die als BROKEN
gekennzeichnet sind, finden. Natürlich ist es auch in
Ordnung, Änderungen an betreuten Ports zu machen. Denken
Sie aber bitte daran, den Maintainer zuvor davon zu
informieren, da dieser möglicherweise bereits an diesem
Problem arbeitet.Sobald Sie einen Fehler oder ein Problem gefunden haben,
sammeln Sie dazu Informationen und versuchen Sie, den Fehler
zu analysieren und zu beheben! Wenn sich bereits ein PR mit
diesem Problem befasst, knüpfen Sie dort an. Ansonsten
reichen Sie einen neuen PR ein. Die von Ihnen vorgeschlagenen
Änderungen werden danach geprüft. Sind diese in
Ordnung, werden Sie danach committed.Sagen Sie Bescheid, wenn Sie einen Port nicht mehr
betreuen möchtenSo wie Ihre Interessen sich ändern, haben Sie
vielleicht irgendwann auch nicht mehr die Zeit, weiterhin
einige (oder alle) Ihrer Ports zu betreuen. Das ist
verständlich. Bitte lassen Sie es uns wissen, wenn Sie
keine Zeit oder kein Interesse mehr daran haben, Maintainer zu
sein oder einen Port selbst nicht mehr benutzen und deshalb
gerne abgeben wollen. Nur auf diese Art und Weise können
wir vorankommen und anderen anbieten, an diesen Ports zu
arbeiten, ohne dass diese auf Ihre Antworten warten müssen.
Denken Sie daran: &os; ist ein Freiwilligen-Projekt. Wenn Ihnen
eine Aufgabe keinen Spaß mehr macht, ist es wahrscheinlich
an der Zeit, jemand anderen an Ihre Ports zu lassen.In jedem Fall behält sich das Ports Management
Team (portmgr) das Recht vor, Ihnen den
Maintainer-Status abzuerkennen, wenn Sie für längere
Zeit nicht aktiv sind (derzeit liegt diese Grenze bei drei Monaten).
Damit ist gemeint, dass ungelöste Probleme oder ausstehende
Aktualisierungen in diesem Zeitraum nicht bearbeitet wurden.Ressourcen für Ports-Maintainer und CommitterDas Porter-Handbuch
ist Ihr Ratgeber zum Ports-System und sollte stets
in Ihrer Reichweite sein!Der Artikel Writing FreeBSD Problem
Reports beschreibt, wie PRs formuliert und eingereicht
werden sollen. Allein im Jahr 2005 wurden mehr als 11.000 PRs
zu verschiedenen Ports eingereicht! Wenn Sie die Anweisungen
dieses Artikels befolgen, werden wir weniger Zeit benötigen,
um Ihre PRs zu bearbeiten.Die
Problem Report Database.Pointyhat
ist der Ports Build Cluster. Sie können Pointyhat nutzen,
um nach Port-Buildlogs über alle Architekturen und
Haupt-Releases zu suchen.Das FreeBSD Ports Monitoring
System kann verschiedene Informationen über Ports
enthalten, beispielsweise Build-Fehler und Problemberichte.
Als Ports-Maintainer können Sie hier den Buildstatus Ihres
Ports in Erfahrung bringen. Als Committer können Sie dort
defekte und unbetreute Ports finden, die gefixt werden
müssten.
- Bill Fenners Distfile
- Survey kann Ihnen die Ports anzeigen, deren Distfiles
+ Der &os; Ports
+ Distfile-Scanner kann Ihnen die Ports anzeigen, deren Distfiles
nicht erreichbar sind. Sie können damit Ihre eigenen
Ports prüfen oder auch herauszufinden, ob die
MASTER_SITES-Einträge bestimmter Ports
nicht mehr aktuell sind.Der tinderbox-Port ist die
gründlichste Lösung, um den Port während des ganzen
Prozesses der Installation, Paketerstellung und Deinstallation
zu testen. Das Programm bietet sowohl eine Kommandozeilen- als
auch eine Web-Schnittstelle. Weitere Informationen zu diesem
Port finden Sie im Verzeichnis
ports/ports-mgmt/tinderbox sowie auf der
Tinderbox
Homepage.Mit &man.portlint.1; können Sie einen Port auf die
Einhaltung von stilistischen und funktionellen Richtlinien hin
überprüfen. Da es sich bei
portlint um eine heuristische
Anwendung handelt, sollten Sie dessen Ausgaben nur als
einen Ratgeber verwenden. Wenn
portlint zu umfangreiche Änderungen
vorschlägt, lesen Sie nochmal das Porter-Handbuch
oder bitten Sie jemanden um Rat.Die Mailingliste &a.ports; ist für allgemeine Diskussionen
über Ports vorgesehen. Wenn Sie Hilfe benötigen
können Sie dort nachfragen. Sie können einzelne
Mailinglisten
auch abonnieren oder in deren Archiven suchen und lesen.
Die Mailinglisten &a.ports-bugs; und &a.cvs-ports; könnten
für Sie ebenfalls von Interesse sein.
diff --git a/de_DE.ISO8859-1/books/developers-handbook/tools/chapter.sgml b/de_DE.ISO8859-1/books/developers-handbook/tools/chapter.sgml
index c313181174..16c2fb00c0 100644
--- a/de_DE.ISO8859-1/books/developers-handbook/tools/chapter.sgml
+++ b/de_DE.ISO8859-1/books/developers-handbook/tools/chapter.sgml
@@ -1,2646 +1,2646 @@
JamesRaynardContributed by MurrayStokelyDirkArltÜbersetzt von FabianBorschelWerkzeuge zur ProgrammierungÜberblickDieses Kapitel ist eine Einführung in die Benutzung
einiger der Werkzeuge zur Programmierung die mit FreeBSD
ausgeliefert werden. Trotzdem ist vieles auch auf verschiedene
andere Versionen von &unix; übertragbar. Dieses Kapitel
soll kein Versuch sein Programmierung
detailiert zu beschreiben. Der größte Teil dieses
Kapitels setzt wenige oder garkeine Programmierkenntnisse
vorraus, dennoch sollten die meisten Programmierer etwas
Sinnvolles darin finden.ZusammenfassungFreeBSD bietet eine exzellente Entwicklungsumgebung.
Compiler für C und C++, sowie ein Assembler sind im
Basissystem enthalten. Natürlich finden
sich auch klassische &unix;-Werkzeuge wie sed
und awk. Sollte das nicht genug sein, finden sich
zahlreiche weitere Compiler und Interpreter in der Ports-Sammlung.
Der folgende Abschnitt, Einführung in die Programmierung,
zählt ein paar der verfügbaren Optionen auf. FreeBSD ist
kompatibel zu vielen Standards wie &posix;
und ANSI C, sowie zu seinem eigenen BSD Erbe. So
ist es möglich Anwendungen zu schreiben, welche ohne oder
zumindest ohne wesentliche Änderungen auf einer
großen Zahl an Plattformen kompilieren und laufen
werden.Allerdings können all diese Möglichkeiten
anfangs etwas überwältigend sein, wenn Sie vorher nie
Programme auf einem &unix;-System geschrieben haben. Dieses
Dokument hat die Zielsetzung ihnen beim Einstieg zu helfen ohne
allzu weit in fortgeschrittene Themen vorzudringen. Die
Intention ist, daß dieses Dokument ihnen ausreichend
Basiswissen vermittelt und die weitergehende Dokumentation
sinnvoll nutzen zu können.Der größte Teil dieses Dokuments erfordert wenige
oder gar keine Kenntnisse in der Programmierung, es werden
trotzdem Basiswissen im Umgang mit &unix; und die Bereitschaft
zu lernen vorrausgesetzt!Einführung in die ProgrammierungEin Programm ist eine Zusammenstellung von Anweisungen, die
den Computer auffordern verschiedenste Dinge zu tun. Dieser
Abschnitt gibt ihnen einen Überblick über die beiden
wesentlichen Methoden diese Anweisungen oder
Befehle, wie man diese Anweisungen
üblicherweise nennt, zu geben. Die eine Methode nutzt einen
interpreter, die andere einen
Compiler. Da die menschliche Sprachen
für einen Computer nicht unmissverständlich sind,
werden diese Befehle in einer Sprache geschrieben die speziell
für diesen Zweck gedacht ist.InterpreterMit einem Interpreter ist die die Sprache vielmehr eine
Umgebung, in der Sie ein Kommando an der Kommandozeile
eingeben welches dann von der Umgebung ausgefürt wird.
Für kompliziertere Programme können Sie die Befehle
in eine Datei schreiben und den Interpreter dazu bringen diese
Datei zu laden und die enthaltenen Befehle auszuführen.
Falls etwas schief geht werden viele Interpreter Sie an einen
Debugger weiterleiten.Der Vorteil hierbei ist, das Sie das Ergebnis ihres
Befehls direkt sehen und Fehler sofort korrigiert werden
können. Der größte Nachteil bei dieser Methode
entsteht, wenn Sie ihr Programm mit jemandem teilen wollen.
Diese Person muss den selben Interpreter nutzen wie Sie es tun
und Sie muss wissen wissen wie Sie dieser zu bedienen ist.
Zudem werden Benutzer es nicht begrüßen sich in
einem Debugger wiederzufinden, wenn Sie einmal die falsche
Taste drückten! Bei einem Blick auf die
Leistungsfähigkeit brauchen Interpreter oftmals viel
Speicher und erzeugen den Code nicht so effizient wie
Compiler.Meiner Meinung nach sind interpretierte Sprachen der beste
Anfang, wenn Sie bisher noch nicht programmiert haben. Diese
Art von Umgebung findet man typischerweise bei Sprachen wie
Lisp, Smalltalk, Perl und Basic. Man köte auch sagen,
dass die &unix; Shell (sh,
csh) für sich bereits einen
Interpreter darstellt und viele Leute schreiben
tatsächlich Shell Scripten um sich bei
einigen Haushaltsaufgaben auf ihren Maschinen
helfen zu lassen. Tatsächlich war es ein wesentlicher
Teil der originalen &unix; Philosophie eine große Zahl
an kleinen Hilfsprogrammen zur Verügung zu stellen,
welche mittels eines Shell Sripts miteinander kombinter werden
um bestimmte Aufgaben zu übernehmen.Für FreeBSD verfügbare InterpreterIm folgenden eine Liste der über die &os;
Ports-Sammlung verfügbaren Interpreter
einschlißlich einer kurzen Erörterung der
populären interpretierten Sprachen.Anleitungen wie man Anwendungen aus der Ports-Sammlung
erhät und installiert können Sie dem Kapitel Benutzen der
Ports-Sammlung aus dem FreeBSD Handbuch
entnehmen.BASICKurz für Beginner's All-purpose Symbolic
Instruction Code. Entwickelt in den 50er Jahren um
Studenten in Programmierung zu unterichten, wurde
BASIC in den 80er Jahren mit jedem
anständigen Personal Computer ausgeliefert und war
für vielee Programmierer die erste
Programmiersprache. BASIC ist auch
die Grundlage für Visual Basic.Der Bywater Basic Interpreter findet sich in der
Ports-Sammlung unter lang/bwbasic und Phil
Cockroft's Basic Interpreter (auch bekannt als Rabbit
Basic) findet sich unter lang/pbasic.LispDiese Sprache wurde in den späten 50er Jahren
als Alternative zu den, zu dieser Zeit polpulären,
zahlenverarbeitenden Sprachen entwickelt.
Anstelle auf Zahlen basiert Lisp auf Listen;
tatsächlich ist der Name Lips eine Kurzform
für List Processing (Listen
abarbeiten). Sehr populär fü
AI (Artificial Intelligence/
künstliche Intelligez) (Fach-) Kreisen.Lisp ist eine extrem kraftvolle und durchdachte
Sprache, kann aber auch recht gross und unhandlich
sein.Zahlreiche Ausformungen von Lisp, die auf &unix;
Systemen laufen sind über die Ports-Sammlung
verfügbar. GNU Common Lisp befindet sich in
lang/gcl. CLISP von
Bruno Haible und Michael Stoll ist in lang/clisp zu finden. Für
CMUCL, welches auch einen hoch-optimierten Kompiler
enthält, oder einfachere Ausformungen wie SLisp,
das die meisten gängigen Lisp Konstrukte in wenigen
hundert Zeilen C Code enthält sind in lang/cmucl und lang/slisp ebenfalls
enthalten.PerlUnter Systemadministratoren zum Schreiben von
Skripten sehr beliebt; wird häufig auch auf World
Wide Web Servern verwendet, um
CGI-Skripte zu schreiben.Perl ist in der Ports-Sammlung unter lang/perl5 für alle
+ role="package">lang/perl5.8 für alle
&os;-Versionen verfügbar, und wird im Basissystem
von 4.x als /usr/bin/perl
installiert.SchemeEin Dialekt von Lisp, der kompakter und sauberer
als Common Lisp ist. Dieser Dialekt ist an
Universitäten sehr beliebt, da er zum einen
für den Unterricht im Grundstudium einfach genug
ist, und zum anderen ein ausreichend hohes
Abstraktionsniveau für den Einsatz in der Forschung
bietet.Scheme ist in der Ports-Sammlung in Form des Elk
Scheme Interpreters als lang/elk verfügbar. Den
MIT Scheme Interpreter findet man unter lang/mit-scheme, und den SCM
Scheme Interpreter unter lang/scm.IconIcon ist eine Hochsprache mit ausgereiften
Möglichkeiten zur Verarbeitung von Zeichenketten
und Strukturen. Die unter &os; verfügbare Version
von Icon steht in der Ports-Sammlung unter lang/icon zur
Verfügung.LogoLogo ist eine leicht zu erlernende
Programmiersprache, welche in vielen Kursen als
einführende Programmiersprache gewählt wird.
Sie ist ein ideales Arbeitswerkzeug beim Unterricht mit
jungen Menschen, da mit ihr die Erstellung komplizierter
geometrischer Oberflächen selbst für kleine
Kinder einfach ist.Die für &os; aktuellste, verfügbare
Version findet man in der Ports-Sammlung unter lang/logo.PythonPython ist eine objektorientierte, interpretierte
Programmiersprache. Die Verfechter von Python
argumentieren, daß sie eine der besten
Programmiersprachen für Programmieranfänger
sei, da sie einfach zu erlernen ist, und anderen
populären interpretierten Programmiersprachen,
welche zur Entwicklung großer und komplexer
Anwendungen verwendet werden, in nichts nachsteht (Perl
und Tcl sind zwei solcher bekannten
Programmiersprachen).Die aktuellste Version von Python ist in der
Ports-Sammlung unter lang/python
verfügbar.RubyRuby ist eine interpretierte und rein
objektorientierte Programmiersprache. Sie wurde wegen
ihrer leicht verständlichen Syntax, ihrer
Flexibilität und der Möglichkeit, große und
komplexe Programme einfach zu entwickeln und zu pflegen,
populär.Ruby ist in der Ports-Sammlung unter lang/ruby18
verfügbar.Tcl und TkTcl ist eine einbettbare, interpretierte
Programmiersprache, welche aufgrund ihrer Portierbarkeit
auf viele unterschiedliche Plattformen eine weite
Verbreitung erfahren hat. Sie kann sowohl für die
schnelle Entwicklung kleinerer Prototypen, als auch (in
Verbindung mit Tk, einem GUI Toolkit) vollwertiger,
ausgereifer Programme verwendet werden.Es sind mehrere Versionen von Tcl als Ports
für &os; verfügbar. Die aktuellste Version,
- Tcl 8.4, ist unter lang/tcl84
+ Tcl 8.5, ist unter lang/tcl85
verfügbar.CompilerCompiler sind eher anders. Zuerst schreibt man seinen
Code unter Verwendung eines Editors in eine Datei (oder
mehrere Dateien). Anschließend ruft man den Compiler auf
um zu sehen, ob dieser das Programm annimmt. Wenn das Programm
nicht kompiliert werden konnte, muß man die Zähne
zusammenbeissen und wieder zum Editor zurückkehren; falls
das Programm kompiliert und eine ausführbare Anwendung
erzeugt wurde, kann man diese über eine
Eingabeaufforderung oder über einen Debugger aufrufen um
zu sehen, ob sie auch funktioniert.
Wenn die Anwendung über eine Eingabeaufforderung
gestartet wird könnte bei Auftreten eines
Programmfehlers dieses abgebrochen und ein Speicherabbild
erzeugt werden.Offensichtlich ist diese Art der Programmierung nicht
so direkt wie die Verwendung eines Interpreters. Jedoch sind
auf diese Weise viele Dinge möglich, die mit einem
Interpreter nur sehr schwer oder überhaupt nicht
realisierbar wären, wie z.B. das Schreiben von Code, der
sehr eng mit dem Betriebsystem zusammen arbeitet—oder
das Schreiben eines eigenen Betriebsystems selbst! Des
weiteren ist so das Erzeugen von sehr effizientem Code
möglich, da sich der Compiler für die Optimierung
Zeit nehmen kann, was bei einem Interpreter inakzeptabel
wäre. Ferner ist das Verbreiten von Programmen, welche
für einen Compiler geschrieben wurden, einfacher als
welche, die für einen Interpreter geschrieben
wurden—man muss in ersterem Fall nur die
ausführbare Datei verbreiten, vorrausgesetzt das das
gleiche Betriebssystem verwendet wird.Programmiersprachen, die kompiliert werden, sind unter
anderem Pascal, C und C++. C und C++ sind eher unbarmherzige
Programmiersprachen und daher eher für erfahrene
Programmierer gedacht; Pascal auf der anderen Seite wurde zu
Ausbildungszwecken entworfen, und stellt daher eine
einsteigerfreundliche Programmiersprache dar. FreeBSD
beinhaltet im Basissystem keine Unterstützung für
Pascal, stellt jedoch über die Ports-Sammlung sowohl den
GNU Pascal Compiler (GPC) wie auch den Free Pascal Compiler
unter lang/gpc bzw.
lang/fpc zur
Verfügung.Da der editier-kompilier-ausführ-debug-Kreislauf
unter Verwendung mehrerer Programme eher mühsam ist haben
viele Hersteller von Compilern integrierte
Entwicklungsumgebungen (Integrated Development Environment;
auch kurz IDE) entwickelt. FreeBSD bietet
zwar im Basissystem keine IDE an, stellt jedoch über die
Ports-Sammlung IDEs wie devel/kdevelop oder
Emacs zur Verfügung, wobei
letztere weit verbreitet ist. Die Verwendung von
Emacs als IDE wird unter diskutiert.Kompilieren mit dem ccDieser Abschnitt behandelt ausschließlich den GNU
Compiler für C und C++, da dieser bereits im Basissystem
von FreeBSD enthalten ist. Er kann mittels cc
oder gcc aufgerufen werden. Die Details zur
Erstellung einer Anwendung mit einem Interpreter variieren
zwischen verschiedenen Interpretern mehr oder weniger stark, und
werden meist ausführlich in der zugehörigen
Dokumentation oder Online-Hilfe beschrieben.Sobald
Sie Ihr Meisterwerk fertig geschrieben haben besteht der
nächste Schritt darin, dieses (hoffentlich!) unter FreeBSD
zum Laufen zu bekommen. Dies beinhaltet üblicherweise
mehrere Schritte, wobei jeder einzelne Schritt von einem
separaten Programm durchgeführt wird.Aufbereiten Ihres Quelltextes durch Entfernen von
Kommentaren, sowie weiteren Tricks wie das Ersetzen von
Macros in C.Überprüfen der Syntax Ihres Quelltextes, um
die Einhaltung der Sprachregeln sicherzustellen. Wenn Sie
diese verletzt haben werden entsprechende Fehlermeldungen
Ihnen dies mitteilen!Übersetzen des Quelltextes in Assemblersprache
—diese ist dem eigentlichen Maschinencode schon sehr
nahe, jedoch immer noch für Menschen lesbar.
Angeblich.
Um genau zu sein übersetzt der
cc den Quelltext an dieser Stelle
nicht in Assemblersprache, sondern in seine eigene,
maschinenunabhängige Sprache namens
p-code.Übersetzen der Assemblersprache in
Maschinencode—genau, wir sprechen hier von Bits und
Bytes, Einsen und Nullen.Überprüfen, ob Sie Dinge wie Funktionen und
globale Variablen in einheitlicher Weise verwendet haben.
Wenn Sie z.B. eine nicht existierende Funktion aufgerufen
haben, wird eine entsprechende Fehlermeldung Ihnen dies
mitteilen.Wenn aus mehreren Quelltextdateien eine
ausführbare Datei erstellt werden soll wird
herausgefunden, wie die einzelnen Codeteile
zusammengefügt werden müssen.Ausarbeiten, wie das Programm aussehen muss, damit
der Lader zur Laufzeit des Systems dieses in den Speicher
laden und ausführen kann.Endgültiges Schreiben der ausführbaren Datei
in das Dateisystem.Das Wort kompilieren wird häufig
für die Schritte 1 bis 4 verwendet—die anderen werden
mit dem Wort verlinken zusammengefasst.
Manchmal wird Schritt 1 auch als
Pre-Processing und die Schritte 3-4 als
assemblieren bezeichnet.Glücklicherweise werden alle diese Details vor Ihnen
verborgen, da cc ein Frontend ist, welches
sich um die Ausführung all dieser Programme mit den
richtigen Argumenten für Sie kümmert; einfaches
eingeben von&prompt.user; cc foobar.cführt zur Übersetzung von
foobar.c durch alle bereits erwähnten
Schritte. Wenn Sie mehr als eine Datei übersetzen wollen
müssen Sie etwas wie folgt eingeben&prompt.user; cc foo.c bar.cBeachten Sie, daß die Überprüfung der Syntax
genau dies tut—das reine Überprüfen der Syntax.
Es findet keine Überprüfung bzgl. logischer Fehler
statt, die Sie vielleicht gemacht haben, wie z.B. das Programm
in eine Endlosschleife zu versetzen, oder Bubble Sort zu
verwenden, wenn Sie eigentlich Binary Sort benutzen wollten.
Falls Sie es nicht wußten, Binary Sort ist, im
Gegensatz zu Bubble Sort, eine effektive Möglichkeit,
Dinge zu sortieren.Es gibt haufenweise Optionen für cc,
die alle in der zugehörigen Manualpage beschrieben werden.
Im Folgenden werden ein paar der wichtigesten Optionen mit
Beispielen ihrer Anwendung gezeigt.Die Name der Ausgabedatei. Wenn Sie diese Option nicht
verwenden erstellt cc eine Datei mit
dem Namen a.out.
Der Grund dafür ist im Haufen der Geschichte
begraben.&prompt.user; cc foobar.cexecutable is a.out
&prompt.user; cc -o foobar foobar.cexecutable is foobarDies kompiliert die Datei nur, verlinkt sie jedoch
nicht. Nützlich für Spielereien, um die Syntax
auf Korrektheit zu überprüfen, oder falls Sie
ein Makefile verwenden.&prompt.user; cc -c foobar.cDieser Befehl erzeugt eine
Objektdatei (nicht ausführbar)
mit den Namen foobar.o. Diese kann
mit anderen Objektdateien zusammen zu einer
ausführbaren Datei verlinkt werden.Diese Option erzeugt die Debug-Version einer
ausführbaren Datei. Dabei fügt der Compiler
zusätzliche Informationen darüber, welcher
Funktionsaufruf zu welcher Zeile im Quelltext gehört,
der ausfürbaren Datei hinzu. Ein Debugger kann Ihnen
mit Hilfe dieser Information den zugehörigen
Quelltext anzeigen, während Sie den Programmverlauf
schrittweise verfolgen, was sehr
hilfreich sein kann; der Nachteil dabei ist, daß
durch die zusätzlichen Informationen das Programm
viel größer wird. Normalerweise verwendet man
die Option während der
Entwicklung eines Programms, und für die
Release-Version, wenn man von der
Korrektheit des Programms überzeugt ist, kompiliert
man das Programm dann ohne diese Option.&prompt.user; cc -g foobar.cMit diesem Befehl wird eine Debug-Version des
Programms erzeugt.
Beachten Sie, daß an dieser Stelle die
Option zum Festlegen des Namens
der ausführbaren Datei nicht verwendet wurde,
weswegen an dieser Stelle die erzeugte Datei
a.out heißt. Die Erzeugung
einer Debug-Verion namens foobar
ist als Übung dem Leser überlassen!Diese Option erzeugt eine optimierte Version der
ausführbaren Datei. Der Compiler verwendet einige
clevere Tricks, um das erzeugte Programm schneller zu
machen. Sie können hinter der Option
eine Zahl angeben, um eine
höheres Level der Optimierung festzulegen. Dadurch
wird jedoch häufig eine fehlerhafte Optimierung
seitens des Compilers aufgedeckt. Zum Beispiel erzeugte
die Version des cc, welche mit dem
FreeBSD Release 2.1.0 mitgeliefert wurde, bei Verwendung
der Option unter bestimmten
Umständen falschen Code.Optimierungen werden normalerweise nur beim
Kompilieren von Release-Versionen aktiviert.&prompt.user; cc -O -o foobar foobar.cDurch diesen Befehl wird eine optimierte Version von
foobar erzeugt.Die folgenden drei Flags zwingen den cc
dazu, Ihren Code auf die Einhaltung der internationalen
Standards hin zu überprüfen, welche häufig als
ANSI Standards bezeichnet werden, obwohl sie
streng genommen zum ISO Standard
gehören.Aktivieren aller Warnmeldungen, die die Autoren des
cc für wichtig halten. Trotz des
Namens dieser Option werden dadurch nicht sämtliche
Warnungen ausgegeben, die der cc
ausgeben könnte.Deaktivieren der meisten, jedoch nicht aller,
nicht-ANSI C Eigenschaften, die
der cc bietet. Trotz des Namens ist
durch diese Option nicht sichergestellt, daß Ihr
Code diese Standards auch vollständig
einhält.Deaktivieren aller Eigenschaften
des cc, welche nicht konform zu
ANSI C sind.Ohne diese Flags wird Ihnen der cc die
Verwendung eigener Erweiterungen des Standards erlauben. Einige
dieser Erweiterungen sind zwar sehr nützlich, werden jedoch
nicht von anderen Compilern unterstützt—eigentlich
ist eines der Hauptziele des Standards, das Leute Code so
schreiben können, daß dieser mit jedem Compiler auf
beliebigen Systemen funktioniert. Dies wird häufig als
portabeler Code bezeichnet.Im Allgemeinen sollten Sie versuchen, Ihren Code so portabel
wie möglich zu schreiben, da Sie ansonsten eventuell das
gesamte Programm noch einmal neu schreiben müssen, falls
dieser in einer anderen Umgebung laufen soll—und wer
weiß schon was er in ein paar Jahren verwenden
wird?&prompt.user; cc -Wall -ansi -pedantic -o foobar foobar.cDurch diesen Befehl wird eine ausführbare Datei namens
foobar erzeugt, nachdem
foobar.c auf die Einhaltung der Standards
überprüft wurde.Mit dieser Option kann eine Bibliothek mit Funktionen
angegeben werden, die während des Verlinkens
verwendet wird.Das am häufigsten auftretende Beispiel dieser
Option ist die Übersetzung eines Programmes, welches
einige der mathematischen Funktionen in C verwendet. Im
Gegensatz zu den meisten anderen Plattformen befinden sich
diese Funktionen in einer separaten Bibliothek, deren
Verwendung Sie dem Compiler explizit mitteilen
müssen.Angenommen eine Bibliothek heißt
libirgendwas.a,
dann müssen Sie dem cc als
Argument
übergeben. Zum Beispiel heißt die
Mathematik-Bibliothek libm.a, und
daher müssen Sie dem cc als
Argument übergeben. Ein
typisches Manko der Mathematik-Bibliothek
ist, daß diese immer die letzte Bibliothek auf der
Kommandozeile sein muß.&prompt.user; cc -o foobar foobar.c -lmDurch diesen Befehl werden die Funktionen aus der
Mathematik-Bibliothek in foobar
gelinkt.Wenn Sie C++-Code kompilieren wollen, müssen Sie
, bzw.
falls Sie FreeBSD 2.2 oder neuer verwenden, zu Ihrer
Kommandozeile hinzufügen, um Ihr Programm gegen die
Funktionen der C++ Bibliothek zu linken. Alternativ
können Sie anstatt cc auch
c++ aufrufen, welcher dies für Sie
erledigt. c++ kann unter FreeBSD auch
als g++ aufgerufen werden.&prompt.user; cc -o foobar foobar.cc -lg++Bei FreeBSD 2.1.6 oder älter
&prompt.user; cc -o foobar foobar.cc -lstdc++Bei FreeBSD 2.2 und neuer
&prompt.user; c++ -o foobar foobar.ccBeide Varianten erzeugen eine ausführbare
foobar aus der C++ Quelltextdatei
foobar.cc. Beachten Sie bitte,
daß auf &unix; Systemen C++ Quelltextdateien
üblicherweise auf .C,
.cxx oder .cc
enden, und nicht wie bei &ms-dos; auf
.cpp (welche schon anderweitig
benutzt wurde). Der gcc hat
normalerweise anhand dieser Information entschieden,
welcher Compiler für die Quelltextdatei zum Einsatz
kommen soll; allerdings gilt diese Einschränkung
jetzt nicht mehr, und Sie können Ihre C++-Dateien
ungestraft auf .cpp enden
lassen!Häufig auftretende cc-Fragen und
-ProblemeIch versuche ein Programm zu schreiben, welches die
Funktion sin() verwendet, erhalte
jedoch eine Fehlermeldung. Was bedeutet diese?/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
Wenn Sie mathematische Funktionen wie
sin() verwenden wollen, müssen
Sie den cc anweisen, die
Mathematik-Bibliothek wie folgt zu verlinken:&prompt.user; cc -o foobar foobar.c -lmSo, ich habe jetzt dieses einfache Programm als
Übung für geschrieben.
Alles was es macht ist, 2.1 hoch 6 zu berechnen.#include <stdio.h>
int main() {
float f;
f = pow(2.1, 6);
printf("2.1 ^ 6 = %f\n", f);
return 0;
}
und ich habe es wie folgt kompiliert:&prompt.user; cc temp.c -lmwie mir gesagt wurde. Allerdings bekomme ich jetzt
bei der Ausführung die folgende Ausgabe:&prompt.user; ./a.out
2.1 ^ 6 = 1023.000000
Das ist nicht die richtige
Antwort! Was ist hier los?Wenn der Compiler Ihren Funktionsaufruf sieht,
überprüft er, ob er schon einmal einen
Prototypen für diese gesehen hat. Wenn nicht nimmt
er als Rückgabewert den Typ int an,
was sicherlich nicht das ist, was Sie an dieser Stelle
wollen.Wie kann ich das korrigieren?Die Prototypen der mathematischen Funktionen
befinden sich in der Datei math.h.
Wenn Sie diese Datei in Ihrem Quelltext includen ist der
Compiler in der Lage, den Prototypen zu finden, und wird
aufhören, seltsame Dinge mit Ihrer Berechnung zu
machen!#include <math.h>
#include <stdio.h>
int main() {
...
Nach erneutem Compilieren sollte das Folgende bei
der Ausführung ausgegeben werden:&prompt.user; ./a.out
2.1 ^ 6 = 85.766121
Wenn Sie irgendwelche mathematischen Funktionen
verwenden sollten Sie immer die
Datei math.h includen und nicht
vergessen, Ihr Programm gegen die Mathematik-Bibliothek
zu verlinken.Ich habe eine Datei mit dem Namen
foobar.c compiliert, kann jedoch
nirgends eine ausführbare Datei namens
foobar finden. Wo befindet sich
diese?Denken Sie daran, daß der
cc die ausführbare Datei
a.out nennt, wenn Sie nicht
explizit einen Namen angeben. Verwenden Sie in solch
einem Fall die Option
:&prompt.user; cc -o foobar foobar.cOK, ich habe eine ausführbare Datei namens
foobar, ich kann sie sehen, wenn
ich ls aufrufe. Gebe ich jedoch
foobar in die Kommandozeile ein wird
mir gesagt, daß eine Datei mit diesem Namen nicht
existiert. Warum kann die Datei nicht gefunden
werden?Im Gegensatz zu &ms-dos; sucht &unix; nicht im
aktuellen Verzeichnis nach einem ausführbaren
Programm, das Sie versuchen auszuführen, solange
Sie dies nicht explizit mit angeben. Sie können
entweder ./foobar eingeben, was
soviel bedeutet wie führe eine Datei namens
foobar im aktuellen Verzeichnis
aus, oder Sie können Ihre Umgebungsvariable
PATH so erweitern, daß sie
ähnlich wie folgt aussiehtbin:/usr/bin:/usr/local/bin:.
Der Punkt am Ende bedeutet siehe im aktuellen
Verzeichnis nach, wenn es in keinem der anderen zu
finden war.Ich habe meine ausführbare Datei
test genannt, allerdings passiert
nichts wenn ich diese aufrufe. Was ist hier los?Bei den meisten &unix;-Systeme existiert bereits
ein Programm mit dem Namen test im
Verzeichnis /usr/bin, und die Shell
nimmt dieses, bevor sie im aktuellen Verzeichnis
nachsieht. Sie können entweder den folgenden Befehl
eingeben:&prompt.user; ./testoder Sie können einen geeigneteren Namen
für Ihr Programm wählen!Ich habe mein Programm kompiliert und bei dessen
Aufruf sah zuerst alles gut aus. Jedoch gab es dann eine
Fehlermeldung, welche irgendetwas mit core
dumped lautete. Was bedeutet das?Der Name core dump stammt
noch aus sehr frühen Zeiten von &unix;, als die
Maschinen noch Kernspeicher zum Speichern von Daten
verwendeten. Einfach ausgedrückt, wenn bei einem
Programm unter bestimmen Bedingungen ein Fehler auftrat,
hat das System den Inhalt des Kernspeichers auf der
Festplatte in eine Datei namens
core geschrieben, welche der
Programmierer dann näher untersuchen konnte, um die
Ursache des Fehlers herauszufinden.Faszinierendes Zeugs, aber was soll ich jetzt
machen?Verwenden Sie den gdb, um das
Speicherabbild zu untersuchen (siehe ).Als mein Programm den core dump erzeugt hat, sagte
es etwas von einem segmentation
fault. Was ist das?Diese Meldung heißt im Prinzip, daß Ihr
Programm eine illegale Operation mit dem Speicher
durchführen wollte; &unix; wurde so entworfen,
daß es das andere Programme und das Betriebssystem
selbst vor wildgewordenen Programmen
schützt.Häufige Ursachen hierfür sind:Der Versuch, einen NULL-Zeiger
zu beschreiben, z.B.char *foo = NULL;
strcpy(foo, "bang!");
Einen Zeiger zu verwenden, welcher noch nicht
initialisiert wurde, z.B.char *foo;
strcpy(foo, "bang!");
Der Zeiger hat einen zufälligen Wert,
welcher mit etwas Glück in einen Bereich des
Speichers zeigt, der für Ihr Programm nicht
verfügbar ist, und der Kernel bricht Ihr
Programm ab, bevor es irgendwelchen Schaden
anrichten kann. Wenn Sie Pech haben zeigt der Zeiger
irgendwo mitten in Ihr eigenes Programm, und
verändert dort ihre eigenen Datenstrukturen,
was zu sehr seltsamen Fehlern Ihres Programmes
führt.Der Versuch, auf Daten außerhalb eines
Arrays zuzugreifen, z.B.int bar[20];
bar[27] = 6;
Der Versuch, Daten in eine Speicherbereich zu
schreiben, der nur lesbar ist, z.B.char *foo = "My string";
strcpy(foo, "bang!");
&unix;-Compiler speichern häufig feste
Zeichenketten wie "My string" in
nur lesbaren Speicherbereichen ab.Wenn man unerlaubte Operationen mit
malloc() und
free() ausführt,
z.B.char bar[80];
free(bar);
oderchar *foo = malloc(27);
free(foo);
free(foo);
Einzelne solcher Fehler führen zwar nicht
immer zu einem Fehlverhalten des Programms, stellen
jedoch immer eine falsche Verwendung dar. Manche Systeme
und Compiler sind toleranter als andere, weshalb
Programme auf dem einen System einwandfrei laufen, auf
dem anderen System jedoch abstürzen.Wenn ich einen core dump erhalte erscheint
manchmal die Meldung bus error.
In meinem &unix;-Buch steht, daß die Ursache ein
Hardwareproblem sei. Der Computer scheint aber weiterhin
zu funktionieren. Ist dies wahr?Nein, glücklicherweise nicht (es sei denn Sie
haben wirklich ein Hardwareproblem…).
Üblicherweise ist dies ein Weg Ihnen mitzuteilen,
daß Sie auf Speicher in einer Weise zugegriffen
haben, in der Sie dies nicht tun sollten.Diese Sache mit den core dumps hört sich sehr
nützlich an, wenn ich so etwas selber an beliebiger
Stelle bewirken könnte. Kann ich das tun, oder
muß ich warten bis ein Fehler auftritt?Ja, nehmen sie einfach eine andere Konsole oder
XTerm und führen Sie&prompt.user; psaus, um die Prozess-ID Ihres Programms
herauszufinden. Führen Sie
anschließend&prompt.user; kill -ABRT pidaus, wobei
pid
die Prozess-ID ist, die Sie vorher ermittelt
haben.Dies ist nützlich, wenn sich Ihr Programm z.B.
in einer Endlosschleife verfangen hat. Sollte Ihr
Programm das Signal SIGABRT abfangen,
gibt es noch andere Möglichkeiten, die denselben
Effekt haben.Alternativ können Sie einen core dump aus
Ihrem Programm heraus erstellen, indem Sie die Funktion
abort() aufrufen. Weitere
Informationen darüber können Sie in der
Manualpage &man.abort.3; nachlesen.Wenn Sie einen core dump von ausßerhalb Ihres
Programms erzeugen wollen, ohne dabei den Prozess
abzubrechen, können Sie das Programm
gcore verwenden. Weitere
Informationen dazu finden Sie in der zugehörigen
Manualpage &man.gcore.1;.MakeWas ist make?Wenn Sie an einem einfachen Programm mit nur einer oder
zwei Quelltextdateien arbeiten, ist die Eingabe von&prompt.user; cc file1.c file2.czwar nicht aufwendig, wird aber mit zunehmender Anzahl
der Quelltextdateien sehr lästig—und auch das
Kompilieren kann eine Weile dauern.Eine Möglichkeit dies zu umgehen besteht in der
Verwendung von Objektdateien, wobei man nur die
Quelltextdateien neu kompiliert, die verändert wurden. So
könnten wir etwa folgendes erhalten:&prompt.user; cc file1.o file2.o … file37.c …falls wir seit dem letzten Kompiliervorgang nur die Datei
file37.c verändert haben. Dadurch
könnte der Kompiliervorgang um einiges beschleunigt
werden, es muß jedoch immer noch alles von Hand
eingegeben werden.Oder wir könnten uns ein Shell Skript schreiben.
Dieses würde jedoch alles immer wieder neu kompilieren,
was bei einem großen Projekt sehr ineffizient
wäre.Was ist, wenn wir hunderte von Quelltextdateien
hätten? Was ist, wenn wir in einem Team mit anderen
Leuten arbeiten würden, die vergessen uns Bescheid zu
sagen, falls sie eine der Quelltextdateien verändert
haben, die wir ebenfalls benutzen?Vielleicht könnten wir beide Lösungen
kombinieren und etwas wie ein Shell Skript schreiben, welches
eine Art magische Regel enthalten würde, die feststellt,
welche Quelltextdateien neu kompiliert werden müssten.
Alles was wir bräuchten wäre ein Programm, das diese
Regeln verstehen könnte, da diese Aufgabe etwas zu
kompliziert für eine Shell ist.Dieses Programm heißt make. Es
liest eine Datei namens makefile,
welche ihm sagt, wie unterschiedliche Dateien voneinander
abhängen, und berechnet, welche Dateien neu kompiliert
werden müssen und welche nicht. Zum Beispiel könnte
eine Regel etwas sagen wie wenn
fromboz.o älter als
fromboz.c ist, bedeutet dies, daß
jemand die Datei fromboz.c verändert
haben muß, und diese daher neu kompiliert werden
muß. Das makefile enthält außerdem
Regeln die make sagen, wie die
Quelltextdatei neu kompiliert werden muß, was dieses
Tool noch sehr viel mächtiger macht.Makefiles werden normalerweise im selben Verzeichnis
wie die Quelltextdateien abgelegt, zu denen sie gehören,
und kann makefile,
Makefile oder
MAKEFILE heißen. Die meisten
Programmierer verwenden den Namen
Makefile, da diese Schreibweise
dafür sorgt, daß die Datei gut lesbar ganz oben in
der Verzeichnisliste aufgeführt wird.
Sie verwenden nicht MAKEFILE mit
lauter Großbuchstaben, da diese Schreibweise
häufig für Dokumentationsdateien wie
README benutzt wird.Beispielhafte Verwendung von makeHier ist eine sehr einfache make Datei:foo: foo.c
cc -o foo foo.cSie besteht aus zwei Zeilen, einer
Abhängigkeitszeile und einer Erzeugungszeile.Die Abhängigkeitszeile hier besteht aus dem Namen
des Programms (auch Ziel genannt),
gefolgt von einem Doppelpunkt und einem Leerzeichen, und
anschließend dem Namen der Quelltextdatei. Wenn
make diese Zeile liest überprüft
es die Existenz von foo; falls diese
Datei existiert vergleicht es das Datum der letzten
Änderung von foo mit der von
foo.c. Falls foo
nicht existiert, oder älter als
foo.c ist, liest es die Erzeugungszeile
um herauszufinden, was zu tun ist. Mit anderen Worten, dies
ist die Regel die festlegt, wann foo.c
neu kompiliert werden muß.Die Erzeugungszeile beginnt mit einem tab
(drücken Sie dazu die tab-Taste) gefolgt
von dem Befehl, mit dem Sie foo manuell
erzeugen würden. Wenn foo veraltet
ist, oder nicht existiert, führt make
diesen Befehl aus, um die Datei zu erzeugen. Mit anderen
Worten, dies ist die Regel die make sagt, wie
foo.c kompiliert werden muß.Wenn Sie also make eingeben wird
dieses sicherstellen, daß foo bzgl.
Ihrer letzten Änderungen an foo.c
auf dem neuesten Stand ist. Dieses Prinzip kann auf
Makefiles mit hunderten von
Zielen—es ist bei FreeBSD praktisch möglich, das
gesamte Betriebssystem zu kompilieren, indem man nur
make world im richtigen Verzeichnis
eingibt!Eine weitere nützliche Eigenschaft der makefiles
ist, daß die Ziele keine Programme sein müssen. Wir
könnten zum Beispiel eine make Datei haben, die wie folgt
aussieht:foo: foo.c
cc -o foo foo.c
install:
cp foo /home/meWir können make sagen welches Ziel wir erzeugt haben
wollen, indem wir etwas wie folgt eingeben:&prompt.user; make targetmake wird dann nur dieses Ziel
beachten und alle anderen ignorieren. Wenn wir zum Beispiel
make foo mit dem obigen makefile
eingeben, dann wird make das Ziel
install ignorieren.Wenn wir nur make eingeben wird
make immer nur nach dem ersten Ziel suchen und danach mit dem
Suchen aufhören. Wenn wir hier also nur
make eingegeben hätten, würde
es nur zu dem Ziel foo gehen,
gegebenenfalls foo neu kompilieren, und
danach einfach aufhören, ohne das Ziel
install zu beachten.Beachten Sie das das install-Ziel
von nichts anderem abhängt! Dies bedeutet, daß der
Befehl in der nachfolgenden Zeile immer ausgeführt wird,
wenn wir dieses Ziel mittels make
install aufrufen. In diesem Fall wird die Datei
foo in das Heimatverzeichnis des
Benutzers kopiert. Diese Vorgehensweise wird häufig bei
makefiles von Anwendungen benutzt, damit die Anwendung nach
erfolgreicher Kompilierung in das richtige Verzeichnis
installiert werden kann.Dieser Teil ist etwas schwierig zu erklären. Wenn
Sie immer noch nicht so richtig verstanden haben, wie
make funktioniert, wäre es das Beste,
sie erstellen sich selber ein einfaches Programm wie
hello world und eine make Datei wie die weiter
oben angegebene, und experimentieren damit selber ein bischen
herum. Als nächstes könnten Sie mehrere
Quelltextdateien verwenden, oder in Ihrer Quelltextdatei eine
Header-Datei includen. Der Befehl touch ist
an dieser Stelle ganz hilfreich—er verändert das
Datum einer Datei, ohne das Sie diese extra editieren
müssen.Make und include-DateienC-Code beginnt häufig mit einer Liste von Dateien,
die included werden sollen, zum Beispiel stdio.h. Manche
dieser Dateien sind include-Dateien des Systems, andere
gehören zum aktuellen Projekt, an dem Sie gerade
arbeiten:#include <stdio.h>
#include "foo.h"
int main(....Um sicherzustellen, daß diese Datei neu kompiliert
wird, wenn foo.h verändert wurde,
müssen Sie diese Datei Ihrem
Makefile hinzufügen:foo: foo.c foo.hSobald Ihr Projekt größer wird und Sie mehr
und mehr eigene include-Dateien verwalten müssen wird es
nur noch sehr schwer möglich sein, die Übersicht
über alle include-Dateien und Dateien, die von diesen
abhängen, beizubehalten. Falls Sie eine include-Datei
verändern, jedoch das erneute Kompilieren aller Dateien,
die von dieser Datei abhängen, vergessen, werden die
Folgen verheerend sein. Der gcc besitzt
eine Option, bei der er Ihre Dateien analysiert und eine Liste
aller include-Dateien und deren Abhängigkeiten erstellt:
.Wenn Sie das Folgende zu Ihrem Makefile
hinzufügen:depend:
gcc -E -MM *.c > .dependund make depend ausführen,
wird die Datei .depend mit einer Liste
von Objekt-Dateien, C-Dateien und den include-Dateien
auftauchen:foo.o: foo.c foo.hFalls Sie foo.h verändern
werden beim nächsten Aufruf von make
alle Dateien, die von foo.h
abhängen, neu kompiliert.Vergessen Sie nicht jedes mal
make depend aufzurufen, wenn Sie eine
include-Datei zu einer Ihrer Dateien hinzugefügt
haben.FreeBSD MakefilesMakefiles können eher schwierig zu schreiben sein.
Glücklicherweise kommen BSD-basierende Systeme wie
FreeBSD mit einigen sehr mächtigen solcher Dateien als
Teil des Systems daher. Ein sehr gutes Beispiel dafür ist
das FreeBSD Portssystem. Hier ist der grundlegende Teil eines
typischen Makefiles des
Portssystems:MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
.include <bsd.port.mk>Wenn wir jetzt in das Verzeichnis dieses Ports wechseln
und make aufrufen, passiert das
Folgende:Es wird überprüft, ob sich der Quelltext
für diesen Port bereits auf Ihrem System
befindet.Falls dies nicht der Fall ist wird eine
FTP-Verbindung zu der URL in MASTER_SITES
aufgebaut und der Quelltext heruntergeladen.Die Checksumme für den Quelltext wird berechnet
und mit der schon bekannten und für sicher und gut
empfundenen verglichen. Damit wird sichergestellt,
daß der Quelltext bei der Übertragung nicht
beschädigt wurde.Sämtliche Anpassungen, die nötig sind,
damit der Quelltext unter FreeBSD funktioniert, werden
vorgenommen—dieser Vorgang wird auch
patchen genannt.Alle speziellen Konfigurationen, die am Quelltext
nötig sind, werden vorgenommen. (Viele &unix;
Programmdistributionen versuchen herauszufinden, auf
welcher &unix;-Version sie kompiliert werden sollen und
welche optionalen &unix;-Features vorhanden sind—an
dieser Stelle erhalten sie die Informationen im FreeBSD
Ports Szenario).Der Quelltext für das Programm wird kompiliert.
Im Endeffekt wechseln wir in das Verzeichnis, in das der
Quelltext entpackt wurde, und rufen
make auf—die eigene make-Datei
des Programms besitzt die nötigen Informationen um
dieses zu bauen.Wir haben jetzt eine kompilierte Version des
Programmes. Wenn wir wollen können wir dieses jetzt
testen; wenn wir überzeugt vom Programm sind,
können wir make install
eingeben. Dadurch werden das Programm sowie alle
zugehörigen Dateien an die richtige Stelle kopiert;
es wird auch ein Eintrag in der
Paketdatenbank erzeugt, sodaß
der Port sehr einfach wieder deinstalliert werden kann,
falls wir unsere Meinung über dieses geändert
haben.Ich glaube jetzt werden Sie mit mir übereinstimmen,
daß dies ziemlich eindrucksvoll für ein Skript mit
vier Zeilen ist!Das Geheimnis liegt in der letzten Zeile, die
make anweist, in das makefile des Systems
mit dem Namen bsd.port.mk zu sehen. Man
kann diese Zeile zwar leicht übersehen, aber hierher
kommt all das klevere Zeugs—jemand hat ein makefile
geschrieben, welches make anweist, alle
weiter oben beschriebenen Schritte durchzuführen (neben
vielen weiteren Dingen, die ich nicht angesprochen habe,
einschließlich der Behandlung sämtlicher Fehler,
die auftreten könnten) und jeder kann darauf
zurückgreifen, indem er eine einzige Zeile in seine
eigene make-Datei einfügt!Falls Sie einen Blick in die makefiles des Systems werfen
möchten, finden Sie diese in
/usr/share/mk. Es ist aber wahrscheinlich
besser, wenn Sie damit noch warten, bis Sie ein bischen mehr
Praxiserfahrung mit makefiles gesammelt haben, da die dortigen
makefiles sehr kompliziert sind (und wenn Sie sich diese
ansehen sollten Sie besser eine Kanne starken Kaffee
griffbereit haben!)Fortgeschrittene Verwendung von
makeMake ist ein sehr mächtiges
Werkzeug und kann noch sehr viel mehr als die gezeigten
einfachen Beispiele weiter oben. Bedauerlicherweise gibt es
mehrere verschiedene Versionen von make,
und sie alle unterscheiden sich beträchtlich voneinander.
Der beste Weg herauszufinden was sie können ist
wahrscheinlich deren Dokumentation zu lesen—hoffentlich
hat diese Einführung Ihnen genügend Grundkenntisse
vermitteln können, damit Sie dies tun können.Die Version von make, die in FreeBSD enthalten ist, ist
Berkeley make; es gibt eine
Anleitung dazu in
/usr/share/doc/psd/12.make. Um sich diese
anzusehen, müssen Sie&prompt.user; zmore paper.ascii.gzin diesem Verzeichnis ausführen.Viele Anwendungen in den Ports verwenden
GNU make, welches einen sehr guten
Satz an info-Seiten mitbringt. Falls Sie
irgendeinen dieser Ports installiert haben wurde
GNU make automatisch als
gmake mit installiert. Es ist auch als
eigenständiger Port und Paket verfügbar.Um sich die Info-Seiten für
GNU make anzusehen müssen Sie
die Datei dir in
/usr/local/info um einen entsprechenden
Eintrag erweitern. Dies beinhaltet das Einfügen einer
Zeile wie * Make: (make). The GNU Make utility.in die Datei. Nachdem Sie dies getan haben können
Sie info eingeben und dann den
Menüeintrag make
auswählen (oder Sie können in
Emacs die Tastenkombination
C-h i verwenden).DebuggenDer DebuggerDer Debugger bei FreeBSD heißt
gdb (GNU
debugger). Sie können Ihn durch die Eingabe
von&prompt.user; gdb prognamestarten, wobei viele Leute ihn vorzugsweise
innerhalb von Emacs aufrufen. Sie
erreichen dies durch die Eingabe von:M-x gdb RET progname RETDie Verwendung eines Debuggers erlaubt Ihnen Ihr
Programm unter kontrollierteren Bedingungen ausführen zu
können. Typischerweise können Sie so Zeile für
Zeile durch Ihr Programm gehen, die Werte von Variablen
untersuchen, diese verändern, dem Debugger sagen er soll
das Programm bis zu einem bestimmten Punkt ausführen und
dann anhalten, und so weiter und so fort. Sie können
damit sogar ein schon laufendes Programm untersuchen, oder
eine Datei mit einem Kernspeicherabbild laden um
herauszufinden, warum das Programm abgestürzt ist. Es ist
sogar möglich damit den Kernel zu debuggen, wobei dies
etwas trickreicher als bei den Benutzeranwendungen ist, welche
wir in diesem Abschnitt behandeln werden.Der gdb besitzt eine recht gute
Online-Hilfe, sowie einen Satz von Info-Seiten, weshalb sich
dieser Abschnitt auf ein paar grundlegende Befehle
beschränken wird.Falls Sie den textbasierten Kommandozeilen-Stil
abstoßend finden gibt es ein graphisches Front-End
dafür (devel/xxgdb) in der Ports-Sammlung.Dieser Abschnitt ist als Einführung in die
Verwendung des gdb gedacht und beinhaltet
nicht spezielle Themen wie das Debuggen des Kernels.Ein Programm im Debugger ausführenSie müssen das Programm mit der Option
kompiliert haben um den
gdb effektiv einsetzen zu können. Es
geht auch ohne diese Option, allerdings werden Sie dann nur
den Namen der Funktion sehen, in der Sie sich gerade befinden,
anstatt direkt den zugehörigen Quelltext. Falls Sie eine
Meldung wie die folgende sehen:… (no debugging symbols found) …wenn der gdb gestartet wird, dann
wissen Sie, daß das Programm nicht mit der Option
kompiliert wurde.Geben Sie in der Eingabeaufforderung des
gdbbreak main ein.
Dies weist den Debugger an, dass Sie nicht daran interessiert sind,
den einleitenden Schritten beim Programmstart zuzusehen und dass
am Anfang Ihres Codes die Ausführung beginnen soll. Geben Sie
nun run ein, um das Programm zu starten -
es wird starten und beim Aufruf von main() vom
Debugger angehalten werden. (Falls Sie sich jemals gewundert haben von
welcher Stelle main() aufgerufen wird, dann
wissen Sie es jetzt!).Sie können nun Schritt für Schritt durch Ihr
Programm gehen, indem Sie n drücken.
Wenn Sie zu einem Funktionsaufruf kommen können Sie diese
Funktion durch drücken von s betreten.
Sobald Sie sich in einem Funktionsaufruf befinden können
Sie diesen durch drücken von f wieder
verlassen. Sie können auch up und
down verwenden, um sich schnell den
Aufrufer einer Funktion anzusehen.Hier ist ein einfaches Beispiel, wie man mit Hilfe des
gdb einen Fehler in einem Programm findet.
Dies ist unser eigenes Programm (mit einem absichtlich
eingebauten Fehler):#include <stdio.h>
int bazz(int anint);
main() {
int i;
printf("This is my program\n");
bazz(i);
return 0;
}
int bazz(int anint) {
printf("You gave me %d\n", anint);
return anint;
}Dieses Programm setzt i auf den Wert
5 und übergibt dies einer Funktion
bazz(), welche den Wert ausgibt, den Sie
von uns erhalten hat.Wenn wir das Programm kompilieren und ausführen
erhalten wir&prompt.user; cc -g -o temp temp.c
&prompt.user; ./temp
This is my program
anint = 4231Das ist nicht was wir erwartet hatten! Es ist Zeit,
daß wir sehen was hier passiert!&prompt.user; gdb temp
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break mainSkip the set-up code
Breakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()
(gdb) runRun as far as main()
Starting program: /home/james/tmp/temp Program starts running
Breakpoint 1, main () at temp.c:9 gdb stops at main()
(gdb) nGo to next line
This is my program Program prints out
(gdb) sstep into bazz()
bazz (anint=4231) at temp.c:17 gdb displays stack frame
(gdb)Halt mal! Wieso hat denn anint den Wert
4231? Haben wir dieser Variablen nicht in
main() den Wert 5
zugewiesen? Gehen wir mal zurück zu
main() und schauen dort nach.(gdb) upMove up call stack
#1 0x1625 in main () at temp.c:11 gdb displays stack frame
(gdb) p iShow us the value of i
$1 = 4231 gdb displays 4231Oh! Anscheinend haben wir vergessen i zu
initialisieren. Wir wollten eigentlich…
main() {
int i;
i = 5;
printf("This is my program\n");
…schreiben, haben aber die Zeile mit
i=5; vergessen. Da wir i
nicht initialisiert haben hatte diese Variable gerade den
Wert, der in dem ihr zugewiesenen Speicherbereich stand als
wir das Programm gestartet haben, welcher in diesem Fall
4231 war.Der gdb zeigt jedes mal, wenn wir
eine Funktion betreten oder verlassen, den Inhalt des
Stack-Rahmens an, selbst wenn wir uns mit
up und down im
Aufruf-Stack umherbewegen. Dabei wird der Name der Funktion
sowie der übergebenen Argumente angezeigt, was uns
dabei hilft, die Übersicht zu behalten. (Der Stack ist
ein Speicherbereich, in dem ein Programm Informationen
über die an eine Funktion übergebenen Argumente
ablegt, sowie die Rücksprungadresse eines
Funktionsaufrufes).Eine Kernspeicherdatei untersuchenEine Kernspeicherdatei ist im Prinzip eine Datei, die den
vollständigen Zustand eines Prozesses enthält, als
dieses abgestürzt ist. In den guten alten
Zeiten mußten Programmierer hexadezimale Listen
der Kernspeicherdatei ausdrucken und über
Maschinencodehandbüchern schwitzen, aber heutzutage ist
das Leben etwas einfacher geworden. Zufälligerweise wird
die Kernspeicherdatei unter FreeBSD und anderen
4.4BSD-Systemen
progname.core
anstatt einfach nur core genannt, um
deutlich zu machen, zu welchem Programm eine Kernspeicherdatei
gehört.Um eine Kernspeicherdatei zu untersuchen müssen Sie
den gdb wie gewohnt starten. An Stelle von
break oder run
müssen Sie das Folgende eingeben(gdb) core progname.coreWenn Sie sich nicht in demselben Verzeichnis befinden wie
die Kernspeicherdatei müssen Sie zuerst dir
/path/to/core/file eingeben.Sie sollten dann etwas wie folgt sehen:&prompt.user; gdb a.out
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)In diesem Fall hieß das Programm
a.out, weshalb die Kernspeicherdatei den
Namen a.out.core trägt. Wie wir
sehen können stürzte das Programm in einer Funktion
namens bazz ab, als es versuchte auf
einen Speicherbereich zuzugreifen, der dem Programm nicht zur
Verfügung stand.Manchmal ist es ganz nützlich zu sehen, wie eine
Funktion aufgerufen wurde, da bei komplexen Programmen das
eigentliche Problem schon sehr viel weiter oben auf dem
Aufruf-Stack aufgetreten sein könnte. Der Befehl
bt veranlaßt den
gdb dazu, einen Backtrace des Aufruf-Stacks
auszugeben:(gdb) bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)Die Funktion end() wird aufgerufen,
wenn ein Programm abstürzt; in diesem Fall wurde die
Funktion bazz() aus der
main()-Funktion heraus aufgerufen.Ein bereits laufendes Programm untersuchenEine der tollsten Features des gdb
ist die Möglichkeit, damit bereits laufende Programme zu
untersuchen. Dies bedeutet natürlich, daß Sie die
erforderlichen Rechte dafür besitzen. Ein häufig
auftretendes Problem ist das Untersuchen eines Programmes,
welches sich selber forkt. Vielleicht will man den Kindprozess
untersuchen, aber der Debugger erlaubt einem nur den Zugriff
auf den Elternprozess.Was Sie an solch einer Stelle machen ist, Sie starten
einen weiteren gdb, ermitteln mit Hilfe von
ps die Prozess-ID des Kindprozesses, und
geben(gdb) attach pidim gdb ein, und können dann wie
üblich mit der Fehlersuche fortfahren.Das ist zwar alles sehr schön, werden
Sie jetzt vielleicht denken, aber in der Zeit, in der
ich diese Schritte durchführe, ist der Kindprozess schon
längst über alle Berge. Fürchtet euch
nicht, edler Leser, denn Ihr müßt wie folgt
vorgehen (freundlicherweise zur Verfügung gestellt von
den Info-Seite des gdb):…
if ((pid = fork()) < 0) /* _Always_ check this */
error();
else if (pid == 0) { /* child */
int PauseMode = 1;
while (PauseMode)
sleep(10); /* Wait until someone attaches to us */
…
} else { /* parent */
…Alles was Sie jetzt noch tun müssen ist, sich an
den Kindprozess ranzuhängen, PauseMode
auf 0 zu setzen und auf den
sleep() Funktionsaufruf zu warten, um
zurückzukehren!Emacs als Entwicklungsumgebung verwendenEmacsLeider werden &unix;-Systeme nicht mit einem
alles-was-du-jemals-brauchst-und-vieles-mehr-megapaket an
integrierten Entwicklungsumgebungen ausgestattet, die bei
anderen Systemen dabei sind.
Es gibt jetzt einige mächtige und freie IDEs in
der Ports-Sammlung wie etwa KDevelop.
Trotzdem ist es möglich, seine eigene
Entwicklungsumgebung aufzusetzen. Diese wird vielleicht nicht
so hübsch und integriert sein, aber dafür
können Sie sie Ihren eigenen Wünschen anpassen. Und
sie ist frei. Und Sie haben die Quelltexte davon.Der Schlüssel zu all dem ist Emacs. Es gibt zwar ein
paar Leute die ihn hassen, es gibt jedoch auch viele die ihn
lieben. Falls Sie zu ersteren gehören befürchte ich,
daß dieser Abschnitt Ihnen wenig interessantes zu bieten
hat. Des weiteren benötigen Sie eine angemessene Menge an
freiem Speicher, um ihn zu benutzen—ich würde 8MB
für den Textmodus und 16MB unter X als absolutes Minimum
empfehlen, um eine halbwegs brauchbare Performance zu
erhalten.Emacs ist im Prinzip ein extrem anpassbarer Editor—
in der Tat ist er so stark veränderbar, daß er eher
einem Betriebssystem als einem Editor gleicht! Viele
Entwickler und Systemadministratoren erledigen praktisch ihre
gesamte Arbeit aus Emacs heraus und beenden ihn nur, um sich
komplett auszuloggen.Es ist nicht einmal möglich alles hier
zusammenzufassen, was man mit dem Emacs machen kann. Im
Folgenden werden einige Features aufgelistet, die für
einen Entwickler interessant sein könnten:Sehr mächtiger Editor, der suchen-und-ersetzen
mit Zeichenfolgen und regulären Ausdrücken
(Pattern) sowie das direkte Anspringen von Anfang/Ende von
Blockausdrücken erlaubt, etc, etc.Pull-Down Menüs und eine Online-Hilfe.Sprachunabhängige Syntaxhervorhebung und
automatische Einrückung.Vollständig konfigurierbar.Sie können Programme im Emacs kompilieren und
debuggen.Bei Kompilationsfehlern können Sie direkt zu der
entsprechenden Zeile im Quelltext springen.Benutzerfreundliches Front-End für das
info-Programm, um die GNU Hypertext
Dokumentation inklusive der Dokumentation des Emacs
selber.Benutzerfreundliches Front-End für den
gdb um sich beim Verfolgen der
Programmanweisungen den zugehörigen Quelltext
anzeigen zu lassen.Sie können E-Mails und News im Usenet lesen,
während ihr Programm kompiliert wird.Und zweifelsfrei viele weitere Punkte, die ich
übersehen habe.Emacs kann unter &os; über den editors/emacs Port installiert werden.Sobald er installiert ist starten Sie ihn, und geben
dann C-h t ein, um die Einführung
in Emacs zu lesen—d.h. Sie sollen bei gedrückter
Strg-Taste die h-Taste
drücken, beide wieder loslassen und anschließend
t drücken. (Alternativ können Sie
mit der Maus den Eintrag Emacs
Tutorial aus dem
Hilfe-Menü auswählen).Obwohl der Emacs Menüs besitzt ist das Erlernen der
Tastaturkombinationen lohnenswert, da man beim Editieren sehr
viel schneller Tastenkombinationen eingeben kann, als die Maus
zu finden und mit dieser dann an der richtigen Stelle zu
klicken. Und wenn Sie sich mit erfahrenen Emacs-Benutzern
unterhalten werden Sie feststellen, daß diese
häufig nebenbei Ausdrücke wie M-x
replace-s RET foo RET bar RET verwenden,
weshalb das Erlernen dieser sehr nützlich ist. Und Emacs
hat auf jeden Fall weit mehr nützliche Funktionen als das
diese in der Menüleiste unterzubringen wären.Zum Glück ist es sehr einfach die jeweiligen
Tastaturkombinationen herauszubekommen, da diese direkt neben
den Menüeinträgen stehen. Meine Empfehlung
wäre, den Menüeintrag für, sagen wir, das
Öffnen einer Datei zu verwenden, bis Sie die
Funktionsweise verstanden haben und sie mit dieser vertraut
sind, und es dann mit C-x C-f versuchen. Wenn Sie damit
zufrieden sind, gehen Sie zum nächsten
Menüeintrag.Falls Sie sich nicht daran erinnern können, was eine
bestimmte Tastenkombination macht, wählen Sie
Describe Key aus dem
Hilfe-Menü aus und geben Sie die
Tastenkombination ein—Emacs sagt Ihnen dann was diese
macht. Sie können ebenfalls den Menüeintrag
Command Apropos verwenden, um alle
Befehle, die ein bestimmtes Wort enthalten, mit den
zugehörigen Tastenkombinationen aufgelistet zu
bekommen.Übrigends bedeutet der Ausdruck weiter oben, bei
gedrückter Meta-Taste x
zu drücken, beide wieder loszulassen,
replace-s einzugeben (Kurzversion
für replace-string—ein weiteres
Feature des Emacs ist, daß Sie Befehle abkürzen
können), anschließend die
return-Taste zu drücken, dann
foo einzugeben (die Zeichenkette, die
Sie ersetzen möchten), dann wieder
return, dann die Leertaste zu drücken
(die Zeichenkette, mit der Sie foo ersetzen
möchten) und anschließend erneut
return zu drücken. Emacs wird dann die
gewünschte suchen-und-ersetzen-Operation
ausführen.Wenn Sie sich fragen was in aller Welt die
Meta-Taste ist, das ist eine spezielle Taste
die viele &unix;-Workstations besitzen. Bedauerlicherweise
haben PCs keine solche Taste, und daher ist es
üblichwerweise die alt-Taste (oder falls
Sie Pech haben die Esc-Taste).Oh, und um den Emacs zu verlassen müssen sie
C-x C-c (das bedeutet, Sie müssen bei
gedrückter Strg-Taste zuerst
x und dann c drücken)
eingeben. Falls Sie noch irgendwelche ungespeicherten Dateien
offen haben wird Emacs Sie fragen ob Sie diese speichern
wollen. (Ignorieren Sie bitte die Stelle der Dokumentation, an
der gesagt wird, daß C-z der
übliche Weg ist, Emacs zu verlassen—dadurch wird
der Emacs in den Hintergrund geschaltet, was nur nützlich
ist, wenn Sie an einem System ohne virtuelle Terminals
arbeiten).Emacs konfigurierenEmacs kann viele wundervolle Dinge; manche dieser Dinge
sind schon eingebaut, andere müssen erst konfiguriert
werden.Anstelle einer proprietären Macrosprache verwendet
der Emacs für die Konfiguration eine speziell für
Editoren angepaßte Version von Lisp, auch bekannt als
Emacs Lisp. Das Arbeiten mit Emacs Lisp kann sehr hilfreich
sein, wenn Sie darauf aufbauend etwas wie Common Lisp lernen
möchten. Emacs Lisp hat viele Features von Common Lisp
obwohl es beträchtlich kleiner ist (und daher auch
einfacher zu beherschen).Der beste Weg um Emacs Lisp zu erlernen besteht darin,
sich das Emacs
Tutorial herunterzuladen.Es ist jedoch keine Kenntnis von Lisp erforderlich, um
mit der Konfiguration von Emacs zu beginnen, da ich eine
beispielhafte .emacs-Datei hier
eingefügt habe, die für den Anfang ausreichen
sollte. Kopieren Sie diese einfach in Ihr Heimverzeichnis und
starten Sie den Emacs neu, falls dieser bereits läuft; er
wird die Befehle aus der Datei lesen und Ihnen (hoffentlich)
eine brauchbare Grundeinstellung bieten.Eine beispielhafte .emacs-DateiBedauerlicherweise gibt es hier viel zu viel, um es im
Detail zu erklären; es gibt jedoch ein oder zwei Punkte,
die besonders erwähnenswert sind.Alles was mit einem ; anfängt
ist ein Kommentar und wird von Emacs ignoriert.In der ersten Zeile mit
-*- Emacs-Lisp -*- sorgt
dafür, daß wir die Datei
.emacs in Emacs selber editieren
können und uns damit alle tollen Features zum
Editieren von Emacs Lisp zur Verfügung stehen. Emacs
versucht dies normalerweise anhand des Dateinamens
auszumachen, was vielleicht bei
.emacs nicht funktionieren
könnte.Die Tab-Taste ist in manchen Modi
an die Einrückungsfunktion gebunden, so daß
beim drücken dieser Taste die aktuelle Zeile
eingerückt wird. Wenn Sie ein
tab-Zeichen in einen Text, welchen auch
immer Sie dabei schreiben, einfügen wollen,
müssen Sie bei gedrückter
Strg-Taste die Tab-Taste
drücken.Diese Datei unterstützt Syntax Highlighting
für C, C++, Perl, Lisp und Scheme, indem die Sprache
anhand des Dateinamens erraten wird.Emacs hat bereits eine vordefinierte Funktion mit dem
Namen next-error. Diese erlaubt es
einem, in einem Fenster mit der Kompilierungsausgabe
mittels M-n von einem zum nächsten
Kompilierungsfehler zu springen; wir definieren eine
komplementäre Funktion
previous-error, die es uns erlaubt,
mittels M-p von einem zum vorherigen
Kompilierungsfehler zu springen. Das schönste Feature
von allen ist, daß mittels C-c
C-c die Quelltextdatei, in der der Fehler
aufgetreten ist, geöffnet und die betreffende Zeile
direkt angesprungen wird.Wir aktivieren die Möglichkeit von Emacs als
Server zu agieren, so daß wenn Sie etwas
außerhalb von Emacs machen und eine Datei editieren
möchten, Sie einfach das folgende eingeben
können&prompt.user; emacsclient filenameund dann die Datei in Ihrem Emacs editieren
können!
Viele Emacs-Benutzer setzen Ihre
EDITOR-Umgebungsvariable auf
emacsclient, so daß dies
immer passiert, wenn sie eine Datei editieren
müssen.Eine einfache .emacs-Datei;; -*-Emacs-Lisp-*-
;; This file is designed to be re-evaled; use the variable first-time
;; to avoid any problems with this.
(defvar first-time t
"Flag signifying this is the first time that .emacs has been evaled")
;; Meta
(global-set-key "\M- " 'set-mark-command)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-\C-r" 'query-replace)
(global-set-key "\M-r" 'replace-string)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-h" 'help-command)
;; Function keys
(global-set-key [f1] 'manual-entry)
(global-set-key [f2] 'info)
(global-set-key [f3] 'repeat-complex-command)
(global-set-key [f4] 'advertised-undo)
(global-set-key [f5] 'eval-current-buffer)
(global-set-key [f6] 'buffer-menu)
(global-set-key [f7] 'other-window)
(global-set-key [f8] 'find-file)
(global-set-key [f9] 'save-buffer)
(global-set-key [f10] 'next-error)
(global-set-key [f11] 'compile)
(global-set-key [f12] 'grep)
(global-set-key [C-f1] 'compile)
(global-set-key [C-f2] 'grep)
(global-set-key [C-f3] 'next-error)
(global-set-key [C-f4] 'previous-error)
(global-set-key [C-f5] 'display-faces)
(global-set-key [C-f8] 'dired)
(global-set-key [C-f10] 'kill-compilation)
;; Keypad bindings
(global-set-key [up] "\C-p")
(global-set-key [down] "\C-n")
(global-set-key [left] "\C-b")
(global-set-key [right] "\C-f")
(global-set-key [home] "\C-a")
(global-set-key [end] "\C-e")
(global-set-key [prior] "\M-v")
(global-set-key [next] "\C-v")
(global-set-key [C-up] "\M-\C-b")
(global-set-key [C-down] "\M-\C-f")
(global-set-key [C-left] "\M-b")
(global-set-key [C-right] "\M-f")
(global-set-key [C-home] "\M-<")
(global-set-key [C-end] "\M->")
(global-set-key [C-prior] "\M-<")
(global-set-key [C-next] "\M->")
;; Mouse
(global-set-key [mouse-3] 'imenu)
;; Misc
(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
(setq backup-by-copying-when-mismatch t)
;; Treat 'y' or <CR> as yes, 'n' as no.
(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)
;; Load packages
(require 'desktop)
(require 'tar-mode)
;; Pretty diff mode
(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files-remote "ediff"
"Intelligent Emacs interface to diff")
(if first-time
(setq auto-mode-alist
(append '(("\\.cpp$" . c++-mode)
("\\.hpp$" . c++-mode)
("\\.lsp$" . lisp-mode)
("\\.scm$" . scheme-mode)
("\\.pl$" . perl-mode)
) auto-mode-alist)))
;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")
(defvar font-lock-mode-keyword-alist
'((c++-c-mode . c-font-lock-keywords)
(perl-mode . perl-font-lock-keywords))
"Associations between modes and keywords")
(defun font-lock-auto-mode-select ()
"Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list"
(if (memq major-mode font-lock-auto-mode-list)
(progn
(font-lock-mode t))
)
)
(global-set-key [M-f1] 'font-lock-fontify-buffer)
;; New dabbrev stuff
;(require 'new-dabbrev)
(setq dabbrev-always-check-other-buffers t)
(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'c-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'text-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) t)
(set (make-local-variable 'dabbrev-case-replace) t)))
;; C++ and C mode...
(defun my-c++-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c++-mode-map "\C-ce" 'c-comment-edit)
(setq c++-auto-hungry-initial-state 'none)
(setq c++-delete-function 'backward-delete-char)
(setq c++-tab-always-indent t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c++-empty-arglist-indent 4))
(defun my-c-mode-hook ()
(setq tab-width 4)
(define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c-mode-map "\C-ce" 'c-comment-edit)
(setq c-auto-hungry-initial-state 'none)
(setq c-delete-function 'backward-delete-char)
(setq c-tab-always-indent t)
;; BSD-ish indentation style
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 0)
(setq c-label-offset -4))
;; Perl mode
(defun my-perl-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(setq perl-indent-level 4)
(setq perl-continued-statement-offset 4))
;; Scheme mode...
(defun my-scheme-mode-hook ()
(define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
;; Emacs-Lisp mode...
(defun my-lisp-mode-hook ()
(define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key lisp-mode-map "\C-i" 'lisp-indent-line)
(define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
;; Add all of the hooks...
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'perl-mode-hook 'my-perl-mode-hook)
;; Complement to next-error
(defun previous-error (n)
"Visit previous compilation error message and corresponding source code."
(interactive "p")
(next-error (- n)))
;; Misc...
(transient-mark-mode 1)
(setq mark-even-if-inactive t)
(setq visible-bell nil)
(setq next-line-add-newlines nil)
(setq compile-command "make")
(setq suggest-key-bindings nil)
(put 'eval-expression 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
(if (>= emacs-major-version 21)
(setq show-trailing-whitespace t))
;; Elisp archive searching
(autoload 'format-lisp-code-directory "lispdir" nil t)
(autoload 'lisp-dir-apropos "lispdir" nil t)
(autoload 'lisp-dir-retrieve "lispdir" nil t)
(autoload 'lisp-dir-verify "lispdir" nil t)
;; Font lock mode
(defun my-make-face (face color &optional bold)
"Create a face from a color and optionally make it bold"
(make-face face)
(copy-face 'default face)
(set-face-foreground face color)
(if bold (make-face-bold face))
)
(if (eq window-system 'x)
(progn
(my-make-face 'blue "blue")
(my-make-face 'red "red")
(my-make-face 'green "dark green")
(setq font-lock-comment-face 'blue)
(setq font-lock-string-face 'bold)
(setq font-lock-type-face 'bold)
(setq font-lock-keyword-face 'bold)
(setq font-lock-function-name-face 'red)
(setq font-lock-doc-string-face 'green)
(add-hook 'find-file-hooks 'font-lock-auto-mode-select)
(setq baud-rate 1000000)
(global-set-key "\C-cmm" 'menu-bar-mode)
(global-set-key "\C-cms" 'scroll-bar-mode)
(global-set-key [backspace] 'backward-delete-char)
; (global-set-key [delete] 'delete-char)
(standard-display-european t)
(load-library "iso-transl")))
;; X11 or PC using direct screen writes
(if window-system
(progn
;; (global-set-key [M-f1] 'hilit-repaint-command)
;; (global-set-key [M-f2] [?\C-u M-f1])
(setq hilit-mode-enable-list
'(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
scheme-mode)
hilit-auto-highlight nil
hilit-auto-rehighlight 'visible
hilit-inhibit-hooks nil
hilit-inhibit-rebinding t)
(require 'hilit19)
(require 'paren))
(setq baud-rate 2400) ; For slow serial connections
)
;; TTY type terminal
(if (and (not window-system)
(not (equal system-type 'ms-dos)))
(progn
(if first-time
(progn
(keyboard-translate ?\C-h ?\C-?)
(keyboard-translate ?\C-? ?\C-h)))))
;; Under UNIX
(if (not (equal system-type 'ms-dos))
(progn
(if first-time
(server-start))))
;; Add any face changes here
(add-hook 'term-setup-hook 'my-term-setup-hook)
(defun my-term-setup-hook ()
(if (eq window-system 'pc)
(progn
;; (set-face-background 'default "red")
)))
;; Restore the "desktop" - do this as late as possible
(if first-time
(progn
(desktop-load-default)
(desktop-read)))
;; Indicate that this file has been read at least once
(setq first-time nil)
;; No need to debug anything now
(setq debug-on-error nil)
;; All done
(message "All done, %s%s" (user-login-name) ".")
Erweitern des von Emacs unterstützten SprachbereichsDas ist jetzt alles sehr schön wenn Sie
ausschließlich in einer der Sprachen programmieren
wollen, um die wir uns bereits in der
.emacs-Datei gekümmert haben (C,
C++, Perl, Lisp und Scheme), aber was passiert wenn eine neue
Sprache namens whizbang herauskommt, mit jeder
Menge neuen tollen Features?Als erstes muß festgestellt werden, ob whizbang mit
irgendwelchen Dateien daherkommt, die Emacs etwas über
die Sprache sagen. Diese enden üblicherweise auf
.el, der Kurzform für Emacs
Lisp. Falls whizbang zum Beispiel ein FreeBSD Port
ist, könnten wir diese Dateien mittels&prompt.user; find /usr/ports/lang/whizbang -name "*.el" -printfinden und durch Kopieren in das Emacs-seitige
Lisp-Verzeichnis installieren. Unter &os; ist dies
/usr/local/share/emacs/site-lisp.Wenn zum Beispiel die Ausgabe des find-Befehls wie folgt
war/usr/ports/lang/whizbang/work/misc/whizbang.elkönnten wir das folgende tun&prompt.root; cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lispAls nächstes müssen wir festlegen, welche
Dateiendung Quelltextdateien für whizbang haben. Lassen
Sie uns um der Argumente Willen annehmen, die Dateiendung sei
.wiz. Wir müssen dann einen Eintrag
unserer .emacs-Datei hinzufügen um
sicherzustellen, daß Emacs die Informationen in
whizbang.el auch verwenden kann.Suchen Sie den auto-mode-alist Eintrag
in der .emacs-Datei und fügen Sie an
dieser Stelle eine Zeile wie folgt für whizbang
hinzu:…
("\\.lsp$" . lisp-mode)
("\\.wiz$" . whizbang-mode)
("\\.scm$" . scheme-mode)
…Dies bedeutet das Emacs automatisch in den
whizbang-mode wechseln wird, wenn Sie
eine Datei mit der Dateiendung .wiz
editieren.Direkt darunter werden Sie den Eintrag
font-lock-auto-mode-list finden. Erweitern
Sie den whizbang-mode um diesen wie
folgt:;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")Dies bedeutet das Emacs immer
font-lock-mode (z.B. Syntax Highlighting)
aktiviert, wenn Sie eine .wiz-Datei
editieren.Und das ist alles was benötigt wird. Falls es
weitere Dinge gibt, die automatisch beim Öffnen einer
.wiz-Datei ausgeführt werden sollen,
können Sie einen whizbang-mode
hook-Eintrag hinzufügen (für ein
einfaches Beispiel, welches auto-indent
hinzufügt, sehen Sie sich bitte
my-scheme-mode-hook an).Weiterführende LiteraturFür Informationen zum Aufsetzen einer
Entwicklungsumgebung, um Fehlerbehebungen an FreeBSD selber
beizusteuern sehen Sie sich bitte &man.development.7; an.Brian Harvey and Matthew Wright
Simply Scheme
MIT 1994.
ISBN 0-262-08226-8Randall Schwartz
Learning Perl
O'Reilly 1993
ISBN 1-56592-042-2Patrick Henry Winston and Berthold Klaus Paul Horn
Lisp (3rd Edition)
Addison-Wesley 1989
ISBN 0-201-08319-1Brian W. Kernighan and Rob Pike
The Unix Programming Environment
Prentice-Hall 1984
ISBN 0-13-937681-XBrian W. Kernighan and Dennis M. Ritchie
The C Programming Language (2nd Edition)
Prentice-Hall 1988
ISBN 0-13-110362-8Bjarne Stroustrup
The C++ Programming Language
Addison-Wesley 1991
ISBN 0-201-53992-6W. Richard Stevens
Advanced Programming in the Unix Environment
Addison-Wesley 1992
ISBN 0-201-56317-7W. Richard Stevens
Unix Network Programming
Prentice-Hall 1990
ISBN 0-13-949876-1
diff --git a/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml b/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml
index df7e974048..26d4eadf14 100644
--- a/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml
@@ -1,696 +1,702 @@
BibliografieÜbersetzt von &a.de.gruender;Während die Manualpages die endgültige Auskunft
über bestimmte Teile des FreeBSD-Betriebssystems geben, so
können sie jedoch nicht darstellen, wie man die einzelnen Teile
zusammenfügt, um ein vollständig laufendes Betriebssystem
herzustellen. Daher gibt es keinen Ersatz für ein gutes Buch
über die Administration von &unix; Systemen und ein gutes
Benutzerhandbuch.In der Regel handelt es sich im folgenden Kapitel um englische
Ausgaben der genannten Werke. Übersetzungen oder Ausgaben in
anderen Sprachen sind mit entsprechenden Hinweisen versehen.Bücher und Magazine speziell für FreeBSDInternationale Bücher und
Magazine:
Using FreeBSD, herausgegeben von Drmaster, 1997
(in traditionellem Chinesisch). ISBN 9-578-39435-7.FreeBSD Unleashed (in vereinfachtem Chinesisch),
herausgegeben von China
Press. ISBN 7-111-10201-0.FreeBSD From Scratch First Edition (in vereinfachtem Chinesisch),
herausgegeben von China
Press. ISBN 7-111-07482-3.FreeBSD From Scratch Second Edition (in vereinfachtem Chinesisch),
herausgegeben von China
Press. ISBN 7-111-10286-X.FreeBSD Handbook Second Edition (in vereinfachtem Chinesisch),
herausgegeben von Posts
& Telecom Press. ISBN 7-115-10541-3.FreeBSD 3.x Internet (in vereinfachtem Chinesisch),
herausgegeben von Tsinghua
University Press. ISBN 7-900625-66-6.FreeBSD & Windows (in vereinfachtem Chinesisch),
herausgegeben von China Railway Publishing
House. ISBN 7-113-03845-X.FreeBSD Internet Services HOWTO (in vereinfachtem Chinesisch),
herausgegeben von China Railway Publishing House.
ISBN 7-113-03423-3.FreeBSD for PC 98'ers (in japanischer Sprache), herausgegeben von
SHUWA System Co, LTD. ISBN 4-87966-468-5 C3055 P2900E.FreeBSD (in japanischer Sprache), herausgegeben von CUTT. ISBN
4-906391-22-2 C3055 P2400E.Complete Introduction to FreeBSD (in Japanese), published by Shoeisha Co., Ltd. ISBN 4-88135-473-6 P3600E.
Personal UNIX Starter Kit FreeBSD (in japanischer Sprache),
herausgegeben von ASCII.
ISBN 4-7561-1733-3 P3000E.FreeBSD Handbook (japanische Übersetzung), herausgegeben
von ASCII.
ISBN 4-7561-1580-2 P3800E.FreeBSD mit Methode (in deutscher Sprache), herausgegeben von
Computer und Literatur Verlag
/Vertrieb Hanser, 1998.
ISBN 3-932311-31-0.FreeBSD 4 -
Installieren, Konfigurieren, Administrieren (in
deutscher Sprache), herausgegeben von Computer und Literatur Verlag, 2001.
ISBN 3-932311-88-4.FreeBSD 5 –
Installieren, Konfigurieren, Administrieren (in
deutscher Sprache), herausgegeben von Computer und Literatur Verlag,
2001. ISBN 3-936546-06-1.FreeBSD
de Luxe (in German), published by
Verlag Modere Industrie,
2003. ISBN 3-8266-1343-0.
FreeBSD Install and Utilization Manual (in japanischer Sprache),
herausgegeben von
Mainichi Communications Inc., 1998.
ISBN 4-8399-0112-0.Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo
Building Internet Server with FreeBSD
(in indonesischer Sprache), herausgegeben von Elex Media Komputindo.Absolute BSD: The Ultimate Guide to FreeBSD (in traditionellem
Chinesisch), herausgegeben von GrandTech Press, 2003.
ISBN 986-7944-92-5.The
FreeBSD 6.0 Book (in traditionellem Chinesisch,
herausgegeben von Drmaster, 2006. ISBN 9-575-27878-X.Englischsprachige Bücher und
Magazine:Absolute BSD: The
Ultimate Guide to FreeBSD, herausgegeben von
No Starch Press,
2002. ISBN: 1886411743
The Complete FreeBSD, herausgegeben von
O'Reilly, 2003.
ISBN: 0596005164The
FreeBSD Corporate Networker's Guide, herausgegeben von
Addison-Wesley,
2002. ISBN: 0201704811
FreeBSD: An Open-Source Operating System for Your Personal
Computer, herausgegeben von The Bit Tree Press, 2001.
ISBN: 0971204500Teach Yourself FreeBSD in 24 Hours, herausgegeben von
Sams, 2002.
ISBN: 0672324245FreeBSD6 Unleashed, herausgegeben von
Sams, 2006.
ISBN: 0672328755FreeBSD: The Complete Reference, herausgegeben von
McGrawHill, 2003.
ISBN: 0072224096
+
+
+ BSD Magazine,
+ herausgegeben von Software Press Sp. z o.o. SK.
+ ISBN: 1898-9144
+ HandbücherComputer Systems Research Group, UC Berkeley. 4.4BSD
User's Reference Manual. O'Reilly & Associates,
Inc., 1994. ISBN 1-56592-075-9Computer Systems Research Group, UC Berkeley. 4.4BSD
User's Supplementary Documents. O'Reilly &
Associates, Inc., 1994. ISBN 1-56592-076-7UNIX in a Nutshell. O'Reilly &
Associates, Inc., 1990. ISBN 093717520XMui, Linda. What You Need To Know When You Can't Find
Your UNIX System Administrator. O'Reilly &
Associates, Inc., 1995. ISBN 1-56592-104-6Die Ohio State
University hat ein UNIX
Introductory Course veröffentlicht, welcher auch
online im HTML- und PostScriptformat verfügbar ist.Eine italienische Übersetzung
ist Teil des &os; Italian Documentation Projects.Jpman Project, Japan
FreeBSD Users Group. FreeBSD User's
Reference Manual (japanische Übersetzung). Mainichi Communications
Inc., 1998. ISBN4-8399-0088-4 P3800E.Edinburgh
University hat einen Online Guide für
Anfänger in Sachen UNIX geschrieben.Administrations-AnleitungenAlbitz, Paul and Liu, Cricket. DNS and
BIND, 4th Ed. O'Reilly & Associates, Inc., 2001.
ISBN 1-59600-158-4Computer Systems Research Group, UC Berkeley. 4.4BSD
System Manager's Manual. O'Reilly & Associates,
Inc., 1994. ISBN 1-56592-080-5Costales, Brian, et al. Sendmail, 2nd Ed.
O'Reilly & Associates, Inc., 1997. ISBN 1-56592-222-0Frisch, Æleen. Essential System
Administration, 2nd Ed. O'Reilly & Associates,
Inc., 1995. ISBN 1-56592-127-5Hunt, Craig. TCP/IP Network
Administration, 2nd Ed. O'Reilly & Associates, Inc., 1997.
ISBN 1-56592-322-7Nemeth, Evi. UNIX System Administration
Handbook. 3rd Ed. Prentice Hall, 2000. ISBN
0-13-020601-6Stern, Hal Managing NFS and NIS O'Reilly
& Associates, Inc., 1991. ISBN 0-937175-75-7Jpman Project, Japan
FreeBSD Users Group. FreeBSD System
Administrator's Manual (japanische Übersetzung). Mainichi Communications
Inc., 1998. ISBN4-8399-0109-0 P3300E.Dreyfus, Emmanuel. Cahiers
de l'Admin: BSD 2nd Ed. (in French), Eyrolles, 2004.
ISBN 2-212-11463-X.ProgrammierhandbücherAsente, Paul, Paul, Converse, Diana, and Swick, Ralph.
X Window System Toolkit. Digital Press,
1998. ISBN 1-55558-178-1Computer Systems Research Group, UC Berkeley. 4.4BSD
Programmer's Reference Manual. O'Reilly &
Associates, Inc., 1994. ISBN 1-56592-078-3Computer Systems Research Group, UC Berkeley. 4.4BSD
Programmer's Supplementary Documents. O'Reilly &
Associates, Inc., 1994. ISBN 1-56592-079-1Harbison, Samuel P. and Steele, Guy L. Jr. C: A
Reference Manual. 4th ed. Prentice Hall, 1995.
ISBN 0-13-326224-3Kernighan, Brian and Dennis M. Ritchie. The C
Programming Language. 2nd Ed., PTR Prentice Hall,
1988. ISBN 0-13-110362-9Lehey, Greg. Porting UNIX Software.
O'Reilly & Associates, Inc., 1995. ISBN 1-56592-126-7Plauger, P. J. The Standard C Library.
Prentice Hall, 1992. ISBN 0-13-131509-9Spinellis, Diomidis.
Code
Reading: The Open Source Perspective.
Addison-Wesley, 2003. ISBN 0-201-79940-5Spinellis, Diomidis. Code
Quality: The Open Source Perspective.
Addison-Wesley, 2006. ISBN 0-321-16607-8Stevens, W. Richard and Stephen A. Rago.
Advanced Programming in the UNIX
Environment. 2nd Ed.
Reading, Mass. : Addison-Wesley, 2005.
ISBN 0-201-43307-9Stevens, W. Richard. UNIX Network
Programming. 2nd Ed, PTR Prentice Hall, 1998. ISBN
0-13-490012-XWells, Bill. Writing Serial Drivers for UNIX.
Dr. Dobb's Journal. 19(15), December 1994.
pp68-71, 97-99.Betriebssystem-InternaAndleigh, Prabhat K. UNIX System
Architecture. Prentice-Hall, Inc., 1990. ISBN
0-13-949843-5Jolitz, William. Porting UNIX to the 386.
Dr. Dobb's Journal. January 1991-July
1992.Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and
John Quarterman The Design and Implementation of the
4.3BSD UNIX Operating System. Reading, Mass. :
Addison-Wesley, 1989. ISBN 0-201-06196-1Kapitel 2 dieses Buchs ist Teil des FreeBSD Documentation
Projects und online
erhältlich. Kapitel 9 findet sich
hier.Leffler, Samuel J., Marshall Kirk McKusick, The Design
and Implementation of the 4.3BSD UNIX Operating System: Answer
Book. Reading, Mass. : Addison-Wesley, 1991. ISBN
0-201-54629-9McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and
John Quarterman. The Design and Implementation of the
4.4BSD Operating System. Reading, Mass. :
Addison-Wesley, 1996. ISBN 0-201-54979-4Marshall Kirk McKusick, George V. Neville-Neil.
The Design and Implementation of the
&os; Operating System.
Boston, Mass. : Addison-Wesley, 2004.
ISBN 0-201-70245-2Stevens, W. Richard. TCP/IP Illustrated, Volume 1:
The Protocols. Reading, Mass. : Addison-Wesley,
1996. ISBN 0-201-63346-9Schimmel, Curt. Unix Systems for Modern
Architectures. Reading, Mass. : Addison-Wesley, 1994.
ISBN 0-201-63338-8Stevens, W. Richard. TCP/IP Illustrated, Volume 3:
TCP for Transactions, HTTP, NNTP and the UNIX Domain
Protocols. Reading, Mass. : Addison-Wesley, 1996.
ISBN 0-201-63495-3Vahalia, Uresh. UNIX Internals -- The New
Frontiers. Prentice Hall, 1996. ISBN
0-13-101908-2Wright, Gary R. and W. Richard Stevens. TCP/IP
Illustrated, Volume 2: The Implementation. Reading,
Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-XSicherheits-AnleitungCheswick, William R. and Steven M. Bellovin. Firewalls
and Internet Security: Repelling the Wily Hacker.
Reading, Mass. : Addison-Wesley, 1995. ISBN
0-201-63357-4Garfinkel, Simson and Gene Spafford.
Practical UNIX & Internet Security.
2nd Ed. O'Reilly & Associates, Inc., 1996. ISBN
1-56592-148-8Garfinkel, Simson. PGP Pretty Good
Privacy O'Reilly & Associates, Inc., 1995. ISBN
1-56592-098-8Hardware-AnleitungAnderson, Don and Tom Shanley. Pentium Processor
System Architecture. 2nd Ed. Reading, Mass. :
Addison-Wesley, 1995. ISBN 0-201-40992-5Ferraro, Richard F. Programmer's Guide to the EGA,
VGA, and Super VGA Cards. 3rd ed. Reading, Mass. :
Addison-Wesley, 1995. ISBN 0-201-62490-7Die Intel Corporation veröffentlicht Dokumentationen
Ihrer CPUs, Chipsets und Standards auf ihrer developer web site,
normalerweise als PDF-Dateien.Shanley, Tom. 80486 System Architecture.
3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN
0-201-40994-1Shanley, Tom. ISA System Architecture.
3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN
0-201-40996-8Shanley, Tom. PCI System Architecture.
4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN
0-201-30974-2Van Gilluwe, Frank. The Undocumented PC,
2nd Ed.
Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN
0-201-47950-8Messmer, Hans-Peter. The Indispensable PC Hardware
Book, 4th Ed.
Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN
0-201-59616-4&unix; GeschichteLion, John Lion's Commentary on UNIX, 6th Ed. With
Source Code. ITP Media Group, 1996. ISBN
1573980137Raymond, Eric S. The New Hacker's Dictionary, 3rd
edition. MIT Press, 1996. ISBN
0-262-68092-0. Auch bekannt als das Jargon
FileSalus, Peter H. A quarter century of UNIX.
Addison-Wesley Publishing Company, Inc., 1994. ISBN
0-201-54777-5Simon Garfinkel, Daniel Weise, Steven Strassmann. The
UNIX-HATERS Handbook. IDG Books Worldwide, Inc.,
1994. ISBN 1-56884-203-1.
Online verfügbar.Don Libes, Sandy Ressler Life with UNIX
— special edition. Prentice-Hall, Inc., 1989. ISBN
0-13-536657-7The BSD family tree.
oder unter /usr/share/misc/bsd-family-tree
auf einem FreeBSD-System.Networked Computer Science Technical Reports
Library.
Old BSD releases from the Computer Systems Research
group (CSRG).
:
Das Paket mit 4 CD-ROMs enthält alle BSD-Versionen von 1BSD
bis 4.4BSD und 4.4BSD-Lite2 (nicht aber 2.11BSD). Die letzte CD
beinhaltet auch die finalen Sourcen inklusive den
SCCS Dateien.Magazine und JournaleThe C/C++ Users Journal. R&D
Publications Inc. ISSN 1075-2838Sys Admin — The Journal for UNIX System
Administrators Miller Freeman, Inc., ISSN
1061-2688freeX – Das Magazin für Linux –
BSD – UNIX (in deutscher Sprache),
Computer- und Literaturverlag GmbH,
ISSN 1436-7033
diff --git a/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml b/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml
index 2c4deda11c..e9fabae3ac 100644
--- a/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml
@@ -1,681 +1,667 @@
TomRhodesGeschrieben von BenedictReuschlingÜbersetzt von DanielSeuffertDateisystemunterstützungÜbersichtFile SystemsFile Systems SupportFile SystemsDateisysteme sind ein wesentlicher Bestandteil von Betriebssystemen.
Sie erlauben es den Benutzern Dateien zu laden und zu speichern,
ermöglichen den Zugriff auf die Daten und machen Festplatten
überhaupt erst nützlich. Unterschiedliche Betriebssysteme
besitzen normalerweise eine Gemeinsamkeit, nämlich deren
mitgeliefertes Dateisystem. Bei &os; ist dieses Dateisystem bekannt
unter dem Namen Fast File System FFS, das direkt auf
dem Original-Unix™ Dateisystem, UFS genannt,
basiert. Dieses ist das von &os; mitgelieferte Dateisystem, das auf
Festplatten für den Dateizugriff verwendet wird.&os; unterstützt auch eine Vielzahl von anderen Dateisystemen,
um auf Daten von anderen Betriebssystemen lokal zuzugreifen, wie z.B.
Daten auf USB-Speichermedien, Flash-Speichern und
Festplatten. Es gibt auch Unterstützung für fremde
Dateisysteme. Dabei handelt es sich um Dateisysteme, die auf anderen
Betriebssystemen entwickelt wurden, wie beispielsweise das &linux;
Extended File System (EXT) und das Z-Dateisystem
(ZFS) von &sun;.Es gibt verschiedene Stufen der Unterstützung in &os;
für diese unterschiedlichen Dateisysteme. Manche benötigen ein
geladenes Kernelmodul, andere die Installation bestimmter Werkzeuge.
Dieses Kapitel dient dazu, den Benutzern von &os; dazu helfen, auf andere
Dateisysteme zuzugreifen, beginnend mit &sun;s Z-Dateisystem (ZFS).Nachdem Sie dieses Kapitel gelesen haben, werden Sie die folgenden
Dinge wissen:Den Unterschied zwischen eingebauten und unterstützten
Dateisystemen.Welche Dateisysteme von &os; unterstützt werden.Wie man fremde Dateisysteme aktiviert, konfiguriert, darauf
zugreift und diese verwendet.Bevor Sie dieses Kapitel lesen, sollten Sie:Grundlagen von &unix; und &os; verstehen
().Mit den Grundlagen der Konfiguration und dem Bauen des Kernels
vertraut sein ().Problemlos Software von Drittherstellern in &os; installieren
können ().sich ein wenig mit Festplatten, Speicher und Gerätenamen
in &os; auskennen ().
-
-
-
- Die ZFS-Funktionen sind als experimentell
- zu betrachten. Manchen Optionen werden möglicherweise bestimmte
- Funktionalitäten fehlen, andere funktionieren eventuell gar
- nicht. Mit der Zeit werden diese Eigenschaften als für den
- Produktivbetrieb geeignet erachtet werden und dann wird diese
- Dokumentation entsprechend geändert, um diesem Zustand
- gerecht zu werden.
- Das Z-Dateisystem (ZFS)Das Z-Dateisystem ist eine neue von &sun; entwickelte Technologie,
mit dem Konzept einer gepoolten Speichermethodik. Das bedeutet, dass
Speicher nur verwendet wird, wenn dieser als Datenspeicher benutzt wird.
ZFS wurde auch für maximale Datenintegrität entwickelt und
unterstützt dabei mehrfache Kopien, Schnappschüsse und
Prüfsummen für Daten. Ein neues Datenreplikationsmodell,
bekannt als RAID-Z, wurde ebenfalls hinzugefügt.
Das RAID-Z-Modell ist ähnlich zu
RAID5, wurde aber mit dem Ziel entworfen,
Datenverfälschung beim Schreiben zu verhindern.ZFS EinstellungenDas ZFS-Teilsystem benötigt viele
Systemressourcen, weshalb gewisse Einstellungen notwendig sind, um
maximale Effizienz während des täglichen Gebrauchs zu
gewährleisten. Da es sich um eine experimentelle Funktion in &os;
handelt, wird sich das in naher Zukunft ändern. Wie dem auch sei,
zum gegenwärtigen Zeitpunkt wird die Anwendung der folgenden
Schritte empfohlen.HauptspeicherDer verfügbare Hauptspeicher im System sollte mindestens
1 Gigabyte betragen, jedoch werden 2 Gigabyte oder mehr
empfohlen. In allen gezeigten Beispielen in diesem Abschnitt
verwendet das System 1 Gigabyte Hauptspeicher mit mehreren
anderen Einstellungen.Manche Nutzer hatten Erfolg bei der Verwendung von weniger
als 1 GB Hauptspeicher, aber mit dieser begrenzten Menge an RAM
ist es sehr wahrscheinlich, dass &os; eine Panic wegen
erschöpftem Hauptspeicher erleiden wird, wenn es hohen
Belastungen ausgesetzt ist.KernelkonfigurationEs wird vorgeschlagen, nicht benötigte Treiber und Optionen
aus der Kernelkonfigurationsdatei zu entfernen. Da die meisten
Geräte als Module verfügbar sind, können diese einfach
mittels der Datei /boot/loader.conf geladen
werden.Nutzer der &i386;-Architektur sollten die folgende Option in
ihrer Kernelkonfigurationsdatei hinzufügen, den Kernel neu
erstellen und anschliessend das System neustarten:options KVA_PAGES=512Diese Option wird den Adressraum des Kernels vergrössern,
was es ermöglicht, die Einstellung vm.kvm_size
über die momentan verhängte Grenze von 1 GB
(2 GB für PAE) zu erhöhen. Um den
passenden Wert dieser Option zu ermitteln, teilen Sie den
gewünschten Adressraum in Megabyte durch vier. In diesem Fall
beträgt er 512 für 2 GB.Einstellungen des LoadersDer kmem-Addressraum sollte auf allen
&os;-Architekturen erhöht werden. Die folgende Option, die dem
Testsystem mit einem Gigabyte Hauptspeicher der Datei
/boot/loader.conf hinzugefügt und welches
anschliessend neu gestartet wurde, war erfolgreich:vm.kmem_size="330M"
vm.kmem_size_max="330M"
vfs.zfs.arc_max="40M"
vfs.zfs.vdev.cache.size="5M"Eine detailliertere Liste von Vorschlägen zu ZFS-verwandten
Einstellungen finden Sie unter .Verwenden von ZFSEs existiert ein Startmechanismus, der es &os; erlaubt,
ZFS als Pool während des Systemstarts
zu initialisieren. Um das zu tun, geben Sie die folgenden Befehle
ein:&prompt.root; echo 'zfs_enable="YES"' >> /etc/rc.conf
&prompt.root; /etc/rc.d/zfs startFür den Rest dieses Dokuments wird angenommen, dass drei
SCSI-Platten im System verfügbar sind und
dass deren Gerätenamen
da0,
da1 und
da2 lauten.
Benutzer von IDE-Hardware können
ad-Geräte
an Stelle von SCSI-Hardware einsetzen.Pool mit nur einer PlatteUm ein einfaches, nicht-redundantes ZFS auf
einer einzelnen Festplatte zu erstellen, benutzen Sie das
zpool-Kommando:&prompt.root; zpool create example /dev/da0Um den neuen Pool anzusehen, überprüfen Sie die
Ausgabe von df:&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235230 1628718 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032846 48737598 2% /usr
example 17547136 0 17547136 0% /exampleDiese Ausgabe zeigt deutlich, dass der
example-Pool nicht nur erstellt, sondern auch
gemountet wurde. Er ist genau wie andere
Dateisysteme verfügbar, Dateien können darin erstellt und
von den Benutzern aufgelistet werden, wie im folgenden Beispiel
gezeigt wird:&prompt.root cd /example
&prompt.root; ls
&prompt.root; touch testfile
&prompt.root; ls -al
total 4
drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfileLeider verwendet dieser Pool keine der Vorteile der
ZFS-Eigenschaften. Erstellen Sie ein Dateisystem
auf diesem Pool und aktivieren Sie die Komprimierung darauf:&prompt.root; zfs create example/compressed
&prompt.root; zfs set compression=gzip example/compressedJetzt ist example/compressed ein von
ZFS komprimiertes Dateisystem. Versuchen Sie, ein
paar grosse Dateien in das Verzeichnis /example/compressed zu kopieren.Die Komprimierung kann jetzt deaktiviert werden mittels:&prompt.root; zfs set compression=off example/compressedUm das Dateisystem aus dem Verzeichnisbaum abzuhängen, geben
Sie den folgenden Befehl ein und vergewissern Sie sich über
df vom Erfolg dieser Aktion:&prompt.root; zfs umount example/compressed
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235232 1628716 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /exampleMounten Sie das Dateisystem erneut, um es wieder verfügbar
zu machen und bestätigen Sie mit df:&prompt.root; zfs mount example/compressed
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressedDer Pool und das Dateisystem können genausogut über die
Ausgabe von mount überwacht werden:&prompt.root; mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
example on /example (zfs, local)
example/data on /example/data (zfs, local)
example/compressed on /example/compressed (zfs, local)Wie zu beobachten ist, können
ZFS-Dateisysteme nach deren Erstellung genauso
wie normale Dateisysteme verwendet werden, jedoch sind auch noch viele
andere Eigenschaften verfügbar. Im folgenden Beispiel wird ein
neues Dateisystem, data, erstellt. Wichtige
Dateien sollen hier gespeichert werden, weshalb das Dateisystem
angewiesen wird, jeweils zwei Kopien jedes Datenblocks zu
unterhalten:&prompt.root; zfs create example/data
&prompt.root; zfs set copies=2 example/dataEs ist nun möglich, den Speicherplatzverbrauch der Daten
mittels df erneut zu betrachten:&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
example/data 17547008 0 17547008 0% /example/dataBeachten Sie, dass jedem Dateisystem des Pools die gleiche Menge
an Speicher zur Verfügung steht. Das ist der Grund für die
Verwendung von df in all diesen Beispielen, da es
zeigt, dass das Dateisystem nur den Speicher belegt, den es auch
benötigt und alles wird von dem gleichen Pool abgezogen.
ZFS macht Konzepte wie Volumen und Partitionen
überflüssig und erlaubt mehrere Dateisysteme auf demselben
Pool. Zerstören Sie die Datensysteme und anschliessend den Pool,
da sie nicht länger gebraucht werden:&prompt.root; zfs destroy example/compressed
&prompt.root; zfs destroy example/data
&prompt.root; zpool destroy exampleFestplatten werden mit der Zeit schlechter und fallen aus, eine
unvermeidliche Tatsache. Wenn diese Platte ausfällt, sind die
Daten verloren. Eine Möglichkeit, diesen Datenverlust beim
Plattenausfall zu vermeiden, ist die Verwendung von
RAID. ZFS unterstützt
diese Eigenschaft im Entwurf seiner Pools und wird im nächsten
Abschnitt behandelt.ZFS RAID-ZWie zuvor bereits erwähnt, wird in diesem Abschnitt
angenommen, dass drei SCSI-Geräte vorhanden
sind (da0, da1
und da1 bzw. ad0
und so weiter, falls IDE-Platten verwendet werden). Um einen
RAID-Z Pool zu erstellen, geben Sie das
folgende Kommando ein:&prompt.root; zpool create storage raidz da0 da1 da2&sun; empfiehlt, dass die Anzahl von Geräten in einer
RAID-Z Konfiguration drei bis neun beträgt.
Falls Ihre Anforderungen unbedingt einen einzelnen Pool, bestehend
aus zehn oder mehr Platten, erfordern, sollten Sie überlegen,
diesen in kleinere RAID-Z Gruppen aufzuteilen.
Sollten Sie nur zwei Platten zur Verfügung haben und trotzdem
Redundanz benötigen, ziehen Sie den Einsatz der
ZFS-Mirror (Spiegel) Fähigkeiten in
Betracht. Lesen Sie die &man.zpool.8; Manualpage, um mehr
darüber zu erfahren.Der storage-zPool sollte jetzt erstellt worden
sein. Sie können das überprüfen, indem Sie die Befehle
&man.mount.8; und &man.df.1; wie zuvor verwenden. Weitere
Plattenspeicher können an das Ende der oben stehenden Liste
hinzugefügt werden. Erstellen Sie ein neues Dateisystem in dem
Pool, home genannt, in dem später Dateien von
Benutzern platziert werden:&prompt.root; zfs create storage/homeNun kann die Komprimierung aktiviert und zusätzliche
Kopien der Benutzerverzeichnisse und der darin enthaltenen Dateien
angelegt werden. Dies geschieht über die gleichen Befehle
wie bereits zuvor:&prompt.root; zfs set copies=2 storage/home
&prompt.root; zfs set compression=gzip storage/homeUm dieses Verzeichnis als neues Benutzerverzeichnis zu verwenden,
kopieren Sie die Nutzerdaten dort hin und erstellen Sie die
entsprechenden Symlinks:&prompt.root; cp -rp /home/* /storage/home
&prompt.root; rm -rf /home /usr/home
&prompt.root; ln -s /storage/home /home
&prompt.root; ln -s /storage/home /usr/homeAnwender sollten jetzt ihre Daten in dem neu angelegten /storage/home Dateisystem auffinden.
Prüfen Sie das, indem Sie einen neuen Benutzer hinzufügen
und sich als dieser Benutzer am System anmelden.Versuchen Sie, einen Schnappschuss anzulegen, der später
wieder zurückgerollt werden kann:&prompt.root; zfs snapshot storage/home@08-30-08Beachten Sie, dass die Schnappschuss-Option nur auf echte
Dateisysteme, jedoch nicht auf Verzeichnisse oder eine Datei
angewendet werden kann. Das @-Zeichen dient als
Begrenzer zwischen dem Dateisystem- oder Volumenamen. Wenn ein
Benutzerverzeichnis zerstört wird, können Sie es über
den folgenden Befehl wieder herstellen:&prompt.root; zfs rollback storage/home@08-30-08Um eine Liste von allen verfügbaren Schnappschüssen zu
erhalten, starten Sie das ls-Kommando in
Verzeichnis .zfs/snapshot des entsprechenden
Dateisystems. Beispielsweise können Sie den vorhin angelegten
Schnappschuss mit dem folgenden Befehl auflisten:&prompt.root; ls /storage/home/.zfs/snapshotEs ist möglich ein Skript zu schreiben, dass monatliche
Schnappschüsse der Nutzerdaten anlegt. Allerdings werden die
Schnappschüsse mit der Zeit eine grosse Menge an Speicherplatz
einnehmen. Den vorherigen Schnappschuss können Sie über
das folgende Kommando löschen:&prompt.root; zfs destroy storage/home@08-30-08Nach all diesen Tests gibt es keinen Grund, das Verzeichnis
/storage/home noch länger in seinem
momentanen Zustand zu belassen. Ernennen Sie es zum echten /home-Dateisystem:&prompt.root; zfs set mountpoint=/home storage/homeDie Eingabe der Befehle df und
mount zeigt, dass das System das Dateisystem nun
als das echte /home
behandelt:&prompt.root; mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
storage on /storage (zfs, local)
storage/home on /home (zfs, local)
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235240 1628708 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032826 48737618 2% /usr
storage 26320512 0 26320512 0% /storage
storage/home 26320512 0 26320512 0% /homeDamit ist die RAID-Z-Konfiguration
abgeschlossen. Um über den Status des Dateisystems mittels des
nächtlichen &man.periodic.8;-Skripts auf dem Laufenden gehalten
zu werden, geben Sie das folgende Kommando ein:&prompt.root; echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.confWiederherstellung von RAID-ZJedes Software-RAID besitzt Verfahren, um
dessen Zustand zu überwachen.
ZFS ist da keine Ausnahme. Der Status von
RAID-Z Geräten kann mittels des folgenden
Kommandos betrachtet werden:&prompt.root; zpool status -xWenn alle Pools gesund sind und alles normal ist, wird die
folgende Nachricht zurückgegeben:all pools are healthyWenn ein Problem existiert (möglicherweise ist eine Platte
ausgefallen), wird der Zustand des Pools ähnlich dem Folgenden
ausgegeben: pool: storage
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
storage DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
da0 ONLINE 0 0 0
da1 OFFLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsDas bedeutet, dass das Gerät vom Systemadministrator
abgeschaltet wurde. In diesem Fall trifft das zu. Um eine Platte
abzuschalten, wurde das folgende Kommando eingegeben:&prompt.root; zpool offline storage da1Es ist jetzt möglich, da1 zu
ersetzen, nachdem das System ausgeschaltet wurde. Wenn das System
wieder läuft, kann der folgende Befehl benutzt werden, um die
Platte zu ersetzen:&prompt.root; zpool replace storage da1Von da an kann der Status erneut überprüft werden,
jedoch dieses Mal ohne die Option , um die
Zustandsinformation zu bekommen:&prompt.root; zpool status storage
pool: storage
state: ONLINE
scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsWie in diesem Beispiel gezeigt, scheint alles wieder normal zu
sein.DatenüberprüfungWie bereits erwähnt, verwendet ZFS
Prüfsummen, um die Integrität der
gespeicherten Daten zu verifizieren. Die Prüfsummen werden
automatisch beim Erstellen des Dateisystem aktiviert und können
über den folgenden Befehl deaktiviert werden:&prompt.root; zfs set checksum=off storage/homeDas ist jedoch kein schlauer Einfall, da die Prüfsummen nur
ganz wenig Speicherplatz einnehmen und viel nützlicher sind,
wenn Sie aktiviert bleiben. Es scheint auch kein nennenswerter
Ressourcenverbrauch mit deren Aktivierung verbunden zu sein. Wenn die
Prüfsummen aktiv sind, kann ZFS die
Datenintegrität über den Vergleich der Prüfsummen
gewährleisten. Dieser Prozess wird als reinigen
bezeichnet. Um die Datenintegrität des
storage-Pools zu überprüfen, geben Sie
den folgenden Befehl ein:&prompt.root; zpool scrub storageDieser Prozess kann einige Zeit in Anspruch nehmen, abhängig
davon, wieviele Daten gespeichert sind. Es handelt sich dabei auch
um eine I/O-intensive Aktion, weshalb auch jeweils
nur eine dieser Operationen durchgeführt werden darf. Nachdem
die Reinigung abgeschlossen ist, wird der Status aktualisiert und
kann über eine Statusabfrage eingesehen werden:&prompt.root; zpool status storage
pool: storage
state: ONLINE
scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsDie Zeit des Abschlusses der Aktion kann in diesem Beispiel direkt
abgelesen werden. Die Prüfsummen helfen dabei, sicherzustellen,
dass die Datenintegrität über einen langen Zeitraum hinaus
erhalten bleibt.Es gibt viele weitere Optionen für das Z-Dateisystem, lesen
Sie dazu die Manualpage &man.zfs.8; und &man.zpool.8;.
diff --git a/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml b/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml
index 673974d115..453bf728f0 100644
--- a/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml
@@ -1,1291 +1,1295 @@
JimMockNeu zusammengestellt, umstrukturiert und um
Abschnitte erweitert durch SaschaEdelburgÜbersetzt von EinführungÜbersichtHerzlichen Dank für Ihr Interesse an &os;! Das
folgende Kapitel behandelt verschiedene Aspekte des
&os; Projects wie dessen geschichtliche Entwicklung,
dessen Ziele oder dessen Entwicklungsmodell.Nach dem Durcharbeiten des Kapitels wissen Sie über
folgende Punkte Bescheid:Wo &os; im Vergleich zu anderen Betriebssystemen
stehtDie Geschichte des &os; ProjectsDie Ziele des &os; ProjectsDie Grundlagen des
&os;-Open-Source-EntwicklungsmodellsUnd natürlich wo der Name &os;
herrührtWillkommen bei &os;!4.4BSD-Lite&os; ist ein auf 4.4BSD-Lite basierendes Betriebssystem
für Intel (x86 und &itanium;), AMD64, Alpha
und Sun &ultrasparc; Rechner. An
Portierungen zu anderen Architekturen wird derzeit gearbeitet.
Mehr zu Geschichte von &os; können Sie im kurzen geschichtlichen Abriss zu &os;
oder im Abschnitt Das aktuelle
&os;-Release nachlesen.
Falls Sie das &os; Project unterstützen wollen
(mit Quellcode, Hardware- oder Geldspenden), sollten Sie den
Artikel
&os; unterstützen lesen.Was kann &os;?&os; hat zahlreiche bemerkenswerte Eigenschaften.
Um nur einige zu nennen:Präemptives MultitaskingPräemptives Multitasking mit
dynamischer Prioritätsanpassung zum reibungslosen und
ausgeglichenen Teilen der Systemressourcen zwischen
Anwendungen und Anwendern, selbst unter schwerster
Last.MehrbenutzerbetriebDer Mehrbenutzerbetrieb von
&os; erlaubt es, viele Anwender gleichzeitig am System
mit verschiedenen Aufgaben arbeiten zu lassen.
Beispielsweise Geräte wie Drucker oder Bandlaufwerke,
die sich nur schwerlich unter allen Anwendern des Systems
oder im Netzwerk teilen lassen, können durch Setzen
von Verwendungsbeschränkungen auf Benutzer oder
Benutzergruppen wichtige Systemressourcen vor
Überbeanspruchung schützen.TCP/IP-NetzwerkfähigkeitHervorragende
TCP/IP-Netzwerkfähigkeit mit
Unterstützung von Industriestandards wie SCTP, DHCP,
NFS, NIS, PPP, SLIP, IPsec und IPv6. Das heißt,
Ihr &os;-System kann in einfachster Weise mit anderen
Systemen interagieren. Zudem kann es als Server-System im
Unternehmen wichtige Aufgaben übernehmen,
beispielsweise als NFS- oder E-Mail-Server oder es kann
Ihren Betrieb durch HTTP- und FTP-Server beziehungsweise
durch Routing und Firewalling Internet-fähig machen.SpeicherschutzDer Speicherschutz stellt sicher,
dass Anwendungen (oder Anwender) sich nicht gegenseitig
stören. Stürzt eine Anwendung ab, hat das
keine Auswirkung auf andere Prozesse.&os; ist ein
32-Bit-Betriebssystem
(64-Bit auf Alpha, &itanium;, AMD64,
und &ultrasparc;) und wurde als solches von Grund auf
neu entworfen.X-Window-SystemXFree86Das X-Window-System (X11R7) als
Industriestandard bietet eine grafische Benutzeroberfläche
(GUI). Minimale Voraussetzung zur Verwendung ist
lediglich eine Grafikkarte und ein Bildschirm, die beide
den VGA-Modus unterstützen.BinärkompatibilitätLinuxBinärkompatibilitätSCOBinärkompatibilitätSVR4BinärkompatibilitätBSD/OSBinärkompatibilitätNetBSDBinärkompatibilität mit
vielen unter verschiedenen Betriebssystemen erstellten
Programmen wie Linux, SCO, SVR4, BSDI und NetBSD.Tausende von sofort
lauffähigen Anwendungen sind aus den
Ports- und
Packages-Sammlungen für &os;
verfügbar. Warum mühselig im Netz Software
suchen, wenn sie bereits hier vorhanden ist?Tausende zusätzliche leicht zu
portierende Anwendungen sind über das
Internet zu beziehen. &os; ist Quellcode-kompatibel
mit den meisten kommerziellen &unix; Systemen. Daher
bedürfen Anwendungen häufig nur geringer oder
gar keiner Anpassung, um auf einem &os;-System zu
kompilieren.virtueller SpeicherSeitenweise anforderbarer Virtueller
Speicher und der merged VM/buffer
cache-Entwurf bedient effektiv den großen
Speicherhunger mancher Anwendungen bei gleichzeitigem
Aufrechterhalten der Bedienbarkeit des Systems für
weitere Benutzer.Symmetrisches Multi-Processing (SMP)SMP-Unterstützung für
MehrprozessorsystemeKompilerCKompilerC++KompilerFORTRANEin voller Satz von C,
C++ und Fortran-
Entwicklungswerkzeugen. Viele
zusätzliche Programmiersprachen für Wissenschaft
und Entwicklung sind aus der Ports- und Packages-Sammlung
zu haben.QuellcodeQuellcode für das gesamte
System bedeutet größtmögliche Kontrolle
über Ihre Umgebung. Warum sollte man sich durch
proprietäre Lösungen knebeln und sich auf Gedeih
und Verderb der Gnade eines Herstellers ausliefern, wenn
man doch ein wahrhaft offenes System haben kann?Umfangreiche
Online-Dokumentation.4.4BSD-LiteComputer Systems Research Group (CSRG)U.C. Berkeley&os; basiert auf dem 4.4BSD-Lite-Release der Computer
Systems Research Group (CSRG) der Universität von
Kalifornien in Berkeley und führt die namhafte
Tradition der Entwicklung von BSD-Systemen fort.
Zusätzlich zu der herausragenden Arbeit der CSRG hat das
&os; Project tausende weitere Arbeitsstunden investiert,
um das System zu verfeinern und maximale Leistung und
Zuverlässigkeit bei Alltagslast zu bieten. Während
viele kommerzielle Riesen Probleme haben PC-Betriebssysteme
mit derartigen Funktionen, Leistungpotential und
Zuverlässigkeit anzubieten, kann &os; damit schon
jetzt aufwarten! Die Anwendungsmöglichkeiten von &os; werden nur
durch Ihre Vorstellungskraft begrenzt. Von
Software-Entwicklung bis zu Produktionsautomatisierung, von
Lagerverwaltung über Abweichungskorrektur bei Satelliten;
Falls etwas mit kommerziellen &unix; Produkten machbar ist, dann
ist es höchstwahrscheinlich auch mit &os;
möglich. &os; profitiert stark von tausenden
hochwertigen Anwendungen aus wissenschaftlichen Instituten und
Universitäten in aller Welt. Häufig sind diese
für wenig Geld oder sogar kostenlos zu bekommen.
Kommerzielle Anwendungen sind ebenso verfügbar und es
werden täglich mehr.Durch den freien Zugang zum Quellcode von &os; ist es
in unvergleichbarer Weise möglich, das System für
spezielle Anwendungen oder Projekte anzupassen. Dies ist
mit den meisten kommerziellen Betriebssystemen einfach nicht
möglich. Beispiele für Anwendungen, die unter
&os; laufen, sind:Internet-Dienste: Die robuste
TCP/IP-Implementierung in &os; macht es zu einer
idealen Plattform für verschiedenste
Internet-Dienste, wie zum Beispiel:FTP-ServerFTP-ServerHTTP-ServerHTTP-Server (Standard-Web-Server oder mit
SSL-Verschlüsselung)IPv4- und IPv6-RoutingFirewallNATFirewalls und NAT-Gateways
(IP-Masquerading)E-MailE-Mail-ServerUsenetUsenet-News und Foren (BBS)Zum Betreiben von &os; reicht schon ein
günstiger 386-PC. Wenn es das Wachstum Ihres
Unternehmens verlangt, kann &os; aber auch auf einem
hochgerüsteten 4-Wege-System mit Xeon-Prozessoren
und RAID-Plattenspeicher Verwendung finden.Bildung: Sind Sie
Informatikstudent oder Student eines verwandten
Studiengangs? Die praktischen Einblicke in &os; sind
die beste Möglichkeit etwas über Betriebssysteme,
Rechnerarchitektur und Netzwerke zu lernen. Einige frei
erhältliche CAD-, mathematische und grafische Anwendungen
sind sehr nützlich, gerade für diejenigen, die
&os; nicht zum Selbstzweck, sondern als
Arbeitsmittel einsetzen.Wissenschaft: Mit dem frei
verfügbaren Quellcode für das gesamte System
bildet &os; ein exzellentes Studienobjekt in der
Disziplin der Betriebssysteme, wie auch in anderen Zweigen
der Informatik. Es ist beispielsweise denkbar, das
räumlich getrennte Gruppen gemeinsam an einer Idee
oder Entwicklung arbeiten. Das Konzept der freien
Verfügbarkeit und -nutzung von &os;
ermöglicht so einen Gebrauch, auch ohne sich
groß Gedanken über Lizenzbedingungen oder
-beschränkungen machen zu müssen.RouterDNS-ServerNetzwerkfähigkeit: Brauchen
Sie einen neuen Router? Oder einen Name-Server (DNS)? Eine
Firewall zum Schutze Ihres Intranets vor Fremdzugriff?
&os; macht aus dem in der Ecke verstaubenden 386- oder
486-PC im Handumdrehen einen leistungsfähigen Router
mit anspruchsvollen Packet-Filter-Fähigkeiten.X-Window-SystemXFree86X-Window-SystemAccelerated-XX-Window-Workstation: &os; ist
eine gute Wahl für kostengünstige X-Terminals
mit dem frei verfügbaren X11-Server.
Im Gegensatz zu einem X-Terminal erlaubt es &os;, viele
Anwendungen lokal laufen zu lassen, was die Last eines
zentralen Servers erleichtern kann. &os; kann selbst
plattenlos starten, was einzelne
Workstations noch günstiger macht und die Wartung
erleichtert.GNU-Compiler-CollectionSoftware-Entwicklung: Das
Standard-System von &os; wird mit einem kompletten Satz
an Entwicklungswerkzeugen bereitgestellt, unter anderem
mit dem bekannten GNU C/C++-Kompiler und -Debugger.&os; ist sowohl in Form von Quellcode als auch in
Binärform auf CD-ROM, DVD und über anonymous FTP
erhältlich. Näheres zum Bezug von &os;
enthält .Wer benutzt &os;?AnwenderBekannte &os;-Anwender&os; dient als Plattform für Geräte und Produkte
einiger der weltgrößten IT-Firmen, darunter:AppleAppleCiscoCiscoJuniperJuniperNetAppNetAppAußerdem laufen einige der größten
Internet-Auftritte unter &os;, beispielsweise:Yahoo!Yahoo!Yandex/primary>YandexApacheApacheRamblerRamblerSinaSinaPair NetworksPair
NetworksSony JapanSony
JapanNetcraftNetcraftNetEaseNetEaseWeathernewsWeathernewsTELEHOUSE AmericaTELEHOUSE
AmericaDas &os; ProjectDer folgende Abschnitt bietet einige
Hintergrundinformationen zum &os; Project,
einschließlich einem kurzen geschichtlichen Abriss,
den Projektzielen und dem Entwicklungsmodell.JordanHubbardBeigesteuert von Kurzer geschichtlicher Abriss zu &os;386BSD PatchkitHubbard, JordanWilliams, NateGrimes, Rod&os; ProjectGeschichteDas &os; Project erblickte das Licht der Welt Anfang
1993 teils als Auswuchs des Unofficial 386BSD
Patchkit unter der Regie der letzten drei
Koordinatoren des Patchkits: Nate Williams, Rod Grimes und
mir.386BSDUnser eigentliches Ziel war es, einen zwischenzeitlichen
Abzug von 386BSD zu erstellen, um ein paar Probleme zu
beseitigen, die das Patchkit-Verfahren nicht lösen
konnte. Einige von Ihnen werden sich in dem Zusammenhang noch
an die frühen Arbeitstitel 386BSD 0.5 oder
386BSD Interim erinnern.Jolitz, Bill386BSD war das Betriebssystem von Bill Jolitz. Dieses
litt bis zu diesem Zeitpunkt heftig unter fast
einjähriger Vernachlässigung. Als das Patchkit mit
jedem Tag anschwoll und unhandlicher wurde, waren wir
einhellig der Meinung, es müsse etwas geschehen. Wir
entschieden uns Bill Jolitz zu helfen, indem wir den
übergangsweise bereinigten Abzug zur
Verfügung stellten. Diese Pläne wurden unschön
durchkreuzt als Bill Jolitz plötzlich seine Zustimmung
zu diesem Projekt zurückzog, ohne einen Hinweis darauf,
was stattdessen geschehen sollte.Greenman, DavidWalnut Creek CDROMEs hat nicht lange gedauert zu entscheiden, dass das Ziel
es wert war, weiterverfolgt zu werden, selbst ohne Bills
Unterstützung. Also haben wir den von David Greenman
geprägten Namen &os; angenommen.
Unsere anfänglichen Ziele setzten wir nach
Rücksprache mit den damaligen Benutzern des Systems fest.
Und als deutlich wurde, das Projekt würde
möglicherweise Realität, nahm ich Kontakt mit Walnut
Creek CDROM auf, mit einem Auge darauf, den Vertriebsweg
für die vielen Missbegünstigten zu verbessern,
die keinen einfachen Zugang zum Internet hatten. Walnut Creek
CDROM unterstützte nicht nur die Idee des
CD-ROM-Vertriebs, sondern stellte sogar dem Projekt einen
Arbeitsrechner und eine schnelle Internetverbindung zur
Verfügung. Ohne den beispiellosen Glauben von Walnut
Creek CDROM in ein zu der Zeit absolut unbekanntes Projekt,
gäbe es &os; in der heutigen Form wohl nicht.4.3BSD-LiteNet/2U.C. Berkeley386BSDFree Software FoundationDie erste auf CD-ROM (und netzweit) verfügbare
Veröffentlichung war &os; 1.0 im Dezember
1993. Diese basierte auf dem Band der 4.3BSD-Lite
(Net/2) der Universität von Kalifornien in
Berkeley. Viele Teile stammten aus 386BSD und von der Free
Software Foundation. Gemessen am ersten Angebot, war
das ein ziemlicher Erfolg und wir ließen dem das extrem
erfolgreiche &os; 1.1 im Mai 1994 folgen.NovellU.C. BerkeleyNet/2AT&TZu dieser Zeit formierten sich unerwartete Gewitterwolken am
Horizont, als Novell und die Universität von Kalifornien
in Berkeley (UCB) ihren langen Rechtsstreit über den
rechtlichen Status des Berkeley Net/2-Bandes mit einem
Vergleich beilegten. Eine Bedingung dieser Einigung war es,
dass die UCB große Teile des Net/2-Quellcodes als
belastet zugestehen musste, und dass diese
Besitz von Novell sind, welches den Code selbst einige Zeit vorher
von AT&T bezogen hatte. Im Gegenzug bekam die UCB den
Segen von Novell, dass sich das 4.4BSD-Lite-Release
bei seiner endgültigen Veröffentlichung als
unbelastet bezeichnen darf. Alle Net/2-Benutzer sollten
auf das neue Release wechseln. Das betraf auch &os;. Dem
Projekt wurde eine Frist bis Ende Juli 1994 eingeräumt,
das auf Net/2-basierende Produkt nicht mehr zu vertreiben.
Unter den Bedingungen dieser Übereinkunft war es dem
Projekt noch erlaubt ein letztes Release vor diesem
festgesetzten Zeitpunkt herauszugeben. Das war
&os; 1.1.5.1.&os; machte sich dann an die beschwerliche Aufgabe,
sich Stück für Stück, aus einem neuen und
ziemlich unvollständigen Satz von 4.4BSD-Lite-Teilen,
wieder aufzubauen. Die
Lite-Veröffentlichungen waren deswegen
leicht, weil Berkeleys CSRG große Code-Teile,
die für ein start- und lauffähiges System gebraucht
wurden, aufgrund diverser rechtlicher Anforderungen entfernen
musste und weil die 4.4-Portierung für Intel-Rechner extrem
unvollständig war. Das Projekt hat bis November 1994
gebraucht diesen Übergang zu vollziehen, was dann zu dem
im Netz veröffentlichten &os; 2.0 und zur
CD-ROM-Version (im späten Dezember) führte. Obwohl
&os; gerade die ersten Hürden genommen hatte, war
dieses Release ein maßgeblicher Erfolg. Diesem folgte
im Juni 1995 das robustere und einfacher zu installierende
&os; 2.0.5.Im August 1996 veröffentlichten wir
&os; 2.1.5. Es schien unter ISPs und der Wirtschaft
beliebt genug zu sein, ein weiteres Release aus dem
2.1-STABLE-Zweig zu rechtfertigen. Das war
&os; 2.1.7.1. Es wurde im Februar 1997
veröffentlicht und bildete das Ende des
Hauptentwicklungszweiges 2.1-STABLE. Derzeit unterliegt
dieser Zweig dem Wartungsmodus, das heißt, es werden nur
noch Sicherheitsverbesserungen und die Beseitigung von
kritischen Fehlern vorgenommen (RELENG_2_1_0).&os; 2.2 entsprang dem Hauptentwicklungszweig
(-CURRENT) im November 1996 als
RELENG_2_2-Zweig und das erste komplette Release (2.2.1) wurde
im April 1997 herausgegeben. Weitere Veröffentlichungen
des 2.2-Zweiges gab es im Sommer und Herbst 1997. Das letzte
Release des 2.2-Zweiges bildete die Version 2.2.8, die im
November 1998 erschien. Das erste offizielle 3.0-Release
erschien im Oktober 1998 und läutete das Endes des
2.2-Zweiges ein.Am 20. Januar 1999 teilte sich der Quellbaum
in die Zweige 4.0-CURRENT und 3.X-STABLE. Auf dem
3.X-STABLE-Zweig wurden folgende
Releases erstellt: 3.1 am 15. Februar 1999,
3.2 am 15. Mai 1999,
3.3 am 16. September 1999,
3.4 am 20. Dezember 1999 und
3.5 am 24. Juni 2000. Letzterem
folgte ein paar Tage später das Release 3.5.1, welches
einige akute Sicherheitslöcher von Kerberos stopfte und
die letzte Veröffentlichung des 3.X-Zweiges
darstellte.Eine weitere Aufspaltung, aus dem der 4.X-STABLE-Zweig
hervorging, erfolgte am 13. März 2000.
Bisher gab es mehrere Veröffentlichungen
aus diesem Zweig: 4.0-RELEASE erschien im März 2000.
Das letzte Release, 4.11-RELEASE, erschien im Januar 2005.Das lang erwartete 5.0-RELEASE wurde am
19. Januar 2003 veröffentlicht. Nach nahezu
drei Jahren Entwicklungszeit brachte dieses Release die
Unterstützung für Mehrprozessor-Systeme sowie
für Multithreading. Mit diesem Release lief &os;
erstmalig auf den Plattformen &ultrasparc;
und ia64. Im Juni 2003 folgte
5.1-RELEASE. Das letzte 5.X-Release aus dem CURRENT-Zweig war
5.2.1-RELEASE, das im Februar 2004 veröffentlicht
wurde.Der Zweig RELENG_5 wurde im August 2004 erzeugt. Als
erstes Release dieses Zweiges wurde 5.3-RELEASE
veröffentlicht, bei dem es sich gleichzeitig auch um
das erste 5-STABLE-Release handelte. Das aktuelle
5.5-RELEASE (dem keine RELENG_5-Versionen mehr
folgen werden) erschien im
Mai 2006.Der Zweig RELENG_6 wurde im Juli 2005 erzeugt. 6.0-RELEASE,
das erste Release des 6.X-Zweiges, wurde im November 2005
- veröffentlicht. Das aktuelle &rel2.current;-RELEASE (dem
+ veröffentlicht. Das aktuelle 6.4-RELEASE (dem
keine weiteren RELENG_6-Versionen folgen werden)
- erschien im November 2008.
+ erschien im November 2008.
Der Zweig RELENG_7 wurde im Oktober 2007 erzeugt.
7.0-RELEASE, das erste Release des 7.X-Zweiges, wurde im
Februar 2008 veröffentlicht. Das aktuelle
- &rel.current;-RELEASE (dem weitere RELENG_7-Versionen folgen
- werden) erschien im
+ &rel2.current;-RELEASE (dem keine weiteren RELENG_7-Versionen
+ folgen werden) erschien im
Januar 2009.
+ Im August 2009 wurde der RELENG_8-Zweig angelegt.
+ 8.0-RELEASE, die erste Veröffentlichung im 8.X-Zweig,
+ erschien im November 2009.
+
Zurzeit werden Projekte mit langem Entwicklungshorizont
- im Zweig 8.X-CURRENT verfolgt, Schnappschüsse
- von 8.X auf CD-ROM (und natürlich im Netz) werden bei
+ im Zweig 9.X-CURRENT verfolgt, Schnappschüsse
+ von 9.X auf CD-ROM (und natürlich im Netz) werden bei
fortlaufender Entwicklung auf dem
Snapshot-Server zur Verfügung gestellt.JordanHubbardBeigesteuert von Ziele des &os; Projects&os; ProjectZieleDas &os; Project stellt Software her, die ohne
Einschränkungen für beliebige Zwecke eingesetzt
werden kann. Viele
von uns haben beträchtlich in Quellcode und Projekt
investiert und hätten sicher nichts dagegen, hin und
wieder ein wenig finanziellen Ausgleich dafür zu
bekommen. Aber in keinem Fall bestehen wir darauf. Wir
glauben unsere erste und wichtigste Mission ist
es, Software für jeden Interessierten und zu jedem Zweck
zur Verfügung zu stellen, damit die Software
größtmögliche Verbreitung erlangt und
größtmöglichen Nutzen stiftet. Das ist,
glaube ich, eines der grundlegenden Ziele freier Software,
welche wir mit größter Begeisterung
unterstützen.GNU General Public License (GPL)GNU Lesser General Public License (LGPL)BSD CopyrightDer Code in unserem Quellbaum, der unter die General
Public License (GPL) oder die Library General Public License
(LGPL) fällt, stellt geringfügig mehr Bedingungen.
Das aber vielmehr im Sinne von eingefordertem Zugriff, als das
übliche Gegenteil der Beschränkungen. Aufgrund
zusätzlicher Abhängigkeiten, die sich durch die
Verwendung von GPL-Software bei kommerziellem Gebrauch
ergeben, bevorzugen wir daher Software unter dem
transparenteren BSD-Copyright, wo immer es angebracht ist.SatoshiAsamiBeigesteuert von Das Entwicklungsmodell von &os;&os; ProjectEntwicklungsmodellDie Entwicklung von &os; ist ein offener und
vielseitiger Prozess. &os; besteht aus Beisteuerungen
von Hunderten Leuten rund um die Welt, wie Sie aus der
Liste
der Beitragenden ersehen können. Die vielen
Entwickler können aufgrund der Entwicklungs-Infrastruktur
von &os; über das Internet zusammenarbeiten. Wir suchen
ständig nach neuen Entwicklern, Ideen und jenen, die sich
in das Projekt tiefer einbringen wollen. Nehmen Sie einfach
auf der Mailingliste &a.hackers; Kontakt mit uns auf.
Die Mailingliste &a.announce; steht für wichtige
Ankündigungen, die alle &os;-Benutzer betreffen,
zur Verfügung.Unabhängig davon ob Sie alleine oder mit
anderen eng zusammen arbeiten, enthält die folgende
Aufstellung nützliche Informationen über das
&os; Project und dessen Entwicklungsabläufe.CVS- und SVN-RepositoriesCVSRepositoryConcurrent-Versions-SystemCVSSVNRepositorySubversionSVNDer Hauptquellbaum von &os; wurde über viele
Jahre ausschließlich mit CVS gepflegt, einem
frei erhältlichen Versionskontrollsystem, welches
mit &os; geliefert wird. Im Juni 2008 begann das
&os; Project mit dem Umstieg auf SVN (Subversion).
Dieser Schritt wurde notwendig, weil
CVS aufgrund des rapide
wachsenden Quellcodebaumes und dem Umfang der bereits
gespeichterten Revisisionsinformationen an seine Grenzen
zu stoßen begann. Während das
Hauptrepository nun SVN
verwendet, hat sich auf der Client-Seite nichts
geändert. Werkzeuge wie
CVSup und
csup, die auf der alten
CVS-Infrastruktur aufbauen,
funktionieren weiterhin, weil alle Änderungen,
die im SVN-Repository
erfolgen, in das
CVS-Repository portiert
werden. Im Moment wird nur src-Quellcodebaum
über SVN verwaltet.
Die Dokumentation, die Webseiten sowie die Ports
befinden sich weiterhin in einem
CVS-Repository. Das
Haupt-CVS-Repository
läuft auf einer Maschine in
Santa Clara, Kalifornien, USA. Von dort wird es auf
zahlreiche Server in aller Welt gespiegelt. Der
SVN-Quellbaum, der die Zweige
-CURRENT und
-STABLE enthält,
kann so einfach auf Ihr eigenes System gespiegelt
werden. Näheres dazu können Sie im Handbuch unter
Synchronisation der Quellen
in Erfahrung bringen.Die Committer-ListeCommitterDie Committer sind Personen
mit Schreibzugriff auf den
CVS-Quellbaum (der Begriff Committer
stammt vom &man.cvs.1;-Befehl commit,
der zum Einspeisen von Änderungen ins Repository
gebraucht wird). Der beste Weg, Vorschläge zur
Prüfung durch die Mitglieder der Committer-Liste
einzureichen, bietet der Befehl &man.send-pr.1;. Sollte es
unerwartete Probleme mit diesem Verfahren geben, besteht
immer noch die Möglichkeit eine E-Mail an die Liste
&a.committers; zu schicken.Das FreeeBSD-Core-TeamCore-TeamWürde man das &os; Project mit einem
Unternehmen vergleichen, so wäre das
&os;-Core-Team das
Gegenstück zum Vorstand. Die Hauptaufgabe des
Core-Teams ist es, das Projekt als Ganzes in gesunder
Verfassung zu halten und die weitere Entwicklung in die
richtige Bahn zu lenken. Das Anwerben leidenschaftlicher
und verantwortungsbewusster Entwickler ist eine
Aufgabe des Core-Team, genauso wie die Rekrutierung
neuer Mitglieder für das Core-Team, im Falle, dass
Altmitglieder aus dem Projekt aussteigen. Das
derzeitige Core-Team wurde im Juli 2008 aus einem Kreis
kandidierender Committer gewählt. Wahlen
werden alle zwei Jahre abgehalten.Einige Core-Team-Mitglieder haben auch spezielle
Verantwortungsbereiche. Das bedeutet, sie haben sich
darauf festgelegt, sicherzustellen, dass ein
größerer Teil des Systems so funktioniert wie
ausgewiesen. Eine vollständige Liste an &os;
beteiligter Entwickler und ihrer Verantwortungsbereiche
kann in der Liste der
Beitragenden eingesehen werden.Die Mehrzahl der Mitglieder des Core-Teams sind
Freiwillige in Bezug auf die &os;-Entwicklung und
profitieren nicht finanziell vom Projekt. Daher
sollte Verpflichtung nicht als
garantierter Support fehlinterpretiert
werden. Der oben angeführte Vergleich mit einem
Vorstand hinkt und es wäre angebrachter zu
erwähnen, dass diese Leute – wider besseres
Wissen – ihr eigenes Leben für &os;
aufgegeben haben!Weitere BeitragendeBeitragendeDie größte Entwicklergruppe sind
nicht zuletzt die Anwender selbst, die
Rückmeldungen und Fehlerbehebungen in einem anhaltend
hohen Maße an uns senden. Der bevorzugte Weg an
dem weniger zentralisierten Bereich der
&os;-Entwicklung teilzuhaben, ist die
Möglichkeit sich bei der Liste &a.hackers;
anzumelden. Weitere Informationen über die
verschiedenen &os;-Mailinglisten erhalten Sie in
.Die Liste
der zu &os; Beitragenden ist eine
lange und wachsende. Also warum nicht selbst dort
stehen, indem Sie gleich persönlich etwas zu
&os; beitragen?Quellcode ist nicht der einzige Weg, etwas zum
Projekt beizusteuern. Eine genauere Übersicht
über offene Aufgaben finden Sie auf der &os;-Web-Site.Zusammengefasst bildet unser Entwicklungsmodell einen
losen Verbund konzentrischer Kreise. Das zentralisierte
Modell ist auf die Bedürfnisse der
Anwender zugeschnitten, mit der einfachen
Möglichkeit eine zentrale Code-Basis zu verfolgen und
möglichen neuen Beitragenden nicht das Leben zu
erschweren! Unser Ziel ist es, ein stabiles Betriebssystem mit
einer großen Zahl passender
Programme zu bieten, die der Anwender
leicht installieren und anwenden kann. Und dieses Modell
funktioniert für diese Aufgabe ziemlich gut.Das Einzige was wir von möglichen neuen Mitgliedern
fordern, ist die gleiche Hingabe, mit der die jetzigen
Mitglieder am dauerhaften Erfolg arbeiten!Das aktuelle &os;-ReleaseNetBSDOpenBSD386BSDFree Software FoundationU.C. BerkeleyComputer Systems Research Group (CSRG)&os; ist ein (mit vollem Quellcode und ein frei
erhältliches) auf 4.4BSD-Lite-basierendes Release
für Intel &i386;, &i486;, &pentium;,
&pentium; Pro,
&celeron;,
&pentium; II,
&pentium; III,
&pentium; 4 (oder ein dazu kompatibler Prozessor),
&xeon;, DEC Alpha und
Sun &ultrasparc; Systeme.
Es stützt sich zum größten
Teil auf Software der Computer Systems Research Group (CSRG)
der Universität von Kalifornien in Berkeley mit einigen
Verbesserungen aus NetBSD, OpenBSD, 386BSD und der Free
Software Foundation.Seit unserem &os; 2.0 von Ende 1994 hat sich
Leistung, Funktionsvielfalt und Stabilität dramatisch
verbessert.
Die größte Änderung erfuhr das virtuelle
Speichermanagement durch eine Kopplung von virtuellem Speicher
und dem Buffer-Cache, das nicht nur die Leistung
steigert, sondern auch den Hauptspeicherverbrauch reduziert
und ein 5 MB-System zu einem nutzbaren Minimal-System
verhilft. Weitere Verbesserungen sind volle NIS-Client- und
Server-Unterstützung, T/TCP, Dial-On-Demand-PPP,
integriertes DHCP, ein verbessertes SCSI-Subsystem,
ISDN-Support, Unterstützung für ATM-, FDDI-, Fast-
und Gigabit-Ethernet-Karten (1000 Mbit), verbesserter
Support der neusten Adaptec-Controller und tausende
Fehlerkorrekturen.Zusätzlich zur Standard-Distribution bietet &os;
eine Sammlung von portierter Software mit tausenden begehrten
Programmen. Zum Verfassungszeitpunkt waren über
&os.numports; Anwendungen in der Ports-Sammlung! Das Spektrum
der Ports-Sammlung reicht von HTTP-Servern über Spiele,
Programmiersprachen, Editoren und so ziemlich allem
dazwischen. Die gesamte Ports-Sammlung benötigt
&ports.size; an Speicherplatz, wobei jeder Port anhand eines
Deltas zu den Quellen angegeben wird. Das
macht es für uns erheblich leichter, Ports zu
aktualisieren und es verringert den Plattenbedarf im Vergleich
zur älteren 1.0-Port-Sammlung. Um ein Port zu
übersetzen, müssen Sie einfach ins Verzeichnis des
Programms wechseln und ein make install
absetzen. Den Rest erledigt das System. Die originalen
Quellen jedes zu installierenden Port werden dynamisch von
CD-ROM oder einem FTP-Server bezogen. Es reicht also für
genügend Plattenplatz zu sorgen, um die gewünschten
Ports zu erstellen. Allen, die Ports nicht selbst kompilieren
wollen: Es gibt zu fast jedem Port ein vorkompiliertes
Paket, das einfach mit dem Befehl (pkg_add)
installiert wird. Pakete und Ports werden in
beschrieben.Eine Reihe von weiteren Dokumenten, die sich als hilfreich
bei der Installation oder dem Arbeiten mit &os; erweisen
könnten, liegen auf neueren &os;-Systemen im Verzeichnis
/usr/share/doc. Die lokal installierten
Anleitungen lassen sich mit jedem HTML-fähigen Browser
unter folgenden Adressen betrachten:Das &os;-Handbuch/usr/share/doc/handbook/index.htmlDie &os;-FAQ/usr/share/doc/faq/index.htmlEs besteht auch die Möglichkeit, sich die jeweils
aktuellste Version der Referenzdokumente unter anzusehen.
diff --git a/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml b/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml
index 676926dd75..30d4d14ad6 100644
--- a/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml
@@ -1,1090 +1,1089 @@
MatteoRiondatoBeigetragen von OliverPeterÜbersetzt von DirkArltJohannKoisJailsjailsÜbersichtDieses Kapitel erklärt, was &os;-Jails sind und wie man sie
einsetzt. Jails, manchmal als Ersatz für
chroot-Umgebungen bezeichnet, sind ein sehr
mächtiges Werkzeug für Systemadministratoren, jedoch kann
deren grundlegende Verwendung auch für fortgeschrittene Anwender
nützlich sein.Nachdem Sie dieses Kapitel gelesen haben, werden SieWissen, was eine Jail ist und welche Verwendungszwecke
es dafür unter &os; gibt.Wissen, wie man eine Jail erstellt, startet und
und anhält.Die Grundlagen der Jail-Administration (sowohl
innerhalb als auch ausserhalb des Jails) kennen.Weitere nützliche Informationen über Jails
sind beispielsweise in folgenden Quellen zu finden:Der &man.jail.8; Manualpage. Diese umfassende Referenz
beschreibt, wie man unter &os; eine Jail startet, anhält
und kontrolliert.Den Mailinglisten und deren Archive. Die Archive der
Mailingliste &a.questions; und anderen Mailinglisten, welche
vom &a.mailman.lists; bereitgestellt werden, beinhalten bereits
umfangreiche Informationen zu Jails. Daher ist es sinnvoll,
bei Problemen mit Jails zuerst die Archive der Mailinglisten
zu durchsuchen, bevor Sie eine neue Anfrage auf der
Mailingliste &a.questions.name; stellen.Jails - DefinitionenUm die für den Einsatz von Jails benötigten
FreeBSD-Funktionen, deren Interna sowie die Art und Weise, mit der
diese mit anderen Teilen des Betriebssystems interagieren, zu
erläutern, werden in diesem Kapitel folgende Definitionen
verwendet:
- &man.chroot.2; (-Befehl)
+ &man.chroot.8; (-Befehl)
- Ein &os;-Systemaufruf, der das root-Verzeichnis eines
- Prozesses und dessen Abkömmlinge verändert.
+ Ein Werkzeug, das den &os;-Systemaufruf &man.chroot.2;
+ verwendet, um das Wurzelverzeichnis eines Prozesses und all
+ seiner Nachkömmlinge zu ändern.&man.chroot.2; (-Umgebung)Die Umgebung eines Prozesses, der in einem
chroot läuft. Diese beinhaltet
Ressourcen, wie zum Beispiel sichtbare Abschnitte
des Dateisystems, verfügbare Benutzer- und
Gruppenkennungen, Netzwerkschnittstellen und weitere
IPC-Mechanismen und so weiter.&man.jail.8; (-Befehl)Das Systemadministrationswerkzeug, welches es erlaubt,
Prozesse innerhalb der Jail-Umgebung zu starten.Host (-Benutzer, -Prozess, -System)Das verwaltende System einer Jail-Umgebung. Das
Host-System hat Zugriff auf alle verfügbaren
Hardwareressourcen und kann sowohl innerhalb als auch
ausserhalb der Jail-Umgebung Prozesse steuern. Einer der
wichtigsten Unterschiede des Host-System einer Jails ist,
dass die Einschränkungen, welche für die
Superuser-Prozesse innerhalb eines Jails gelten, nicht
für die Prozesse des Host-Systems gelten.Gast (-Benutzer, -Prozess, -System)Ein Prozess, ein Benutzer oder eine andere Instanz,
deren Zugriff durch eine &os;-Jail eingeschränkt
ist.EinführungDa die Systemadministration oft eine schwierige Aufgabe ist,
wurden viele mächtige Werkzeuge entwickelt, die
Administratoren bei Installation, Konfiguration und Wartung ihrer
Systeme unterstützen sollen. Eine wichtige Aufgabe eines
Administrators ist es, Systeme so abzusichern, dass es im
regulären Betrieb zu keinen Sicherheitsverstößen
kommt.Eines der Werkzeuge, mit dem die Sicherheit eines &os;-Systems
verbessert werden kann, sind Jails. Jails wurden schon in
&os; 4.X von &a.phk; eingeführt, wurden jedoch mit
&os; 5.X stark verbessert, sodass sie inzwischen zu einem
mächtigen und flexiblen Subsystem herangereift sind. Trotzdem
geht die Entwicklung nach wie vor weiter. Wichtige Ziele sind
derzeit: Bessere Zweckmäßigkeit, Leistung,
Ausfallsicherheit und allgemeine Sicherheit.Was ist eine Jail?BSD-ähnliche Betriebssysteme besitzen seit den Zeiten
von 4.2BSD &man.chroot.2;. Das Werkzeug &man.chroot.2; kann dazu
benutzt werden, das root-Verzeichnis einer Reihe von Prozessen
zu ändern, um so eine seperate sichere Umgebung (abgeschnitten
vom Rest des Systems) zu schaffen. Prozesse, die in einer
chroot-Umgebung erstellt wurden, können nicht auf Dateien
oder Ressourcen zugreifen, die sich ausserhalb der Umgebung
befinden. Dadurch ist es einem kompromittierten Dienst nicht
möglich, das gesamte System zu kompromittieren.
&man.chroot.8; eignet sich für einfache Aufgaben, die keine
flexiblen, komplexen oder fortgeschrittenen Funktionen
benötigen. Obwohl seit der Entwicklung des chroot-Konzepts
zahlreiche Sicherheitslöcher geschlossen wurden, die es
einem Prozess erlauben konnten, aus einer Jail auszubrechen,
war seit langer Zeit klar, dass &man.chroot.2; nicht die ideale
Lösung ist, einen Dienst sicher zu machen.Dies ist einer der Hauptgründe, warum
Jails entwickelt wurden.Jails setzen auf dem traditionellen &man.chroot.2;-Konzept
auf und verbessern es auf unterschiedlichste Art und Weise. In
einer traditionellen &man.chroot.2;-Umgebung sind Prozesse auf
den Bereich des Dateisystems beschränkt, auf den sie
zugreifen können. Der Rest der Systemressourcen (wie zum
Beispiel eine Reihe von Systembenutzern, die laufenden Prozesse
oder das Netzwerk-Subsystem) teilen sich die chroot-Prozesse mit
dem Host-System. Jails dehnen dieses Modell nicht nur auf die
Virtualisierung des Zugriffs auf das Dateisystem, sondern auch
auf eine Reihe von Benutzern, das Netzwerk-Subsystem des
&os;-Kernels und weitere Bereiche aus. Eine ausführlichere
Übersicht der ausgefeilten Bedienelemente zur Konfiguration
einer Jail-Umgebung finden Sie im Abschnitt des Handbuchs.Eine Jail zeichnet sich durch folgende Merkmale aus:Einen Unterverzeichnisbaum, der die Jail enthält.
Einem Prozess, der innerhalb der Jail läft, ist es
nicht mehr möglich, aus diesem auszubrechen. Von
der traditionellen &man.chroot.2;-Umgebung bekannte
Sicherheitsprobleme existieren bei &os;-Jails nicht
mehr.Einen Hostname, der innerhalb der Jail verwendet wird.
Jails werden vor allem dazu verwendet, Netzwerkdienste
anzubieten, daher ist es für Systemadministratoren
von großem Nutzen, dass jede Jail einen beschreibenden
Hostname haben kann.Eine IP Adresse, die der Jail
zugewiesen wird und nicht verändert werden kann,
solange das Jail läft. Die IP-Adresse einer Jails
ist üblicherweise ein Adress-Alias auf eine
existierende Netzwerkschnittstelle. Dies ist jedoch
nicht zwingend erforderlich.Einen Befehl (genauer den Pfad einer ausführbaren
Datei) der innerhalb der Jail ausgefürht werden soll.
Dieser Pfad wird relativ zum root-Verzeichnis einer
Jail-Umgebung angegeben und kann sehr unterschiedlich
aussehen (je nachdem, wie die Jail-Umgebung konfiguriert
wurde).Unabhängig davon können Jails eine Reihe eigener
Benutzer und einen eigenen Benutzer root
haben. Selbstverständlich sind die Rechte des Benutzers
root nur auf die Jail-Umgebung
beschränkt. Aus der Sicht des Host-Systems ist der
Benutzer root der Jail-Umgebung kein
allmächtiger Benutzer, da der Benutzer
root der Jail-Umgebung nicht dazu
berechtigt ist, kritische Operationen am System ausserhalb der
angebundenen &man.jail.8;-Umgebung durchzuführen.
Weitere Informationen über die Einsatzmöglichkeiten
und Beschränkungen des Benutzers root
werden im Abschnitt des
Handbuchs besprochen.Einrichtung und Verwaltung von JailsEinige Administratoren unterscheiden zwei verschiedene
Jail-Arten: Komplette Jails, die ein echtes
&os; darstellen und Jails für einen bestimmten
Dienst, die nur einer bestimmten Anwendung
oder einem Dienst (der möglicherweise mit besonderen
Privilegien laufen soll) gewidmet sind. Dies ist aber nur
eine konzeptuelle Unterscheidung, die Einrichtung einer
Jail bleibt davon gänzlich unberührt.&prompt.root; setenv D /hier/ist/die/jail
&prompt.root; mkdir -p $D
&prompt.root; cd /usr/src
&prompt.root; make buildworld
&prompt.root; make installworld DESTDIR=$D
-&prompt.root; cd etc/Dieser
-Schritt ist seit &os; 6.0 nicht mehr notwendig.
&prompt.root; make distribution DESTDIR=$D
&prompt.root; mount -t devfs devfs $D/devDas Festlegen des Installationsorts für das Jail
eignet sich am besten als Startpunkt. Hier wird sich die
Jail innerhalb des Host-Dateisystems befinden. Eine gute
Möglichkeit wäre etwa /usr/jail/name_der_jail,
wobei name_der_jail den Hostname
darstellt, über den die Jail identifiziert werden
soll. Das Dateisystem unterhalb von /usr/ stellt normalerweise
aussreichend Platz für eine Jail zur Verfügung
(bedenken Sie, dass eine komplette Jail
ein Replikat einer jeden Datei der Standardinstallation des
&os;-Basissystems enthält.Wenn Sie bereits ihre Systemanwendungen mittels
make world oder make buildworld
neu erstellt haben, können Sie diesen Schritt überspringen
und die Systemanwendungen in die neue Jail installieren.Dieser Befehl wird den Verzeichnisbaum mit allen
notwendigen Binärdateien, Bibliotheken, Manualpages
usw. erstellen.Der distribution-Befehl
lässt make alle
benötigten Konfigurationsdateien installieren, es
werden also alle installierbaren Dateien aus
/usr/src/etc/ in
das Verzeichnis /etc
der Jail installiert (also nach $D/etc/).Das Einhängen des &man.devfs.8;-Dateisystems
innerhalb der Jail ist nicht unbedingt notwendig.
Allerdings benötigt fast jede Anwendung Zugriff auf
wenigstens ein Gerät. Es ist daher sehr wichtig,
den Zugriff auf Devices aus der Jail heraus zu
kontrollieren, da unsaubere Einstellungen es einem
Angreifer erlauben könnten, in das System einzudringen.
Die Kontrolle über &man.devfs.8; erfolgt durch die in
den Manualpages &man.devfs.8; und &man.devfs.conf.5;
beschriebenen Regeln.Ist eine Jail einmal erst erstellt, kann sie durch
&man.jail.8; gestartet werden. &man.jail.8; benötigt
zwingend mindestens vier Argumente, die im Abschnitt des Handbuchs beschrieben sind. Weitere
Argumente sind möglich, um beispielsweise die Jail mit den
Berechtigungen eines bestimmten Benutzers laufen zu lassen. Das
Argument
hängt vom Typ der Jail ab; für ein virtuelles
System ist /etc/rc eine gute
Wahl, da dies dem Startvorgang eines echten &os;-Systems
entspricht. Bei einer Service-Jail
hängt dieses von der Art des Dienstes ab, der in der Jail
laufen soll.Jails werden häufig mit dem Betriebssystem gestartet,
da der rc-Mechanismus von &os; dafür
eine einfach zu realisierende Möglichkeit bietet.Eine Liste der Jails, die mit dem Betriebssystem
gestartet werden sollen, wird in die Datei &man.rc.conf.5;
geschrieben:jail_enable="YES" # Set to NO to disable starting of any jails
jail_list="www" # Space separated list of names of jailsFür jede Jail in der jail_list
sollten in &man.rc.conf.5; einige Einstellungen
vorgenommen werden:jail_www_rootdir="/usr/jail/www" # jail's root directory
jail_www_hostname="www.example.org" # jail's hostname
jail_www_ip="192.168.0.10" # jail's IP address
jail_www_devfs_enable="YES" # mount devfs in the jail
jail_www_devfs_ruleset="www_ruleset" # devfs ruleset to apply to jailBeim Start einer in &man.rc.conf.5; konfigurierten Jail
wird das /etc/rc-Skript der Jail (das
"annimmt", dass es sich in einem kompletten System befindet)
aufgerufen. Für Service-Jails sollten die Startskripte
der Jail durch das Setzen der Option
jail_jailname_exec_start
entsprechend angepasst werden.Eine vollständige Liste der Optionen findet sich
in der Manualpage zu &man.rc.conf.5;.Das /etc/rc.d/jail-Skript kann
zum manuellen Starten und Stoppen der Jail genutzt werden,
wenn ein Eintrag in rc.conf angelegt
wurde:&prompt.root; /etc/rc.d/jail start www
&prompt.root; /etc/rc.d/jail stop wwwEs gibt momentan keinen sauberen Weg, eine &man.jail.8; zu
stoppen. Dies liegt daran, dass die Kommandos zum sauberen
Herunterfahren eines Systems innerhalb einer Jail nicht
ausgeführt werden können. Der beste Weg eine Jail zu
beenden ist es daher, innerhalb der Jail den folgenden Befehl
auszuführen (alternativ können Sie auch &man.jexec.8;
von außerhalb der Jail aufrufen):&prompt.root; sh /etc/rc.shutdownWeitere Informationen zu diesem Thema finden Sie in der
Manualpage &man.jail.8;.Feinabstimmung und AdministrationEs gibt verschiedene Optionen, die für jede Jail
gesetzt werden können und verschiedene Wege, ein
&os;-Host-System mit Jails zu kombinieren. Dieser Abschnitt
zeigt Ihnen:Einige zur Verfügung stehende Optionen zur
Abstimmung des Verhaltens und der Sicherheitseinstellungen,
die mit einer Jail-Installation ausgeführt werden
können.Einige der Anwendungsprogramme für das
Jail-Management, die über die &os; Ports-Sammlung
verfügbar sind und genutzt werden können, um
Jail-basierte Lösungen allumfassend umzusetzen.Systemwerkzeuge zur Feinabstimmung von Jails in &os;Die Feinabstimmung einer Jail-Konfiguration erfolgt zum
Großteil durch das Setzen von &man.sysctl.8;-Variablen.
Es gibt einen speziellen sysctl-Zweig, der als Basis für
die Organisation aller relevanten Optionen dient: Die
security.jail.*-Hierarchie der
&os;-Kerneloptionen. Die folgende Liste enthält alle
jail-bezogenen sysctls (inklusiver ihrer Voreinstellungen).
Die Namen sollten selbsterklärend sein, für
weitergehende Informationen lesen Sie bitte die Manualpages
&man.jail.8; und &man.sysctl.8;.security.jail.set_hostname_allowed:
1security.jail.socket_unixiproute_only:
1security.jail.sysvipc_allowed:
0security.jail.enforce_statfs:
2security.jail.allow_raw_sockets:
0security.jail.chflags_allowed:
0security.jail.jailed: 0Diese Variablen können vom Administrator des
Host-Systems genutzt werden, um
Beschränkungen hinzuzufügen oder aufzuheben, die dem
Benutzer root als Vorgabe auferlegt sind.
Beachten Sie, dass es einige Beschränkungen gibt, die nicht
verändert werden können. Der Benutzer
root darf innheralb der &man.jail.8; keine
Dateisysteme mounten und unmounten. Ebenso ist es ihm untersagt,
das &man.devfs.8;-Regelwerk zu laden oder zu entladen. Er darf
weder Firewallregeln setzen, noch administrative Aufgaben
erledigen, die Modifikationen am Kernel selbst erfordern
(wie bespielsweise das Setzen des Securelevels
des Kernel.Das &os;-Basissystem enthält einen Basissatz an
Werkzeugen, um Informationen über aktive Jails zu erlangen
und einer Jail administrative Befehle zuzuordnen. Die Befehle
&man.jls.8; und &man.jexec.8; sind Teil des &os;-Basissystems
und können für folgende Aufgaben verwendet werden:Das Anzeigen einer Liste der aktiven Jails und ihrer
zugehörigen Jail Identifier (JID),
ihrer IP-Addresse, ihres Hostnames und
ihres Pfades.Das Herstellen einer Verbindung mit einer laufenden
Jail, das Starten eines Befehls aus dem gastgebenen
System heraus oder das Ausführen einer administrativen
Aufgabe innerhalb der Jail selbst. Dies ist insbesondere
dann nützlich, wenn der Benutzer
root die Jail sauber herunterfahren
möchte. &man.jexec.8; kann auch zum Starten einer
Shell innerhalb der Jail genutzt werden, um adminstrative
Aufgaben durchzuführen:&prompt.root; jexec 1 tcshHigh-Level-Werkzeuge zur Jail-Administration in der &os;
Ports-SammlungUnter den zahlreichen Fremdwerkzeugen für die Administration
von Jails sind die sysutils/jailutils die
vollständigsten und brauchbarsten. Dabei handelt es sich um
eine Sammlung kleiner Anwendungen, die das &man.jail.8;-Management
vereinfachen. Weitere Informationen zu diesen Werkzeugen finden
Sie auf den entsprechenden Internetseiten.Anwendung von JailsDanielGerzoBeigetragen von Service-JailsDieser Abschnitt basiert auf einer von &a.simon; auf
präsentierten Idee und einem aktualisierten
Artikel von Ken Tom (locals@gmail.com). Er
beschreibt, wie ein &os;-System durch Benutzung der
&man.jail.8;-Funktion mit zusätzlichen
Sicherheitsebenen ausgestattet werden kann. Es wird dabei
angenommen, dass auf Ihrem &os;-System RELENG_6_0 oder neuer
installiert ist und dass Sie die Informationen aus den
vorangehenden Abschnitten gelesen und verstanden haben.DesignEines der Hauptprobleme bei Jails ist das Management
ihres Upgrade-Prozesses. Dieser neigt dazu, problematisch zu
sein, da jede Jail bei jedem Upgrade komplett neu gebaut
werden muss. Das stellt normalerweise kein Problem dar, wenn
es sich um eine einzelne Jail handelt, da der Upgrade-Prozess
recht einfach ist. Verwenden Sie aber eine größere
Anzahl von Jails, kann dieser Prozess sehr zeitaufwendig
werden.Diese Konfiguration erfordert fortgeschrittene
Kenntnisse im Umgang mit &os; sowie der Benutzung seiner
Funktionen. Sollten die unten vorgestellten Schritte zu
kompliziert wirken, wird empfohlen, sich einfachere Verfahren
wie sysutils/ezjail
anzusehen, da diese einfachere Methoden zur Administration
von Jails verwenden und daher nicht so anspruchsvoll sind
wie der hier beschriebene Aufbau.Diese Konfiguration basiert darauf, Jails so weit als
möglich gemeinsam zu verwalten. Dies passiert auf sichere
Art und Weise durch den Einsatz von &man.mount.nullfs.8;-Mounts
(read-only). Dadurch werden Aktualisierungen erleichtert und
das Verteilen von verschiedenen Diensten auf verschiedene
Jails wird attraktiver. Außerdem bietet dieses Verfahren
einen einfachen Weg, Jails hinzuzufügen, zu entfernen und
zu aktualisieren.Beispiele für Dienste sind in diesem
Zusammenhang: Ein HTTP-Server, ein
DNS-Server, ein
SMTP-Server und so weiter.Die Ziele des in diesem Abschnitt beschriebenen Aufbaus
sind:Das Erstellen einer einfachen und gut
verständlichen Struktur von Jails. Dies beinhaltet,
nicht für jede Jail ein
vollständiges installworld laufen lassen zu
müssen.Es einfach zu machen, neue Jails zu erstellen oder
alte zu entfernen.Es einfach zu machen, bestehende Jails zu
aktualisieren.Es einfach zu machen, einen angepassten &os;-Zweig zu
nutzen.Paranoid bezüglich Sicherheit zu sein und
Angriffsmöglickeiten weitgehend zu reduzieren.Soviel Platz und Inodes wie möglich
einzusparen.Wie bereits erwähnt, ist dieses Design stark darauf
angewiesen, dass eine read-only-Hauptvorlage in jede Jail
hinein gemountet wird (bekannt als
nullfs), und dass jede Jail
über wenigstens ein beschreibbares Gerät
verfügt. Das Gerät kann hierbei eine separate
physikalische Platte oder ein vnode unterstütztes
&man.md.4;-Gerät sein. Im folgenden Beispiel wird ein
nullfs-Mount genutzt, auf den
nur Lesezugriff erlaubt ist.Das Layout des Dateisystems wird in der folgenden Liste
beschrieben:Jede Jail wird unterhalb des /home/j-Verzeichnisses
gemountet./home/j/mroot
ist die Vorlage für jede Jail und die nur lesbare
Partition für alle Jails.Unterhalb von /home/j wird für jede
Jail ein leeres Verzeichnis angelegt.Jede Jail bekommt ein /s-Verzeichnis, das zum
read/write-Teilbereich des Systems verlinkt wird.Jede Jail bekommt ihr eigenes read/write-System,
das auf /home/j/skel basiert.Jeder Jailbereich (genauer der read/write-Teilbereich
jeder Jail) wird in /home/js erstellt.Es wird angenommen, dass die Jails sich unterhalb des
/home Verzeichnisses
befinden. Dieser Ort kann von Ihnen natürlich
geändert werden. Allerdings müssen die Pfade
in den folgenden Beispielen dann entsprechend angepasst
werden.Erstellen der VorlageDieser Abschnitt beschreibt die Schritte, die zum
Erstellen der Hauptvorlage (die den nur lesbaren Bereich
für alle weiteren Jails darstellt) notwendig sind.Es ist immer eine gute Idee, &os; auf den aktuellen
-RELEASE-Zweig zu aktualisieren. Lesen Sie das entsprechende
Kapitel des
Handbuchs für Informationen zu diesem Thema. Selbst wenn
Sie auf eine Aktualisierung des Betriebssystems verzichten,
müssen Sie dennoch ein buildworld durchführen, um
fortfahren zu können. Außerdem müssen Sie
das Paket sysutils/cpdup
installiert sein. In diesem Beispiel wird &man.portsnap.8;
verwendet, um die aktuelle &os; Ports-Sammlung herunterzuladen.
Der Abschnitt Portsnap des
Handbuchs beschreibt, wie Sie dieses Werkzeug effektiv
einsetzen.Zuerst erstellen wir eine Verzeichnissstruktur
für das read-only-Dateisystem, das die
&os;-Binärdateien für unsere Jails enthalten
wird. Anschließend wechseln wir in den
&os;-Quellcodebaum und installieren das
read-only-Dateisystem in die (Vorlage-)Jail.&prompt.root; mkdir /home/j /home/j/mroot
&prompt.root; cd /usr/src
&prompt.root; make installworld DESTDIR=/home/j/mrootAls nächstes bereiten wir die Ports-Sammlung
fü die Jails vor und kopieren den &os; Quellcodebaum
in die Jail, da dieser für
mergemaster benötigt wird:&prompt.root; cd /home/j/mroot
&prompt.root; mkdir usr/ports
&prompt.root; portsnap -p /home/j/mroot/usr/ports fetch extract
&prompt.root; cpdup /usr/src /home/j/mroot/usr/srcDanach wird die Struktur für den
read/write-Bereich des Systems erstellt:&prompt.root; mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
&prompt.root; mv etc /home/j/skel
&prompt.root; mv usr/local /home/j/skel/usr-local
&prompt.root; mv tmp /home/j/skel
&prompt.root; mv var /home/j/skel
&prompt.root; mv root /home/j/skelNutzen Sie mergemaster, um
fehlende Konfigurationsdateien zu installieren.
Anschließend werden die von
mergemaster erstellten
Extra-Verzeichnisse entfernt:&prompt.root; mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
&prompt.root; cd /home/j/skel
&prompt.root; rm -R bin boot lib libexec mnt proc rescue sbin sys usr devNun wird das read/write-Dateisystem mit dem
read-only-Dateisystem verlinkt. Bitte vergewissern Sie
sich, dass die symbolischen Links an den korrekten
s/ Positionen
erstellt werden. Echte Verzeichnisse oder an falschen
Positionen erstellte Verzeichnisse lassen die Installation
fehlschlagen.&prompt.root; cd /home/j/mroot
&prompt.root; mkdir s
&prompt.root; ln -s s/etc etc
&prompt.root; ln -s s/home home
&prompt.root; ln -s s/root root
&prompt.root; ln -s ../s/usr-local usr/local
&prompt.root; ln -s ../s/usr-X11R6 usr/X11R6
&prompt.root; ln -s ../../s/distfiles usr/ports/distfiles
&prompt.root; ln -s s/tmp tmp
&prompt.root; ln -s s/var varZuletzt erstellen Sie eine allgemeine
/home/j/skel/etc/make.conf mit
folgendem Inhalt:WRKDIRPREFIX?= /s/portbuildEin gesetztes WRKDIRPREFIX
erlaubt es, die &os;-Ports innerhalb jeder Jail
zu kompilieren. Das Ports-Verzeichnis ist Teil des
read-only System. Der angepasste Pfad des
WRKDIRPREFIX macht es möglich,
innerhalb des read/write-Bereichs der Jail Ports zu
bauen.Jails erstellenDa nun eine komplette &os;-Jailvorlage vorliegt, sind wir
nun in der Lage, Jails einrichten und in
/etc/rc.conf zu konfigurieren. Dieses
Beispiel zeigt das Erstellen von drei Jails:
NS, MAIL und
WWW.Fügen Sie die folgenden Zeilen in
/etc/fstab ein, damit die
read-only-Vorlage und der read/write-Bereich für
alle Jails verfügbar sind:/home/j/mroot /home/j/ns nullfs ro 0 0
/home/j/mroot /home/j/mail nullfs ro 0 0
/home/j/mroot /home/j/www nullfs ro 0 0
/home/js/ns /home/j/ns/s nullfs rw 0 0
/home/js/mail /home/j/mail/s nullfs rw 0 0
/home/js/www /home/j/www/s nullfs rw 0 0Mit der Pass-Nummer 0 markierte Partitionen werden
beim Booten des Systems nicht von &man.fsck.8;
geprüft, mit 0 als Dump-Nummer markierte Partitonen
werden von &man.dump.8; nicht gesichert. Wir wollen
nicht, dass fsck unsere
nullfs-Mounts prüft oder
dass dump die nur lesbaren
nullfs-Mounts unserer Jails sichert. Deshalb werden
diese Bereiche in den letzten beiden Spalten der
obenstehenden fstab mit
0 0 markiert.Konfigurieren Sie die Jails in
/etc/rc.conf:jail_enable="YES"
jail_set_hostname_allow="NO"
jail_list="ns mail www"
jail_ns_hostname="ns.example.org"
jail_ns_ip="192.168.3.17"
jail_ns_rootdir="/usr/home/j/ns"
jail_ns_devfs_enable="YES"
jail_mail_hostname="mail.example.org"
jail_mail_ip="192.168.3.18"
jail_mail_rootdir="/usr/home/j/mail"
jail_mail_devfs_enable="YES"
jail_www_hostname="www.example.org"
jail_www_ip="62.123.43.14"
jail_www_rootdir="/usr/home/j/www"
jail_www_devfs_enable="YES"Der Grund dafür, dass die Variablen
jail_name_rootdir
nach /usr/home
statt nach /home
zeigen, liegt darin, dass der physikalische Pfad des
/home-Verzeichnisses unter
&os; /usr/home
lautet. Die Variable
jail_name_rootdir
darf im Pfad aber keinen symbolischen
Link enthalten, weil das Jail ansonsten
nicht gestartet werden kann. Verwenden Sie
&man.realpath.1;, um den korrekten Wert für diese
Variable zu bestimmen. Weitere Informationen finden
Sie im Security Advisory &os;-SA-07:01.jail.Erstellen Sie die notwendigen Mountpunkte für
die nur lesbaren Bereiche jeder Jail:&prompt.root; mkdir /home/j/ns /home/j/mail /home/j/wwwInstallieren Sie die read/write-Vorlage in jede
Jail. Benutzen Sie hierfür sysutils/cpdup, welches es
erleichtert, eine korrekte Kopie jedes Verzeichnisses
zu erstellen:&prompt.root; mkdir /home/js
&prompt.root; cpdup /home/j/skel /home/js/ns
&prompt.root; cpdup /home/j/skel /home/js/mail
&prompt.root; cpdup /home/j/skel /home/js/wwwAn dieser Stelle werden die Jails erstellt und
fü den Betrieb vorbereitet. Zuerst mounten Sie die
notwendigen Dateisysteme für jede Jail und starten
diese dann mit dem Skript
/etc/rc.d/jail:&prompt.root; mount -a
&prompt.root; /etc/rc.d/jail startDie Jails sollten nun laufen. Um zu prüfen, ob sie
korrekt gestartet wurden, verwenden Sie &man.jls.8;. Nach
dem Aufruf dieses Befehls sollten Sie eine Ausgabe
ähnlich der folgenden erhalten:&prompt.root; jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/j/ns
2 192.168.3.18 mail.example.org /home/j/mail
1 62.123.43.14 www.example.org /home/j/wwwAn diesem Punkt sollte es möglich sein, sich an
jeder Jail anzumelden, Benutzer anzulegen und Dienste zu
konfigurieren. Die Spalte JID gibt die
Jail-Identifikationsnummer jeder laufenden Jail an. Nutzen Sie
den folgenden Befehl, um administrative Aufgaben in der Jail
mit der JID 3 durchzuführen:&prompt.root; jexec 3 tcshJails aktualisierenMit der Zeit wird es notwendig sein, das System auf
eine neuere Version von &os; zu aktualisieren. Zum einen aus
Sicherheitsgründen, zum anderen, um neu eingeführte
Funktionen nutzen zu können, die für die bestehenden
Jails sinnvoll sind. Das Design dieses Aufbaus bietet einen
einfachen Weg, bestehende Jails zu aktualisieren. Zudem
reduziert es die Downtime, da die Jails erst im allerletzten
Schritt gestoppt werden müssen. Außerdem bietet
es die Möglichkeit, zu älteren Versionen
zurückzukehren, falls irgendwelche Probleme auftreten.Im ersten Schritt wird das Host-System aktualisiert.
Anschließend wird eine temporäre neue
read-only Vorlage /home/j/mroot2 erstellt.&prompt.root; mkdir /home/j/mroot2
&prompt.root; cd /usr/src
&prompt.root; make installworld DESTDIR=/home/j/mroot2
&prompt.root; cd /home/j/mroot2
&prompt.root; cpdup /usr/src usr/src
&prompt.root; mkdir sDer installworld-Durchlauf
erzeugt einige unnötige Verzeichnisse, die nun entfernt
werden sollten:&prompt.root; chflags -R 0 var
&prompt.root; rm -R etc var root usr/local tmpErzeugen Sie neue symbolische Links für das
Hauptdateisystem:&prompt.root; ln -s s/etc etc
&prompt.root; ln -s s/root root
&prompt.root; ln -s s/home home
&prompt.root; ln -s ../s/usr-local usr/local
&prompt.root; ln -s ../s/usr-X11R6 usr/X11R6
&prompt.root; ln -s s/tmp tmp
&prompt.root; ln -s s/var varNun ist es an der Zeit, die Jails zu stoppen:&prompt.root; /etc/rc.d/jail stopUnmounten des originalen Dateisystems:&prompt.root; umount /home/j/ns/s
&prompt.root; umount /home/j/ns
&prompt.root; umount /home/j/mail/s
&prompt.root; umount /home/j/mail
&prompt.root; umount /home/j/www/s
&prompt.root; umount /home/j/wwwDie read/write-Systeme sind an das read-only
System angehängt (/s), das daher zuerst
ausgehängt werden muss.Verschieben Sie das alte read-only-Dateisystem und
ersetzen Sie es durch das neue Dateisystem. Das alte
Dateisystem kann so als Backup dienen, falls etwas schief
geht. Die Namensgebung entspricht hier derjenigen bei der
Erstellung eines neuen read-only-Dateisystems. Verschieben
Sie die originale &os; Ports-Sammlung in das neue
Dateisystem, um Platz und Inodes zu sparen:&prompt.root; cd /home/j
&prompt.root; mv mroot mroot.20060601
&prompt.root; mv mroot2 mroot
&prompt.root; mv mroot.20060601/usr/ports mroot/usrNun ist die neue read-only-Vorlage fertig. Sie
müssen daher nur noch die Dateisysteme erneut mounten
und die Jails starten:&prompt.root; mount -a
&prompt.root; /etc/rc.d/jail startNutzen Sie &man.jls.8; um zu prüfen, ob die Jails
korrekt gestartet wurden. Vergessen Sie nicht, innerhalb jeder
Jail mergemaster laufen zu lassen. Die
Konfigurationsdateien müssen (ebenso wie die
rc.d-Skripten) aktualisiert werden.
diff --git a/de_DE.ISO8859-1/books/handbook/txtfiles.ent b/de_DE.ISO8859-1/books/handbook/txtfiles.ent
index c2c8e5e305..29d036cb23 100644
--- a/de_DE.ISO8859-1/books/handbook/txtfiles.ent
+++ b/de_DE.ISO8859-1/books/handbook/txtfiles.ent
@@ -1,17 +1,17 @@
diff --git a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml
index 001863f9bd..789d2934cc 100644
--- a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml
@@ -1,1183 +1,1183 @@
MurrayStokelyBeigetragen von OliverPeterÜbersetzt von VirtualisierungÜbersichtVirtualisierungssoftware erlaubt es, mehrere Betriebssysteme
gleichzeitig auf dem selben Computer laufen zu lassen. Derartige
Softwaresysteme für PCs setzen in der Regel ein
Host-Betriebssystem voraus, auf dem die
Virtualisierungssoftware läuft und unterstützen eine
nahezu beliebige Anzahl von Gast-Betriebssystemen.Nachdem Sie dieses Kapitel gelesen haben,Kennen Sie den Unterscheid zwischen einem
Host-Betriebssystem und einem Gast-Betriebssystem.
- Können Sie FreeBSD auf einem &intel;-basierenden
+ Können Sie &os; auf einem &intel;-basierenden
&apple; &macintosh; installieren.
- Wissen Sie, wie man FreeBSD unter Linux mit
+ Wissen Sie, wie man &os; unter Linux mit
&xen; installiert.
- Können Sie FreeBSD unter µsoft.windows;
+ Können Sie &os; unter µsoft.windows;
und Virtual PC installieren.
- Wissen Sie, wie man ein virtualisiertes FreeBSD-System
+ Wissen Sie, wie man ein virtualisiertes &os;-System
für optimale Leistung konfiguriert.Bevor Sie dieses Kapitel lesen, sollten Sie
- Die Grundlagen von &unix; und FreeBSD verstehen
+ Die Grundlagen von &unix; und &os; verstehen
().
- FreeBSD installieren können
+ &os; installieren können
().Wissen, wie man seine Netzwerkverbindung
konfiguriert ().Software Dritter installieren können
().
- FreeBSD als Gast-Betriebssystem
+ &os; als Gast-BetriebssystemParallels unter MacOS XParallels Desktop für &mac;
ist ein kommerzielles Softwareprodukt, welches für
&intel;-basierende &apple; &mac;-Computer mit
&macos; X 10.4.6
- oder höher verfügbar ist. FreeBSD wird von diesem
+ oder höher verfügbar ist. &os; wird von diesem
Softwarepaket als Gast-Betriebssystem vollständig
unterstützt. Nach der Installation von
Parallels auf &macos; X
konfigurieren Sie als erstes eine virtuelle Maschine,
in der Sie danach das gewünschte Gast-Betriebssystem (in
- unserem Fall FreeBSD) installieren.
+ unserem Fall &os;) installieren.
- Installation von FreeBSD unter
+ Installation von &os; unter
Parallels/&macos; X
- Der erste Schritt bei der Installation von FreeBSD unter
+ Der erste Schritt bei der Installation von &os; unter
Parallels/&macos; X ist es,
eine virtuelle Maschine zu konfigurieren, in der Sie
- FreeBSD installieren können. Dazu wählen Sie bei
+ &os; installieren können. Dazu wählen Sie bei
der Frage nach dem Guest OS Type
- FreeBSD aus:
+ &os; aus:Danach legen Sie geeignete Größen für
Festplatten- und Arbeitsspeicher für die zu erstellende
- FreeBSD-Instanz fest. 4 GB Plattenplatz sowie
+ &os;-Instanz fest. 4 GB Plattenplatz sowie
512 MB RAM sind in der Regel für die Arbeit unter
Parallels ausreichend:Wählen Sie den gewünschten Netzwerktyp
aus und konfigurieren Sie Ihre Netzwerkverbindung:Speichern Sie Ihre Eingaben, um die Konfiguration
abzuschließen:Nachdem Sie die virtuelle Maschine erstellt haben,
- installieren Sie im nächsten Schritt FreeBSD in dieser
+ installieren Sie im nächsten Schritt &os; in dieser
virtuellen Maschine. Dazu verwenden Sie am besten eine
- offizielle FreeBSD-CDROM oder Sie laden von einem offiziellen
+ offizielle &os;-CDROM oder Sie laden von einem offiziellen
FTP-Server ein ISO-Abbild auf Ihren &mac; herunter. Danach
klicken Sie auf das Laufwerksymbol in der rechten unteren
Ecke des Parallels-Fensters, um
ihr virtuelles Laufwerk mit dem ISO-Abbild oder mit dem
physikalischen CD-ROM-Laufwerk ihres Computers zu
verknüpfen.Nachdem Sie diese Verknüpfung hergestellt haben,
- starten sie die virtuelle FreeBSD-Maschine neu, indem Sie
+ starten sie die virtuelle &os;-Maschine neu, indem Sie
wie gewohnt auf das Symbol "Neustarten" klicken.
Parallels startet nun ein
Spezial-BIOS, das zuerst prüft, ob Sie eine CD-ROM
eingelegt haben (genau so, wie es auch ein echtes BIOS
machen würde).In unserem Fall findet das BIOS ein
- FreeBSD-Installationsmedium und beginnt daher eine normale
+ &os;-Installationsmedium und beginnt daher eine normale
Installation mit sysinstall
(wie in des Handbuchs
beschreiben).Nachdem die Installation abgeschlossen ist, können
Sie die virtuelle Maschine starten.
- FreeBSD für den Einsatz unter
+ &os; für den Einsatz unter
Parallels/&macos; X optimieren
- Nachdem Sie FreeBSD erfolgreich unter &macos; X mit
+ Nachdem Sie &os; erfolgreich unter &macos; X mit
Parallels installiert haben, sollten
- Sie ihr virtuelles FreeBSD-System für virtualisierte
+ Sie ihr virtuelles &os;-System für virtualisierte
Operationen optimieren:Setzen der Bootloader-VariablenDie wichtigste Änderung ist es, die Variable
zu verkleinern, um so die
CPU-Auslastung in der
Parallels-Umgebung zu
verringern.kern.hz=100Ohne diese Einstellung kann ein unbeschäftigtes
- FreeBSD unter Parallels trotzdem
+ &os; unter Parallels trotzdem
rund 15 Prozent der CPU-Leistung eines Single Prozessor
&imac;'s verbrauchen. Nach dieser Änderung reduziert
sich dieser Wert auf etwa 5 Prozent.Erstellen einer neuen KernelkonfigurationsdateiSie können alle SCSI-, FireWire- und
USB-Laufwerks-Treiber entfernen.
Parallels stellt einen
virtuellen Netzwerkadapter bereit, der den
&man.ed.4;-Treiber verwendet. Daher können alle
Netzwerkgeräte bis auf &man.ed.4; und
&man.miibus.4; aus dem Kernel entfernt werden.Netzwerkbetrieb einrichtenDie einfachste Netzwerkkonfiguration ist der Einsatz
von DHCP, um Ihre virtuelle Maschine mit dem gleichen
lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu
verbinden. Dazu fügen Sie die Zeile
ifconfig_ed0="DHCP" in die Datei
/etc/rc.conf ein. Weitere
Informationen zur Konfiguration des Netzwerks unter
- FreeBSD finden Sie im des Handbuchs.FukangChen (Loader)Beigetragen von
- FreeBSD mit &xen; unter Linux einsetzen
+ &os; mit &xen; unter Linux einsetzenDer &xen; Hypervisor ist ein
als Open Source verfügbares Para-Virtualisierungsprodukt,
das von der kommerziellen Firma XenSource unterstützt wird.
Gast-Betriebssysteme werden dabei als domU-Domains,
Host-Betriebssysteme hingegen als dom0 bezeichnet. Um eine
- virtuelle FreeBSD-Instanz unter Linux auszuführen,
+ virtuelle &os;-Instanz unter Linux auszuführen,
müssen Sie zuerst &xen;
für Linux dom0 installieren. Als Host-Betriebssystem
wird im folgenden Beispiel die Distribution Slackware
verwendet.&xen; 3 unter Linux dom0&xen; 3.0 von XenSource herunterladenLaden Sie die Datei xen-3.0.4_1-src.tgz
von
herunter.Den Tarball entpacken&prompt.root; cd xen-3.0.4_1-src
&prompt.root; KERNELS="linux-2.6-xen0 linux-2.6-xenU" make world
&prompt.root; make installDen dom0-Kernel neu kompilieren:&prompt.root; cd xen-3.0.4_1-src/linux-2.6.16.33-xen0
&prompt.root; make menuconfig
&prompt.root; make
&prompt.root; make installÄltere Versionen von
&xen; müssen
gegebenenfalls mit
make ARCH=xen menuconfig näher
spezifiziert werden.Einen Menü-Eintrag in die menu.lst von Grub
aufnehmenEditieren Sie /boot/grub/menu.lst
und fügen Sie die folgenden Zeilen hinzu:title Xen-3.0.4
root (hd0,0)
kernel /boot/xen-3.0.4-1.gz dom0_mem=262144
module /boot/vmlinuz-2.6.16.33-xen0 root=/dev/hda1 roStarten Sie Ihren Computer neu, um &xen; zu
aktivierenAnschließend editieren Sie
/etc/xen/xend-config.sxp und
fügen die folgenden Zeilen hinzu:(network-script 'network-bridge netdev=eth0')Danach kann &xen;
gestartet werden:&prompt.root; /etc/init.d/xend start
&prompt.root; /etc/init.d/xendomains startDamit ist dom0 gestartet:&prompt.root; xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 256 1 r----- 54452.9
- FreeBSD 7-CURRENT als domU verwenden
+ &os; 7-CURRENT als domU verwenden
- Laden Sie den FreeBSD-dumU-Kernel für
+ Laden Sie den &os;-domU-Kernel für
&xen; 3.0 sowie
das Festplattenabbild von http://www.fsmware.com/
herunter:kernel-currentmdroot-7.0.bz2xmexample1.bsdKopieren Sie xmexample1.bsd
nach /etc/xen/ und passen Sie
die Einträge für Kernel und Festplattenabbild an
Ihre Konfiguration an. Ihre Konfiguration sollte
ähnlich dem folgenden Beispiel aussehen:kernel = "/opt/kernel-current"
memory = 256
name = "freebsd"
vif = [ '' ]
disk = [ 'file:/opt/mdroot-7.0,hda1,w' ]
#on_crash = 'preserve'
extra = "boot_verbose"
extra += ",boot_single"
extra += ",kern.hz=100"
extra += ",vfs.root.mountfrom=ufs:/dev/xbd769a"Die Datei mdroot-7.0.bz2 sollte
unkomprimiert sein.Als Nächstes muss der __xen_guest-Abschnitt in
kernel-current verändert und das
von &xen; 3.0.3 benötigte
VIRT_BASE hinzugefügt werden:&prompt.root; objcopy kernel-current -R __xen_guest
&prompt.root; perl -e 'print "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xC0000000\x00"' > tmp
&prompt.root; objcopy kernel-current --add-section __xen_guest=tmp&prompt.root; objdump -j __xen_guest -s kernel-current
kernel-current: file format elf32-i386
Contents of section __xen_guest:
0000 4c4f4144 45523d67 656e6572 69632c47 LOADER=generic,G
0010 55455354 5f4f533d 66726565 6273642c UEST_OS=freebsd,
0020 47554553 545f5645 523d372e 302c5845 GUEST_VER=7.0,XE
0030 4e5f5645 523d7865 6e2d332e 302c4253 N_VER=xen-3.0,BS
0040 445f5359 4d544142 2c564952 545f4241 D_SYMTAB,VIRT_BA
0050 53453d30 78433030 30303030 3000 SE=0xC0000000. Nun kann die domU erstellt und gestartet werden:&prompt.root; xm create /etc/xen/xmexample1.bsd -c
Using config file "/etc/xen/xmexample1.bsd".
Started domain freebsd
WARNING: loader(8) metadata is missing!
Copyright (c) 1992-2006 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006
kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF
WARNING: DIAGNOSTIC option enabled, expect reduced performance.
Xen reported: 1796.927 MHz processor.
Timecounter "ixen" frequency 1796927000 Hz quality 0
CPU: Intel(R) Pentium(R) 4 CPU 1.80GHz (1796.93-MHz 686-class CPU)
Origin = "GenuineIntel" Id = 0xf29 Stepping = 9
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,
DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
Features2=0x4400<CNTX-ID,<b14>>
real memory = 265244672 (252 MB)
avail memory = 255963136 (244 MB)
xc0: <Xen Console> on motherboard
cpu0 on motherboard
Timecounters tick every 10.000 msec
[XEN] Initialising virtual ethernet driver.
xn0: Ethernet address: 00:16:3e:6b:de:3a
[XEN]
Trying to mount root from ufs:/dev/xbd769a
WARNING: / was not properly dismounted
Loading configuration files.
No suitable dump device was found.
Entropy harvesting: interrupts ethernet point_to_point kickstart.
Starting file system checks:
/dev/xbd769a: 18859 files, 140370 used, 113473 free (10769 frags, 12838 blocks, 4.2% fragmentation)
Setting hostname: demo.freebsd.org.
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
Additional routing options:.
Mounting NFS file systems:.
Starting syslogd.
/etc/rc: WARNING: Dump device does not exist. Savecore not run.
ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
Starting usbd.
usb: Kernel module not available: No such file or directory
Starting local daemons:.
Updating motd.
Starting sshd.
Initial i386 initialization:.
Additional ABI support: linux.
Starting cron.
Local package initialization:.
Additional TCP options:.
Starting background file system checks in 60 seconds.
Sun Apr 1 02:11:43 UTC 2007
FreeBSD/i386 (demo.freebsd.org) (xc0)
login: Die domU sollte nun den
&os; 7.0-CURRENT-Kernel ausführen:&prompt.root; uname -a
FreeBSD demo.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006
kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF i386Das Netzwerk kann nun unter der domU konfiguriert werden.
Die &os;-domU wird ein spezielles Gerät namens
xn0 verwenden:&prompt.root; ifconfig xn0 10.10.10.200 netmask 255.0.0.0
&prompt.root; ifconfig
xn0: flags=843<UP,BROADCAST,RUNNING,SIMPLEX> mtu 1500
inet 10.10.10.200 netmask 0xff000000 broadcast 10.255.255.255
ether 00:16:3e:6b:de:3a
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000 Unter der Slackware-dom0 sollten einige
&xen;-spezifische
Netzwerkgeräte erscheinen:&prompt.root; ifconfig
eth0 Link encap:Ethernet HWaddr 00:07:E9:A0:02:C2
inet addr:10.10.10.130 Bcast:0.0.0.0 Mask:255.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:815 errors:0 dropped:0 overruns:0 frame:0
TX packets:1400 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:204857 (200.0 KiB) TX bytes:129915 (126.8 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:99 errors:0 dropped:0 overruns:0 frame:0
TX packets:99 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9744 (9.5 KiB) TX bytes:9744 (9.5 KiB)
peth0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:1853349 errors:0 dropped:0 overruns:0 frame:0
TX packets:952923 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2432115831 (2.2 GiB) TX bytes:86528526 (82.5 MiB)
Base address:0xc000 Memory:ef020000-ef040000
vif0.1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:1400 errors:0 dropped:0 overruns:0 frame:0
TX packets:815 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:129915 (126.8 KiB) TX bytes:204857 (200.0 KiB)
vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:157 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:140 (140.0 b) TX bytes:158 (158.0 b)
xenbr1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:112 (112.0 b) TX bytes:0 (0.0 b)&prompt.root; brctl show
bridge name bridge id STP enabled interfaces
xenbr1 8000.feffffffffff no vif0.1
peth0
vif1.0JohannKoisÜbersetzt von Virtual PC unter &windows;Virtual PC für &windows; wird
von µsoft; kostenlos zum Download angeboten. Die
Systemanforderungen für dieses Programm finden Sie
hier. Nachdem Sie Virtual PC
unter µsoft.windows; installiert haben, müssen Sie eine
virtuelle Maschine konfigurieren und das gewünschte
Betriebssystem installieren.
- FreeBSD in Virtual PC/µsoft.windows; installieren
+ &os; in Virtual PC/µsoft.windows; installieren
- Der erste Schritt zur Installation von FreeBSD in
+ Der erste Schritt zur Installation von &os; in
µsoft.windows;/Virtual PC ist
es, eine neue virtuelle Maschine zu erstellen, in die Sie
- FreeBSD installieren können. Dazu wählen Sie die
+ &os; installieren können. Dazu wählen Sie die
Option Create a virtual machine,
wenn Sie danach gefragt werden:Bei der Frage nach dem
Operating system wählen Sie
Other:Danach müssen Sie den von Ihnen gewüschten
Plattenplatz sowie die Größe des Hauptspeichers
angeben. 4 GB Plattenplatz sowie 512 MB RAM sollten
- für die Installation von FreeBSD in
+ für die Installation von &os; in
Virtual PC ausreichend sein:Speichern Sie Ihre Eingaben und beenden Sie die
Konfiguration:
- Wählen Sie nun die für FreeBSD erstellte
+ Wählen Sie nun die für &os; erstellte
virtuelle Maschine aus und klicken Sie auf
Settings, um das Netzwerk zu
konfigurieren:
- Nun können Sie FreeBSD installieren. Dazu
- verwenden Sie am besten eine offizielle FreeBSD-CD-ROM
+ Nun können Sie &os; installieren. Dazu
+ verwenden Sie am besten eine offizielle &os;-CD-ROM
oder ein ISO-Image, das Sie von einem offiziellen
- FreeBSD-FTP-Server heruntergeladen haben. Wenn Sie ein
+ &os;-FTP-Server heruntergeladen haben. Wenn Sie ein
ISO-Image auf Ihrer Festplatte gespeichert haben, oder
- eine FreeBSD-CD-ROM in Ihr CD-Laufwerk eingelegt haben,
+ eine &os;-CD-ROM in Ihr CD-Laufwerk eingelegt haben,
doppelklicken Sie auf die virtuelle Maschine, die Sie
- für FreeBSD angelegt haben. Danach klicken Sie
+ für &os; angelegt haben. Danach klicken Sie
auf CD und wählen die Option
Capture ISO Image... im
Virtual PC-Fenster. Danach
können Sie im folgenden Fenster das CD-Laufwerk
mit Ihrem physikalischen CD-Laufwerk oder mit dem
ISO-Image verknüpfen.Danach starten Sie die virtuelle Maschine neu, indem
Sie zuerst auf Action und danach auf
Reset klicken.
Virtual PC startet Ihre
virtuelle Maschine nun neu und prüft zuerst, ob
die virtuelle Maschine über ein CD-Laufwerk
verfügt.Da dies hier der Fall ist, beginnt nun eine normale,
auf sysinstall basierende
Installation, die in beschrieben
- wird. Sie können FreeBSD nun installieren.
+ wird. Sie können &os; nun installieren.
Verzichten Sie an dieser Stelle aber unbedingt auf die
X11-Konfiguration.Nachdem die Installation abgeschlossen ist, entfernen
Sie die CD-ROM aus dem Laufwerk (oder lösen die
Verknüpfung zum ISO-Image). Danach starten Sie die
- virtuelle Maschine neu, um FreeBSD zu starten.
+ virtuelle Maschine neu, um &os; zu starten.
- FreeBSD in µsoft.windows;/Virtual PC konfigurieren
+ &os; in µsoft.windows;/Virtual PC konfigurieren
- Nachdem Sie FreeBSD auf Ihrem µsoft.windows;-System
+ Nachdem Sie &os; auf Ihrem µsoft.windows;-System
erfolgreich unter Virtual PC
- installiert haben, sollten Sie ihr virtuelles FreeBSD noch
+ installiert haben, sollten Sie ihr virtuelles &os; noch
anpassen, um eine optimale Funktion zu
gewährleisten.Setzen der Bootloader-VariablenDie wichtigste Änderung ist es, die Variable
zu verkleinern, um so die
CPU-Auslastung in der
Virtual PC-Umgebung zu
verringern. Dazu fügen Sie die folgende Zeile
in die Datei /boot/loader.conf
ein:kern.hz=100Ohne diese Einstellung kann ein unbeschäftigtes
- FreeBSD unter Virutal PC
+ &os; unter Virutal PC
trotzdem rund 40 Prozent der CPU-Leistung eines
Ein-Prozessor-Systems verbrauchen. Nach dieser
Änderung reduziert sich dieser Wert auf etwa
5 Prozent.Erstellen einer neuen KernelkonfigurationsdateiSie können alle SCSI-, FireWire- und
USB-Laufwerks-Treiber entfernen.
Virtual PC stellt einen
virtuellen Netzwerkadapter bereit, der den
&man.de.4;-Treiber verwendet. Daher können alle
Netzwerkgeräte bis auf &man.de.4; und
&man.miibus.4; aus dem Kernel entfernt werden.Das Netzwerk einrichtenDie einfachste Netzwerkkonfiguration ist der Einsatz
von DHCP, um Ihre virtuelle Maschine mit dem gleichen
lokalen Netzwerk, in dem sich Ihr
Host-µsoft.windows; befindet, zu verbinden. Dazu
fügen Sie die Zeile
ifconfig_de0="DHCP" in die Datei
/etc/rc.conf ein. Weitere
Informationen zur Konfiguration des Netzwerks unter
- FreeBSD finden Sie im des Handbuchs.JohannKoisÜbersetzt von VMware unter MacOSVMware Fusion für &mac;
ist ein kommerzielles Programm, das für
&intel; basierte &apple; &mac;-Computer mit
- &macos; 10.4.9 oder neuer erhältlich ist. FreeBSD wird
+ &macos; 10.4.9 oder neuer erhältlich ist. &os; wird
von diesem Produkt vollständig als Gast-Betriebssystem
unterstützt. Nachdem Sie
VMware Fusion unter &macos; X
installiert haben, können Sie das gewünschte
- Gastbetriebssystem (in unserem Fall FreeBSD) installieren.
+ Gastbetriebssystem (in unserem Fall &os;) installieren.
- FreeBSD in VMware/&macos; X installieren
+ &os; in VMware/&macos; X installierenZuerst müssen Sie VMware Fusion starten, um eine
virtuelle Maschine zu erstellen. Dazu wählen Sie die
Option "New":Dadurch wird ein Assistent gestartet, der Ihnen bei der
Erzeugung einer neuen virtuellen Maschine behilflich ist.
Clicken Sie auf "Continue", um den Prozess zu starten:Wählen Sie Other als das
Operating System, danach
- FreeBSD oder
- FreeBSD 64-bit, je nach dem,
+ &os; oder
+ &os; 64-bit, je nach dem,
welche Version Sie installieren wollen, wenn Sie nach
der zu installierenden Version
gefragt werden:Vergeben Sie einen Namen für virtuelle Maschine an
und legen Sie den Speicherort fest:Legen Sie die Größe Ihrer virtuellen Festplatte
fest:Nachdem Sie auf "Finish" geklickt haben, wird die virtuelle
Maschine gestartet:Nun können Sie &os; wie gewohnt installieren (lesen Sie
dazu auch des Handbuchs):Nachdem die Installation abgeschlossen ist, können Sie
noch verschiedene Parameter der virtuellen Maschine, etwa den
Speicherverbrauch, konfigurieren:Die Hardware der virtuellen Maschine kann nicht
geändert werden, solange die virtuelle Maschine
läuft.Die Anzahl der CPUs der virtuellen Maschine:Den Status des CD-Laufwerks. Sie können das
CD-Laufwerk von der virtuellen Maschine lösen, wenn
Sie es nicht benötigen.Zuletzt sollten Sie noch festlegen, wie sich die
virtuelle Maschine mit dem Netzwerk verbinden soll. Sollen
neben dem Gastsystem auch andere Rechner auf Ihre virtuelle
Maschine zugreifen können, müssen Sie die Option
Connect directly to the physical network
(Bridged) wählen. Ist dies nicht der
Fall, sollten Sie die Option Share the
host's internet connection (NAT) wählen.
In dieser Einstellung kann die virtuelle Maschine zwar auf
auf das Internet zugreifen, andere Rechner dürfen
aber nicht auf die virtuelle Maschine zugreifen.Nachdem Sie die Konfiguration abgeschlossen haben,
- können Sie FreeBSD starten.
+ können Sie &os; starten.
- FreeBSD unter &macos; X/VMware konfigurieren
+ &os; unter &macos; X/VMware konfigurierenNachdem Sie FreeeBSD erfolgreich unter
VMware für &macos; X
- installiert haben, sollten Sie ihr virtuelles FreeBSD noch
+ installiert haben, sollten Sie ihr virtuelles &os; noch
anpassen, um eine optimale Funktion zu gewährleisten.Die wichtigste Änderung ist es, die Variable
zu verkleinern, um so die
CPU-Auslastung in der
VMware-Umgebung zu
verringern.kern.hz=100Ohne diese Einstellung kann ein unbeschäftigtes
- FreeBSD unter VMware trotzdem
+ &os; unter VMware trotzdem
rund 15 Prozent der CPU-Leistung eines Single Prozessor
&imac;'s verbrauchen. Nach dieser Änderung reduziert
sich dieser Wert auf etwa 5 Prozent.Erstellen einer neuen KernelkonfigurationsdateiSie können alle FireWire- und
USB-Laufwerks-Treiber entfernen.
VMware stellt einen
virtuellen Netzwerkadapter bereit, der den
&man.em.4;-Treiber verwendet. Daher können alle
Netzwerkgeräte bis auf &man.em.4; und
&man.miibus.4; aus dem Kernel entfernt werden.Netzwerkbetrieb einrichtenDie einfachste Netzwerkkonfiguration ist der Einsatz
von DHCP, um Ihre virtuelle Maschine mit dem gleichen
lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu
verbinden. Dazu fügen Sie die Zeile
ifconfig_em0="DHCP" in die Datei
/etc/rc.conf ein. Weitere
Informationen zur Konfiguration des Netzwerks unter
- FreeBSD finden Sie im des Handbuchs.BenedictReuschlingÜbersetzt von ChristophSold
- FreeBSD als Host-Betriebssystem
+ &os; als Host-BetriebssystemSeit einigen Jahren wurde &os; nicht offiziell von irgendeiner der
verfügbaren Virtualisierungslösungen als Host-Betriebssystem
unterstützt. Viele Anwender verwenden aber noch
ältere VMware-Versionen (z.B. emulators/vmware3), welches die
&linux;-Kompatibilitätsschicht nutzt. Kurz nach der
Veröffentlichung von &os; 7.2 erschien
&virtualbox; als Open-Source Edition
(OSE) von &sun; in der Ports-Sammlung als ein direkt
auf &os; lauffähiges Programm.&virtualbox; ist ein vollständiges
Virtualisierungspaket, das aktiv weiterentwickelt wird und für die
meisten Betriebssysteme einschliesslich &windows;, &macos;, &linux; und
&os; zur Verfügung steht. Es kann sowohl &windows; als auch
&unix;-ähnliche Gastsysteme betreiben. Es ist als Open Source und
als proprietäre Edition erhältlich. Die wichtigste
Einschränkung der OSE aus Anwendersicht ist
die fehlende USB-Unterstützung. Weitere Unterschiede können
von der Editions-Seite des
&virtualbox;-Wikis, das unter zu finden ist,
entnommen werden. Momentan steht nur OSE unter &os; zur
Verfügung.&virtualbox; installieren&virtualbox; steht als &os;-Port in
emulators/virtualbox bereit und
kann über den folgenden Befehl installiert werden:&prompt.root; cd /usr/ports/emulators/virtualbox
&prompt.root; make install cleanEine nützliche Option im Konfigurationsdialog ist die
GuestAdditions-Programmsammlung. Diese stellen
eine Reihe von nützlichen Eigenschaften in den
Gastbetriebssystemen zur Verfügung, wie beispielsweise
Mauszeigerintegration (was es ermöglicht, die Maus zwischen
dem Host und dem Gast zu teilen ohne eine spezielle Tastenkombination
für diesen Wechsel zu drücken), sowie schnelleres Rendern
von Videos, besonders in &windows; Gästen. Diese Gastzusätze
sind im Devices-Menü zu finden, nachdem die
Installation des Gastbetriebssystem abgeschlossen ist.Ein paar Konfigurationsänderungen sind notwendig, bevor
&virtualbox; das erste Mal gestartet wird.
Der Port installiert ein Kernelmodul in /boot/modules, das in den laufenden
Kernel geladen werden muss:&prompt.root; kldload vboxdrvUm sicherzustellen, dass das Modul immer nach einem Neustart
geladen wird, fügen Sie die folgende Zeile in die Datei
/boot/loader.conf ein:vboxdrv_load="YES"&virtualbox; benötigt auch das
eingehängte proc-Dateisystem:&prompt.root; mount -t procfs proc /procUm auch diese Einstellung nach einem Neustart zu erhalten, wird die
folgende Zeile in /etc/fstab
eingefügt:proc /proc procfs rw 0 0Möglicherweise erscheint eine Fehlermeldung ähnlich der
Folgenden, wenn &virtualbox; von einem
Terminal aus gestartet wird:VirtualBox: supR3HardenedExecDir: couldn't read "", errno=2 cchLink=-1Wahrscheinlich ist der Übeltäter das proc-Dateisystem. Verwenden Sie bitte
das mount-Kommando um zu überprüfen, ob
es korrekt eingehängt ist.Die Gruppe vboxusers wird während der
Installation von &virtualbox; angelegt.
Alle Benutzer, die Zugriff auf &virtualbox;
haben sollen, müssen in diese Gruppe aufgenommen werden. Der
pw-Befehl kann benutzt werden, um neue Mitglieder
hinzuzufügen:&prompt.root; pw groupmod vboxusers -m yourusernameUm &virtualbox; zu starten, wählen
Sie entweder den Eintrag Sun VirtualBox aus
dem Menü Ihrer graphischen Benutzeroberfläche, oder geben
Sie den folgenden Befehl in ein Terminal ein:&prompt.user; VirtualBoxBesuchen Sie die offizielle Webseite von
&virtualbox; unter , um weitere Informationen zur
Konfiguration und Verwendung zu erhalten. Da der &os;-Port noch recht
neu ist, befindet er sich noch unter ständiger Entwicklung. Um
die aktuellen Nachrichten und Anleitungen zur Fehlerbehebung zu
erhalten, besuchen Sie die entsprechende Seite im &os;-Wiki unter
.Andere VirtualisierungsmöglichkeitenZusätzlich wird
daran gearbeitet, &xen; als
funktionierende Host-Umgebung (dom0) für &os;
verfügbar zu machen.
diff --git a/de_DE.ISO8859-1/books/porters-handbook/book.sgml b/de_DE.ISO8859-1/books/porters-handbook/book.sgml
index 19cca979a4..3dcea7150b 100644
--- a/de_DE.ISO8859-1/books/porters-handbook/book.sgml
+++ b/de_DE.ISO8859-1/books/porters-handbook/book.sgml
@@ -1,15503 +1,15503 @@
%books.ent;
]>
Das FreeBSD Porter-HandbuchThe FreeBSD German Documentation ProjectApril 20002000200120022003200420052006200720082009The FreeBSD German
Documentation Project
&bookinfo.trademarks;
&bookinfo.legalnotice;
EinführungDie 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.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 – dazu sind keine besonderen Rechte
nötig.Einen neuen Port erstellenSie sind also daran interessiert, einen neuen Port zu
erstellen oder einen vorhandenen zu aktualisieren?
Großartig!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
fortfahren.Wenn Ihnen dieses Dokument nicht detailliert genug ist,
sollten Sie einen Blick in
/usr/ports/Mk/bsd.port.mk 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.Nur ein Bruchteil der Variablen
(VAR), die von
Ihnen gesetzt werden können, finden hier
Erwähnung. Die meisten von ihnen (wenn nicht sogar
alle) sind am Anfang von
/usr/ports/Mk/bsd.port.mk
erläutert. Beachten Sie bitte, dass diese Datei eine
nicht standardkonforme Tabulator-Einstellung
verwendet. Emacs und
Vim sollten diese Einstellung
jedoch automatisch beim Öffnen der Datei setzen. Sowohl
&man.vi.1; als auch &man.ex.1; können mit dem Befehl
:set tabstop=4 dazu gebracht werden, die
Datei richtig anzuzeigen, wenn sie geöffnet wird.Port erstellen auf die SchnelleDieser Abschnitt beschreibt, wie Sie schnell einen Port
erstellen können. In vielen Fällen ist dies
allerdings nicht ausreichend, dann werden Sie in diesem Buch
weiterlesen müssen.Als Erstes besorgen Sie sich das Original-Tarball
(komprimiertes Archiv) und legen es im
DISTDIR ab, welches
standardmäßig
/usr/ports/distfiles ist.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.Das Makefile schreibenEin minimales Makefile sieht in etwa
so aus:# New ports collection makefile for: oneko
# Date created: 5 December 1994
# Whom: asami
#
# $FreeBSD$
#
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 <bsd.port.mk>Versuchen Sie es zu verstehen. Machen Sie sich keine
Gedanken um die
$FreeBSD$-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
sample Makefile.Die Beschreibungsdateien erstellenEs gibt zwei Beschreibungsdateien, die für jeden Port
benötigt werden, ob sie tatsächlich im Paket
enthalten sind oder nicht. Dies sind
pkg-descr und
pkg-plist. Der pkg-
Präfix unterscheidet sie von anderen Dateien.pkg-descrDiese 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.pkg-descr enthält
keine Anleitung oder detaillierte
Beschreibung wie der Port benutzt oder kompiliert wird!
Bitte seien Sie vorsichtig, wenn Sie aus dem
README oder der Manualpage kopieren
; 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
eine der Webseiten mit dem
Präfix WWW: ein, damit
automatische Werkzeuge korrekt arbeiten.Das folgende Beispiel zeigt wie Ihre
pkg-descr aussehen sollte:This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(etc.)
WWW: http://www.oneko.org/pkg-plistDiese Datei enthält eine Liste aller Dateien, die
von diesem Port installiert werden. Sie wird auch die
Packliste genannt, da das Paket durch die
hier aufgeführten Dateien erstellt wird. Die
Pfadangaben sind relativ zum Installationspräfix
(für gewöhnlich /usr/local
oder /usr/X11R6). Wenn Sie die
MANn-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 @dirrm-Zeilen
einzufügen, um die Verzeichnisse zu entfernen, wenn das
Paket gelöscht wird.Hier ist ein kleines Beispiel: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/onekoFür weitere Details zur Packliste lesen Sie in der
&man.pkg.create.1; Manualpage nach.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.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,
eine Packliste automatisch
zu erstellen.Es gibt nur einen Fall, in dem
pkg-plist weggelassen werden kann.
Wenn der Port nur eine handvoll Dateien und Verzeichnisse
installiert, können diese in den Variablen
PLIST_FILES und
PLIST_DIRS im
Makefile aufgelistet werden. Zum
Beispiel könnten wir im obigen Beispiel ohne
pkg-plist für den
oneko-Port auskommen, indem wir die
folgenden Zeilen ins Makefile
einfügen: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/onekoNatürlich sollte PLIST_DIRS
ungesetzt bleiben, wenn der Port keine eigenen Verzeichnisse
installiert.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 pkg-plist benutzen.Später werden wir uns ansehen, wie
pkg-plist und
PLIST_FILES benutzt werden können,
um anspruchsvollere Aufgaben zu
erfüllen.Die Checksummendatei erzeugenGeben Sie einfach make makesum ein.
Die Regeln von Make sorgen dafür, dass die Datei
distinfo automatisch erstellt
wird.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
IGNOREFILES angeben. Dann wird die
Checksumme für diese Datei bei
make makesum nicht berechnet, sondern auf
IGNORE gesetzt.Den Port testenSie 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.pkg-plist enthält nichts,
das nicht von Ihrem Port installiert wurde.pkg-plist enthält alles,
was von Ihrem Port installiert wurde.Ihr Port kann mit Hilfe von
make reinstall mehrmals installiert
werden.Ihr Port
räumt bei der
Deinstallation hinter sich auf.Empfohlene Testreihenfolgemake installmake packagemake deinstallpkg_add Paket-Namemake deinstallmake reinstallmake packageStellen Sie bitte sicher, dass während
make package und
make deinstall 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.Der gründlichste Weg diese Schritte zu automatisieren
ist eine Tinderbox zu installieren.
Diese verwaltet Jails, 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
ports/ports-mgmt/tinderboxIhren Port mit portlint
überprüfenBitte verwenden Sie portlint, um
festzustellen, ob Ihr Port unseren Richtlinien entspricht.
Das Programm
ports-mgmt/portlint ist
Teil der Ports-Sammlung. Stellen Sie vor allem sicher, dass
das Makefile in der
richtigen Form und das
Paket passend benannt
ist.Den Port einreichenAls Erstes sorgen Sie bitte dafür, dass Sie den
Abschnitt DOs and DON'Ts
gelesen haben.Nun, da Sie mit Ihrem Port zufrieden sind, müssen Sie
ihn nur noch in den Haupt-Ports-Tree von FreeBSD einbringen,
damit alle daran teilhaben können. Wir benötigen
nicht Ihr work-Verzeichnis oder Ihr
pkgname.tgz-Paket – diese
können Sie nun löschen. Als Nächstes fügen
Sie bitte einfach die Ausgabe von
shar `find port_dir` in einen Fehlerbericht
(PR - Problem Report) und senden diesen mittels
&man.send-pr.1; (unter
Bug Reports and General Commentary finden Sie weitere
Informationen über &man.send-pr.1;). Ordnen Sie den
Fehlerbericht bitte in die Kategorie Ports
mit der Klasse Change-Request ein
(Markieren Sie den Bericht nicht als
vertraulich
(confidential)!). Fügen Sie bitte eine
kurze Beschreibung des Programms, das Sie portiert haben, in
das Beschreibungs-Feld des Problemberichts und
das Shar (Shell-Archiv) in das Fix-Feld
ein.Sie können uns die Arbeit um einiges vereinfachen,
wenn Sie eine gute Beschreibung in der Zusammenfassung des
Problemberichtes verwenden. Wir bevorzugen etwas wie
Neuer Port:
<Kategorie>/<Portname><Kurzbeschreibung des
Ports> für neue Ports und Update
Port: <Kategorie>/<Portname>
<Kurzbeschreibung des Updates> für
Portupdates. Wenn Sie sich an dieses Schema halten, ist die
Chance, dass sich jemand bald Ihren Bericht ansieht,
deutlich besser.Noch einmal: Bitte fügen Sie nicht das
distfile der Originalquelle, das
work-Verzeichnis oder das Paket, das Sie mit
make package erstellt haben, ein.
Haben Sie bitte etwas Geduld, nachdem Sie den Port
eingereicht haben. Manchmal kann es einige Monate dauern,
bevor ein Port in FreeBSD eingefügt wird, obwohl es
wahrscheinlich nur ein paar Tage dauert. Sie können sich
die
Liste der Ports, die darauf warten in FreeBSD committet zu
werden, ansehen.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 Additional
FreeBSD Contributors und in anderen Dateien auf.
Ist das nicht toll?! :-)Einen Port in aller Ruhe erstellenOk, 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.Die FunktionsweiseBeginnen wir mit der Abfolge der Ereignisse, die
eintreten, wenn der Nutzer das erste make
in Ihrem Portsverzeichnis ausführt. Sie empfinden es
für das Verständnis vielleicht hilfreich
bsd.port.mk in einem anderen Fenster
offen zu haben, während Sie diesen Abschnitt
lesen.Aber machen Sie sich keine Sorgen, falls Sie nicht
wirklich verstehen, was bsd.port.mk
macht, die Wenigsten begreifen dies...
:>Das Target fetch wird
aufgerufen. Es ist dafür verantwortlich
sicherzustellen, dass der Tarball lokal im
DISTDIR verfügbar ist. Falls
fetch die benötigten Dateien
in DISTDIR nicht finden kann,
durchsucht es die URL MASTER_SITES,
welche im Makefile gesetzt ist, ebenso wie unsere
Haupt-FTP-Seite unter
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/
, wo wir genehmigte Distfiles als Backup
aufbewahren. Danach wird versucht, so eine direkte
Internetverbindung besteht, dass genannte Distfile mit
FETCH herunterzuladen. Falls dies
gelingt, wird die Datei in DISTDIR
für weitere Nutzung abgelegt und fährt
fort.Das Target extract wird
aufgerufen. Es sucht nach den Distfiles Ihres Ports
(normalerweise ein gzip-komprimierter Tarball) in
DISTDIR und entpackt diese in ein
temporäres Unterverzeichnis, welches von
WRKDIR festgelegt wird (standardmäßig
work).Das Target patch wird
aufgerufen. Zuerst werden alle in
PATCHFILES festgelegten Patches
eingespielt. Anschließend werden, falls Patches der
Form
patch-* in
PATCHDIR (standardmäßig das
files-Unterverzeichnis) gefunden
werden, diese in alphabetischer Reihenfolge
eingespielt.Das Target configure wird
aufgerufen. Dieses kann viele verschiedene Dinge
machen.Existiert scripts/configure,
so wird es aufgerufen.Falls HAS_CONFIGURE oder
GNU_CONFIGURE gesetzt sind, wird
WRKSRC/configure
ausgeführt.Falls USE_IMAKE gesetzt ist,
wird XMKMF
(standardmäßig xmkmf -a)
ausgeführt.Das Target build wird
aufgerufen. Es ist für das Wechseln in das private
Arbeitsverzeichnis (WRKSRC) und das
Bauen des Ports zuständig. Ist
USE_GMAKE gesetzt, so wird GNU
make verwendet, sonst das
System-make.Die oben genannten Schritte sind die Standardaktionen.
Zusätzlich können Sie pre-
irgendwas oder
post-irgendwas als Targets definieren oder Skripten mit diesen
Namen in das scripts-Unterverzeichnis
legen. Sie werden dann vor bzw. nach den Standardaktionen
aufgerufen.Angenommen Sie haben das Target post-extract
in Ihrem Makefile
definiert und eine Datei pre-build im
scripts Unterverzeichnis, so wird das
Target post-extract nach dem normalen
Entpacken aufgerufen und das Skript
pre-build
ausgeführt, bevor die vordefinierten Bau-Regeln
abgearbeitet sind. Es wird empfohlen, dass Sie
Makefile-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.Die Standardaktionen werden aus den Targets
bsd.port.mkdo-irgendwas übernommen. Zum Beispiel sind die Befehle
zum Entpacken eines Ports im Target
do-extract zu finden. Falls Sie mit
einem vorgegebenen Target nicht zufrieden sind, können
Sie es verändern, indem Sie das Target
do-irgendwas in Ihrem Makefile neu
definieren.Die Haupt-Targets (z.B.
extract,
configure 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
do-extract, aber niemals die Art,
wie extract arbeitet!Jetzt, da Sie verstehen, was geschieht, wenn der Benutzer
make eingibt, lassen Sie uns durch die
empfohlenen Schritte gehen, um den perfekten Port zu
erstellen.Den originalen Quelltext besorgenNormalerweise liegt der original Quelltext als gepackte
Datei (foo.tar.gz
oder
foo.tar.Z)
vor. Kopieren Sie diese nach DISTDIR.
Nutzen Sie, soweit möglich, immer die Quellen aus dem
Hauptzweig.Es ist notwendig die Variable
MASTER_SITES anzupassen, um anzugeben, wo
sich der originale Quelltext befindet. In
bsd.sites.mk 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.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.Ist kein geeigneter Ort zum Ablegen des Quelltextes
auffindbar, ist es möglich diesen intern
auf ftp.FreeBSD.org abzulegen; dies sollte
jedoch als letzte Möglichkeit angesehen werden. Das
Distfile muss in diesem Fall in ~/public_distfiles/
eines freefall-Accounts abgelegt
werden. Bitten Sie den Committer Ihres Ports dies zu erledigen.
Er wird außerdem MASTER_SITES nach
MASTER_SITE_LOCAL und
MASTER_SITE_SUBDIR auf den
freefall-Benutzernamen angepasst.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
MASTER_SITES 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 checksum mismatch 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
MASTER_SITES aufzunehmen.Sind für den Port zusätzlich aus dem Internet
verfügbare Patches erforderlich, sollten diese ebenfalls
in DISTDIR 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 PATCHFILES
).Den Port bearbeitenEntpacken 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
FreeBSD-Version kompilieren zu können.
Protokollieren Sie sorgfältig 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.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 Configure-Skripte werfen
oder vielleicht etwas Ähnliches selbst erstellen. Das
Ziel der Ports-Sammlung ist es, jeden Port so
plug-and-play-fähig wie möglich
für den Endbenutzer zu machen, während ein Minimum
an Speicherplatz gebraucht wird.Solange nicht anders angegeben wird von Patch-Dateien,
Skripten und anderen Dateien, die Sie erstellt und der FreeBSD
Ports-Sammlung hinzugefügt haben, angenommen, dass Sie
unter den standardmäßigen BSD-Copyright-Bedingungen
stehen.Fehlerbehebung (Patches)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
patch-*
abgelegt werden, wobei * dem
Pfadnamen der zu korrigierenden Datei entspricht, wie er auch
in patch-Imakefile oder im
patch-src-config.h erscheint. Diese
Dateien sollten in PATCHDIR (normalerweise
files) abgelegt sein, von wo sie
automatisch übernommen werden. Alle Patches müssen
sich relativ zur WRKSRC-Variable
(normalerweise dem Verzeichnis, in dem sich der Quelltext des
Ports entpackt und wo auch der Bau stattfindet)
befinden.Um Korrekturen und Updates zu vereinfachen, sollte es
vermieden werden, mehr als einen Patch für eine Datei zu
nutzen (z.B. patch-file und
patch-file2, welche beide
WRKSRC/foobar.c
verändern).Für die Benennung der Patches sollten nur die Zeichen
[-+._a-zA-Z0-9] genutzt werden. Bitte
verwenden Sie keine weiteren Zeichen als die angegebenen. Die
Namensvergabe sollte nicht patch-aa oder
patch-ab etc. entsprechen, erwähnen
Sie immer den Pfad und Dateinamen.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
($) eingefügte Zeichen und
beginnen üblicherweise mit $Id
oder $RCS.Die Option rekursiv () 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, Makefiles oder wenn der
Port Imake oder GNU
configure usw. nutzt, überflüssig
sind und entfernt werden sollten. Falls es es notwendig war,
configure.in zu bearbeiten und es soll
autoconf zum Neuerstellen von
configure genutzt werden, sollten die Diffs
aus configure nicht genutzt werden (diese
werden oft einige tausend Zeilen
groß!); – hier sollte
USE_AUTOTOOLS=autoconf:261 definiert und
das Diff aus configure.in genutzt
werden.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
(withspace-only changes). Solche Änderungen
vergrößern nicht nur das CVS-Repository, sondern
erschweren es auch die Ursache für eventuell auftretende
Probleme zu finden.War es notwendig eine Datei zu entfernen, wird dies besser
mittels des post-extract-Targets als
über den Patch selbst realisiert.Ein einfacher Austausch kann direkt über das
Makefile 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:post-patch:
@${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
@${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure
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. /bin/sh^M not found)
und anderes ergeben. Um schnell alle Dateien von CR/LF
nach LF zu konvertieren, kann
USE_DOS2UNIX=yes in das
Makefile des Ports geschrieben werden.
Hierzu kann eine Liste der zu konvertierenden Dateien erstellt
werden:USE_DOS2UNIX= util.c util.hSollen Gruppen von Dateien über verschiedene
Unterverzeichnisse konvertiert werden, kann
DOS2UNIX_REGEX genutzt werden, dessen
Argumente find-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:USE_DOS2UNIX= yes
DOS2UNIX_REGEX= .*\.(c|cpp|h)KonfigurierenFügen Sie alle zusätzlichen
Veränderungsbefehle Ihrem Skript
configure hinzu und speichern Sie es im
scripts-Unterverzeichnis. Wie vorstehend
schon erwähnt, können Sie dies auch mit den Targets
Makefile und/oder Skripte mit dem Namen
pre-configure oder
post-configure erledigen.Handhabung von BenutzereingabenSollte der Port Eingaben vom Benutzer benötigen,
muss IS_INTERACTIVE im
Makefile des Ports gesetzt werden. Dies
erlaubt overnight builds Ihren Port zu
überspringen, falls der Nutzer die Variable
BATCH setzt (setzt der Nutzer hingegen die
Variable INTERACTIVE, werden
nur Ports gebaut, die Interaktion vom
Nutzer erwarten). Dies erspart den Rechnern, welche
kontinuierlich Ports bauen, eine Menge Zeit (siehe
unten).Zudem ist es empfohlen, falls sinnvolle Vorgaben für
interaktive Optionen gesetzt sind, die
PACKAGE_BUILDING-Variable zu prüfen
und das interaktive Skript abzuschalten. Dies macht es uns
möglich, Pakete für CDROMs und FTP-Server zu
bauen.Die Konfiguration des MakefileDas Konfigurieren des Makefile ist
sehr einfach und wir schlagen vor, dass Sie zunächst
einen Blick auf vorhandene Beispiele werfen. Zusätzlich
gibt es ein
Beispiel eines Makefile
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.Bedenken Sie bitte die folgenden Probleme in der hier
vorgegebenen Abfolge der Unterabschnitte dieses Kapitels, wenn
Sie Ihr neues Makefile erstellen:Der originale QuelltextLiegt der Quelltext in DISTDIR als eine
standardisierte und mit gzip gepackte Datei in der Art
foozolix-1.2.tar.gz? Falls ja,
können Sie zum nächsten Schritt übergehen.
Falls nicht, sollten Sie versuchen, die Variablen
DISTVERSION, DISTNAME,
EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX, oder
DISTFILES zu ändern. Das hängt
davon ab, wie fremdartig das Distributionsfile Ihres Ports ist
(der häufigste Fall ist
EXTRACT_SUFX=.tar.Z, wenn der Tarball durch
ein normales compress und nicht durch
gzip gepackt wurde).Im schlimmsten Fall können Sie einfach Ihre eigene
Vorgabe mittels do-extract erzeugen
und die Standardvorgabe überschreiben; aber dies sollte
in den wenigsten Fällen, wenn überhaupt, notwendig
sein.BezeichnungenDer erste Teil des Makefile
beschreibt die Versionsnummer des Ports und führt ihn in
der richtigen Kategorie auf.PORTNAME und
PORTVERSIONSetzen Sie bitte die Variable
PORTNAME auf den Basisnamen Ihres Ports
und die Variable PORTVERSION auf dessen
Versionsnummer.PORTREVISION und
PORTEPOCHPORTREVISIONDie PORTREVISION-Variable ist ein
streng monoton wachsender Wert, welcher auf 0
zurückgesetzt wird, nachdem
PORTVERSION 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 PORTREVISION
werden von automatisierten Werkzeugen (z.B.
&man.pkg.version.1;) genutzt, um anzuzeigen, dass ein
neues Paket verfügbar ist.PORTREVISION 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.Beispiele dafür, wann
PORTREVISION erhöht werden
sollte:Hinzufügen von Patches, welche
Sicherheitslücken schließen, Fehler
beseitigen oder neue Funktionalität zum Port
hinzufügen.Änderungen am Makefile
des Ports, welche compile-time-Optionen
hinzufügen oder entfernen.Ä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).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).Schleichende Änderungen am Distfile, welche
bedeutende funktionale Änderungen verursachen,
d.h. Änderungen des Distfile erfordern eine
Korrektur an distinfo, ohne dass
damit zusammenhängend die
PORTVERSION verändert wird,
obwohl ein diff -ru zwischen der
alten und der neuen Version bedeutende
Veränderungen am Code nachweist.Beispiele für Änderungen, welche keine
Erhöhung von PORTREVISION
erfordern:Stilistische Änderungen am Grundgerüst
des Ports ohne funktionale Änderungen am daraus
resultierenden Paket.Änderungen an der Variable
MASTER_SITES oder andere
funktionale Änderungen, welche das resultierende
Paket nicht verändern.Marginale Patches am Distfile wie die Korrektur
von Tippfehlern, welche nicht wichtig genug sind, um
dem Benutzer die Bürde eines Upgrades
aufzuerlegen.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
PORTREVISION den Inhalt des Pakets
wiederspiegelt, ist es nicht notwendig
PORTREVISION zu erhöhen, wenn
das Paket vorher nicht erstellt werden konnte.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
PORTREVISION.PORTEPOCHVon 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).In Situationen wie diesen sollte die Variable
PORTEPOCH erhöht werden. Wenn
PORTEPOCH größer als 0 ist,
wird sie an den Namen des Pakets angehängt, wie in
Abschnitt 0 oberhalb bereits beschrieben.
PORTEPOCH 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 (1.0,1 im
obigen Beispiel) ist immer noch numerisch kleiner als die
vorherige Version (2000801), aber das Suffix
,1 wird von automatisierten Werkzeugen
gesondert behandelt und wird als größer
erkannt, als das implizit angenommene Suffix
,0 im früheren Paket.Das Entfernen oder Zurücksetzen von
PORTEPOCH 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!Es wird erwartet, dass PORTEPOCH
für die weitaus überwiegende Zahl der Ports
nicht verwendet wird und der verantwortungsvolle und
vorausschauende Umgang mit PORTVERSION
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
Snapshot-Versionen. Man ist versucht,
das Release mit dem jeweiligen Datum zu bezeichnen,
was unweigerlich zu den oben beschriebenen Problemen
führt, wenn das nächste
offizielle Release erscheint.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
PORTVERSION 1.2.20000917 oder
ähnlich erhalten und nicht 20000917, damit das
nachfolgende Release, angenommen 1.3, immer noch einen
größeren numerischen Wert aufweist.Beispiel für den Gebrauch von
PORTREVISION und
PORTEPOCHDer gtkmumble-Port, Version
0.10, befindet sich in der
Ports-Sammlung:PORTNAME= gtkmumble
PORTVERSION= 0.10PKGNAME wird zu
gtkmumble-0.10.Ein Sicherheitsloch wurde entdeckt, das einen lokalen
Patch von FreeBSD erforderlich macht.
PORTREVISION wird entsprechend
erhöht.PORTNAME= gtkmumble
PORTVERSION= 0.10
PORTREVISION= 1PKGNAME wird zu
gtkmumble-0.10_1Eine neue Version wird vom Software-Drittanbieter
veröffentlicht, bezeichnet mit der Version
0.2 (es stellt sich heraus, dass der
Autor beabsichtigte, dass 0.10
eigentlich 0.1.0 bedeuten sollte,
nicht was kommt nach 0.9
– Hoppla, aber nun ist es zu spät).
Da die neue Unterversion 2 numerisch
kleiner ist als die vorherige Version
10, muss PORTEPOCH
erhöht werden, um sicherzustellen, dass das neue
Paket auch als neuer erkannt wird. Da es
ein neues Release des Drittanbieters ist, wird
PORTREVISION auf 0 zurückgesetzt
(oder aus dem Makefile
entfernt).PORTNAME= gtkmumble
PORTVERSION= 0.2
PORTEPOCH= 1PKGNAME wird zu
gtkmumble-0.2,1Das nächste Release ist 0.3. Da
PORTEPOCH niemals verringert wird,
sind die Versionsvariablen nun wie folgt:PORTNAME= gtkmumble
PORTVERSION= 0.3
PORTEPOCH= 1PKGNAME wird zu
gtkmumble-0.3,1Falls PORTEPOCH mit diesem
Upgrade auf 0 zurückgesetzt
worden wäre, dann würde jemand, der das Paket
gtkmumble-0.10_1 installiert
hätte, das Paket gtkmumble-0.3
nicht als neuer erkennen, da 3 immer
noch numerisch kleiner ist als 10.
Bedenken Sie, dass genau dies der springende Punkt an
PORTEPOCH ist.PKGNAMEPREFIX und
PKGNAMESUFFIXZwei optionale Variablen,
PKGNAMEPREFIX und
PKGNAMESUFFIX, werden verknüpft mit
PORTNAME und
PORTVERSION, um
PKGNAME zu bilden als
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}
. Stellen Sie bitte unbedingt sicher, dass diese
Variablen den Richtlinien
für einen guten Paketnamen entsprechen.
Insbesondere dürfen Sie
keinesfalls einen Bindestrich
(-) in PORTVERSION
verwenden. Falls das Paket den
language- oder
-compiled.specifics-Teil aufweist
(siehe unten) benutzen Sie PKGNAMEPREFIX
oder PKGNAMESUFFIX respektive. Machen Sie
diese Variablen nicht zum Bestandteil von
PORTNAME!LATEST_LINKIn 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
PORTNAME,
PKGNAMEPREFIX und sogar
PKGNAMESUFFIX aufweisen. In solchen
Fällen sollte die optionale Variable
LATEST_LINK auf einen unterschiedlichen
Wert für alle Ports gesetzt werden mit Ausnahme des
Haupt-Ports. Beispiele hierfür sind die
editors/vim5 und
editors/vim-Ports und die
www/apache*-Familie. Beachten Sie
bitte, dass die Frage der Auswahl der
wichtigsten Version
(am populärsten,
am besten Unterstützt,
zuletzt gepatcht usw.) ausserhalb der
Möglichkeiten dieses Handbuches liegt. Wir sagen Ihnen
nur, wie Sie die anderen Ports spezifizieren, nachdem Sie
den Haupt-Port erkoren haben.Namensregeln für PaketeIm 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!Der Paketname soll aussehen wie
language_region-name-compiled.specifics-version.numbers.Der Paketname ist definiert als
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}
. Stellen Sie bitte sicher, dass die Variablen
Ihres Ports diesem Format entsprechen.FreeBSD bemüht sich ausserordentlich, die
Landessprachen seiner Nutzer zu unterstützen.
Die language-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 ja
für Japanisch, ru für
Russisch, vi für Vietnamesisch,
zh für Chinesisch,
ko für Koreanisch und
de für Deutsch.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
en_US für nordamerikanisches
Englisch und fr_CH für
schweizerisches Französisch.Der language-Teil muss
in der PKGNAMEPREFIX-Variable gesetzt
werden.Der erste Buchstabe des
name-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, Perl 5-Module durch
ein vorstehendes p5- und durch
Umwandlung des doppelten Doppelpunktes in Bindestriche
zu bezeichnen. So wird z.B. aus dem
Data::Dumper-Modul der
p5-Data-Dumper-Port.Vergewissern Sie sich, dass der Name des Ports und
seine Versionsnummer klar getrennt sind und in den
Variablen PORTNAME und
PORTVERSION stehen. Der einzige
Grund, um in PORTNAME einen
Versionsteil aufzunehmen ist der, dass die Software
wirklich so bezeichnet wird, wie z.B. die Ports
textproc/libxml2 oder
japanese/kinput2-freewnn.
Ansonsten sollte PORTNAME keine
versionsspezifischen Bestandteile aufweisen. Es ist
vollkommen normal, dass viele Ports den gleichen
PORTNAME aufweisen wie z.B. die
www/apache*-Ports. In diesem Falle
werden unterschiedliche Versionen (und unterschiedliche
Indexeinträge) unterschieden durch die Werte von
PKGNAMEPREFIX,
PKGNAMESUFFIX und
LATEST_LINK.Falls der Port mit verschiedenen, fest kodierten
Vorgaben (üblicherweise Teil des
Verzeichnisnamens in einer Familie von Ports) gebaut
werden kann, dann soll der
-compiled.specifics-Teil die
einkompilierten Vorgaben anzeigen (der Bindestrich ist
optional). Beispiele hierfür sind
Papiergrößen und Font-Einheiten.Der
-compiled.specifics-Teil
muss in der Variablen PKGNAMESUFFIX
gesetzt werden.Die Versionszeichenfolge sollte einen Bindestrich
(-) 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
pl (bedeutet
patchlevel), welche
nur dann gebraucht werden darf,
wenn die Applikation über keine
Haupt– oder Unterversionsnummern
verfügt. Wenn die Versionsbezeichnung der Software
Zeichenketten wie alpha,
beta, rc oder
pre 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.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 verwandt werden diese im Format
yyyy.mm.dd und nicht dd.mm.yyyy oder gar dem nicht Y2K-kompatiblen Format
yy.mm.dd vorliegen.Hier sind einige reale Beispiele, die aufzeigen,
wie man den Namen einer Applikation zu einem
vernünftigen Paketnamen umwandelt:SoftwarenamePKGNAMEPREFIXPORTNAMEPKGNAMESUFFIXPORTVERSIONGrundmule-2.2.2(leer)mule(leer)2.2.2Keine Änderung erforderlichEmiClock-1.0.2(leer)emiclock(leer)1.0.2keine Großbuchstaben für einzelne
Applikationenrdist-1.3alpha(leer)rdist(leer)1.3.aKeine Zeichenketten wie
alpha erlaubtes-0.9-beta1(leer)es(leer)0.9.b1keine Zeichenketten wie beta
erlaubtmailman-2.0rc3(leer)mailman(leer)2.0.r3keine Zeichenketten wie rc
erlaubtv3.3beta021.src(leer)tiff(leer)3.3Was sollte denn das eigentlich sein?tvtwm(leer)tvtwm(leer)pl11Versionsstring zwingend erforderlichpiewm(leer)piewm(leer)1.0Versionsstring zwingend erforderlichxvgr-2.10pl1(leer)xvgr(leer)2.10.1pl nur erlaubt, wenn keine
Versionsnummer vorhandengawk-2.15.6ja-gawk(leer)2.15.6Japanische Sprachversionpsutils-1.13(leer)psutils-letter1.13Papergröße beim Paketbau fix
kodiertpkfonts(leer)pkfonts3001.0Paket für 300 DPI SchriftartenFalls 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 1.0 (wie im obigen
Beispiel piewm). Sie können auch den
Autor fragen oder eine Datumszeichenfolge
(yyyy.mm.dd)
als Version verwenden.KategorisierungCATEGORIESWenn ein Paket erzeugt wird, dann wird es unter
/usr/ports/packages/All abgelegt und
von einem oder mehreren Unterverzeichnissen werden auf
/usr/ports/packages Links erstellt.
Die Namen dieser Unterverzeichnisse werden durch die
Variable CATEGORIES 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 Aktuelle Liste der
Kategorien und suchen Sie die beste Kategorie
für Ihren Port aus.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 unten für weitere
Informationen darüber, wie man die richtige Kategorie
bestimmt.Aktuelle Liste der KategorienHier ist die aktuelle Liste der Kategorien. Die mit
einem Asterisk (*) bezeichneten sind
virtuelle 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.Für nicht-virtuelle Kategorien finden Sie eine
einzeilige Beschreibung in der Variable
COMMENT im
Makefile des jeweiligen
Unterverzeichnisses.KategorieBeschreibungAnmerkungaccessibilityPorts für behinderte Menschen.afterstep*Ports für den AfterStep
Window Manager.arabicArabische Sprachunterstützung.archiversArchivierungswerkzeuge.astroPorts für Astronomie.audioSound-Unterstützung.benchmarksBenchmarking-Werkzeuge.biologySoftware für Biologie.cadCAD-Werkzeuge.chineseChinesische Sprachunterstützung.commsKommunikationsprogramme.Hauptsächlich Software für serielle
Schnittstellen.convertersZeichensatz-Konverter.databasesDatenbanken.deskutilsDinge, die vor der Erfindung des Computers
auf dem Schreibtisch waren.develEntwicklungs-Werkzeuge.Legen Sie keine Bibliotheken hier ab, nur weil
es Bibliotheken sind, es sei denn, sie gehören
wirklich nirgendwo anders hin.dnsDNS-bezogene Software.docs*Meta-Ports für die
FreeBSD-Dokumentation.editorsallgemeine Editoren.Spezielle Editoren gehören in Ihre
jeweilige Kategorie, (z.B. gehört ein
mathematischer Formeleditor in
math).elisp*Emacs-lisp-Ports.emulatorsEmulatoren für andere Betriebssysteme.
Terminal-Emulatoren gehören
nicht hierher; X-basierende
gehören zu x11 und
text-basierende zu comms oder
misc, abhängig von deren
genauer Funktionalität.financeFinanz-Software und ähnliches.frenchFranzösische Sprachunterstützung.
ftpFTP Client- und Server-Werkzeuge.Falls Ihr Port sowohl FTP als auch HTTP
unterstützt, stellen Sie ihn in
ftp mit der Zweitkategorie
www.gamesSpiele.geography*geografische Software.germanDeutsche Sprachunterstützung.gnome*Ports für GNOMEgnustep*Software für GNUstep.graphicsgrafische Werkzeuge.hamradio*Software für Amateurfunk.haskell*Software für die
Haskell-Programmiersprache.hebrewHebräische Sprachunterstützung.
hungarianUngarische Sprachunterstützung.ipv6*IPv6-bezogene Software.ircInternet Relay Chat (IRC)-Werkzeuge.japaneseJapanische Sprachunterstützung.javaSoftware für die Java-Programmiersprache.
Die java-Kategorie sollte
nicht die Einzige für einen Port sein mit
Ausnahme der direkt nur mit der Programmiersprache
zusammenhängenden Applikationen. Porter sollten
java nicht als Hauptkategorie
eines Ports wählen.kde*Ports für das K Desktop Environment
(KDE)-Projekt.kld*Kernelmodule.koreanKoreanische Sprachunterstützung.langProgrammiersprachen.linux*Linux-Applikationen und -Werkzeuge.lisp*Software für die Lisp-Programmiersprache.
mailMail-Software.mathNumerische Berechnungen und andere
mathematische Werkzeuge.mboneMBone-Applikationen.miscVerschiedene Werkzeuge.Hauptsächlich Werkzeuge, die nicht
anderswo hingehören. Versuchen Sie, falls
irgend möglich, eine bessere Kategorie
für Ihren Port zu finden als
misc, weil Ports hier leicht
untergehen.multimediaMultimedia-Software.netVerschiedene Netzwerk-Software.net-imInstant Messaging-Software.net-mgmtNetzwerk-Management-Software.net-p2pPeer to peer-Netzwerkprogramme.newsUSENET News-Software.palmSoftware für Palm™.
parallel*Applikationen für paralleles Rechnen.
pear*Ports für das Pear PHP-Framework.perl5*Ports, welche Perl
Version 5 benötigen.plan9*Verschiedene Programme von Plan9.
polishPolnische Sprachunterstützung.ports-mgmtHilfsprogramme für das Installieren und
Entwickeln von FreeBSD Ports und Paketen.portuguesePortugiesische Sprachunterstützung.
printDrucker-Software.Desktop Veröffentlichungs-Werkzeuge (DTP,
Betrachter etc.) gehören auch hierher.python*Software für Python.
ruby*Software für Ruby.
rubygems*Ports für RubyGems-Pakete.
russianRussische Sprachunterstützung.scheme*Software für die
Scheme-Programmiersprache.scienceWissenschaftliche Programme, die in keine
andere Kategorie passen wie z.B.
astro,
biology und
math.securitySecurity-Werkzeuge.shellsShells.spanish*Spanische Sprachunterstützung.sysutilsSystem-Werkzeuge.tcl*Ports, welche Tcl benötigen.textprocTextverarbeitungsprogramme.Dies beinhaltet nicht DTP-Werkzeuge, diese
gehören in print.
tk*Ports, welche Tk benötigen.ukrainianUkrainische Sprachunterstützung.vietnameseVietnamesische Sprachunterstützung.
windowmaker*Ports für den WindowMaker Window-Manager.
wwwSoftware für das World Wide Web (WWW).
HTML-Werkzeuge gehören auch hierher.
x11X-Window-System und dergleichen.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
x11-*-Kategorie (siehe unten).
Falls Ihr Port eine X-Applikation
ist, dann definieren Sie bitte
USE_XLIB (impliziert durch
USE_IMAKE) und fügen ihn der
entsprechenden Kategorie hinzu.x11-clocksX11-Uhren.x11-driversX11-Treiber.x11-fmX11-Dateimanager.x11-fontsX11-Schriftarten und Werkzeuge.x11-serversX11-Server.x11-themesX11-Themes.x11-toolkitsX11-Toolkits.x11-wmX11-Window-Manager.xfce*Ports in Zusammenhang mit Xfce.zope*Zope-Unterstützung.
Wählen der richtigen KategorieDa 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:Die erste (primäre) Kategorie muss eine
physische (keine virtuelle, siehe oben) sein. Dies
ist notwendig damit Pakete erstellt werden können.
Die nachfolgenden Kategorien können wahllos
virtuelle oder physische Kategorien sein.Sprachspezifische Kategorien kommen immer zuerst.
Wenn Ihr Port z.B. Japanische X11-Schriftarten
installiert, dann muss Ihre
CATEGORIES-Zeile
japanese x11-fonts
enthalten.Spezifische Kategorien werden vor weniger
spezifischen Kategorien aufgelistet. Ein HTML-Editor
sollte z.B. als www editors
aufgeführt werden und nicht umgekehrt.
Genauso sollten Sie keinen Port unter
net aufführen, wenn er zu
irc, mail,
mbone, news,
security oder
www passt, da
net stillschweigend eingeschlossen
ist in diesen Kategorien.x11 wird nur als sekundäre
Kategorie benutzt, wenn die primäre Kategorie eine
sprachspezifische ist. Keinesfalls sollten Sie
x11 in die Kategorie-Zeile einer
X-Applikation setzen.Emacs modes gehören
in die gleiche Kategorie wie die vom jeweiligen mode
unterstützte Applikation und nicht in
editors. Ein
Emacs mode z.B. für das
Editieren von Quelltext einer bestimmten
Programmiersprache gehört zur Kategorie
lang.Für Ports, die vom Benutzer ladbare Kernelmodule
installieren, sollte die virtuelle Kategorie
kld in die
CATEGORIES-Zeile aufgenommen
werden.misc sollte nicht zusammen mit
irgendeiner anderen nicht-virtuellen Kategorie
auftreten. Falls Sie misc mit einer
anderen Kategorie in CATEGORIES haben
bedeutet dies, dass Sie gefahrlos
misc streichen und die andere
Kategorie alleine verwenden können!Falls Ihr Port wirklich in keine andere Kategorie
passt, verwenden Sie bitte
misc.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.Eine neue Kategorie vorschlagenDa die Ports-Sammlung über viele Jahre gewachsen
ist, wurden viele neue Kategorien hinzugefügt. Neue
Kategorien können virtuell (ohne
eigenes Unterverzeichnis in der Ports-Sammlung) oder
physisch 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.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.Die Erklärung dafür ist, dass eine Neuanlage
einer physischen Kategorie einen erheblichen
Arbeitsaufwand 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 zu
groß betrachtet werden muss noch ob sich
bestimmte Kategorien zur einfachen Suche eignen (und wie
viele Kategorien überhaupt ideal wären) und so
weiter).Hier ist das Prozedere: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
GNATS 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.Nehmen Sie an der Diskussion teil.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:Makefiles für die
neuen Ports nach dem RepocopyMakefile für die neue
KategorieMakefile für die alten
Kategorien der betroffenen PortsMakefiles für Ports,
welche von den alten Ports abhängenFü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.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.Sobald der PR bestätigt wurde muss ein
Committer den Rest der Prozedur durchführen, welche
im
Committers Guide beschrieben ist.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
CATEGORIES der betroffenen Ports
hinzufügen.Vorschlagen einer Neuorganisation aller
KategorienVon 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.Die DistributionsdateienDer zweite Teil des Makefile
beschreibt die Dateien, welche heruntergeladen werden
müssen, um den Port zu bauen und wo diese Dateien zu
finden sind.DISTVERSION/DISTNAMEDISTNAME ist der Name der Applikation
wie er von den Autoren vergeben wurde.
DISTNAME hat als Vorgabe
${PORTNAME}-${PORTVERSION} also
überschreiben Sie diese Vorgabe nur, wenn es notwendig
ist. DISTNAME wird nur an zwei Stellen
genutzt. Erstens: (DISTFILES) hat als
Vorgabe
${DISTNAME}${EXTRACT_SUFX}.
Zweitens: Die Distributionsdatei soll in einem
Unterverzeichnis namens WRKSRC
extrahiert werden, dessen Vorgabe
work/${DISTNAME}
ist.Manche Drittanbieter-Namen, welche nicht in das Schema
${PORTNAME}-${PORTVERSION} passen,
können durch Setzen von DISTVERSION
automatisch behandelt werden. PORTVERSION
und DISTNAME werden automatisch
abgeleitet, können aber natürlich manuell
überschrieben werden. Die folgende Tabelle führt
einige Beispiele auf:DISTVERSIONPORTVERSION0.7.1d0.7.1.d10Alpha310.a33Beta7-pre23.b7.p28:f_178f.17PKGNAMEPREFIX und
PKGNAMESUFFIX beeinflussen
DISTNAME nicht. Beachten Sie bitte
auch, dass Sie DISTNAME
unverändert lassen sollten, falls
WRKSRC denselben Wert hat wie
work/${PORTNAME}-${PORTVERSION}
und gleichzeitig dass Archiv des originalen Quelltextes
anders benannt ist als
${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}.
Es ist einfacher
DISTFILES zu definieren, als
DISTNAME und WRKSRC
(und möglicherweise EXTRACT_SUFX)
zu setzen.MASTER_SITESDokumentieren Sie das Verzeichnis der FTP/HTTP-URL,
welche auf den originalen Tarball zeigt, in der Variable
MASTER_SITES. Bitte vergessen Sie
niemals den Schrägstrich (/)
am Ende!Die make-Makros werden versuchen,
diese Festlegung für die Aufbereitung der
Distributionsdateien mittels FETCH zu
benutzen, falls sie diese nicht schon auf dem System
finden.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.Falls der originale Tarball Teil eines populären
Archivs ist, wie X-contrib, GNU oder Perl CPAN, können
Sie möglicherweise auf diese Seiten in einer einfachen
und kompakten Form mittels
MASTER_SITE_*
(d.h., MASTER_SITE_XCONTRIB,
MASTER_SITE_GNU und
MASTER_SITE_PERL_CPAN) referenzieren.
Setzen Sie einfach MASTER_SITES auf eine
dieser Variablen und MASTER_SITE_SUBDIR
auf den Pfad innerhalb des Archivs. Hier ist ein
Beispiel:MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applicationsDiese Variablen werden in
/usr/ports/Mk/bsd.sites.mk 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.Der Nutzer kann ebenfalls die Variable
MASTER_SITE_* in der
/etc/make.conf setzen. Dadurch werden
unsere Vorgaben überschrieben und stattdessen werden
die Spiegel-Server seiner Wahl für die populären
Archive genutzt.EXTRACT_SUFXFalls Sie eine Distributionsdatei haben, die ein
eigentümliches Suffix nutzt, um die Art der
Kompression anzuzeigen, dann setzen Sie
EXTRACT_SUFX.Ist die Distributionsdatei zum Beispiel im Stil von
foo.tgz anstatt des normalen
foo.tar.gz benannt, würden Sie
schreiben:DISTNAME= foo
EXTRACT_SUFX= .tgzFalls erforderlich, setzen die Variablen
USE_BZIP2 und USE_ZIP
automatisch EXTRACT_SUFX auf
.tar.bz2 oder .zip.
Falls keine der beiden gesetzt ist, dann verwendet
EXTRACT_SUFX die Vorgabe
.tar.gz.Sie müssen niemals beide Variablen
EXTRACT_SUFX und
DISTFILES setzen.DISTFILESManchmal haben die zu ladenden Dateien keinerlei
Ähnlichkeit mit dem Namen des Ports. Es könnte
z.B. source.tar.gz oder ähnlich
heißen. In anderen Fällen könnte der
Quelltext in mehreren Archiven sein und alle müssen
heruntergeladen werden.Falls dies der Fall ist, setzen Sie
DISTFILES als eine durch Leerzeichen
getrennte Liste aller Dateien, die geladen werden
müssen.DISTFILES= source1.tar.gz source2.tar.gzWenn nicht ausdrücklich gesetzt, verwendet
DISTFILES als Vorgabe
${DISTNAME}${EXTRACT_SUFX}.EXTRACT_ONLYFalls nur einige der DISTFILES
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
EXTRACT_ONLY auf.DISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gzFalls keine der
DISTFILES unkomprimiert sein sollte,
dann setzen Sie EXTRACT_ONLY auf einen
leeren String.EXTRACT_ONLY=PATCHFILESFalls Ihr Port zusätzliche Patches benötigt,
welche per FTP oder HTTP verfügbar sind, dann setzen
Sie PATCHFILES auf den Namen der Dateien
und PATCH_SITES auf die URL des
Verzeichnisses, das diese Patches enthält (das Format
ist das gleiche wie MASTER_SITES).Falls ein Patch wegen einiger zusätzlicher
Pfadnamen nicht relativ zum Anfang des Quelltextbaumes
(d.h., WRKSRC) liegt, dann setzen Sie
bitte PATCH_DIST_STRIP entsprechend.
Wenn z.B. alle Pfadnamen in diesem Patch ein
zusätzliches foozolix-1.0/ vor ihren
Dateinamen aufweisen, dann setzen Sie bitte
PATCH_DIST_STRIP=-p1.Kümmern Sie sich nicht darum, ob die Patches
komprimiert sind. Sie werden automatisch dekomprimiert,
wenn die Dateinamen auf .gz oder
.Z enden.Falls der Patch zusammen mit anderen Dateien in einem
gezippten Tarball verteilt wird (z.B. mit Dokumentation),
dann können Sie nicht PATCHFILES
verwenden. In diesem Fall fügen Sie den Namen und den
Ort dieses Tarballs zu DISTFILES und
MASTER_SITES. Benutzen Sie dann die
EXTRA_PATCHES-Variable, um auf diese
Dateien zu zeigen und bsd.port.mk
wird automatisch diese Dateien nutzen. Kopieren Sie
niemals Patch-Dateien in das
PATCHDIR-Verzeichnis, weil es
möglicherweise nicht beschreibbar ist.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 pre-clean zu
entfernen.Verschiedene Distributionsdateien oder Patches von
verschiedenen Seiten und Verzeichnissen
(MASTER_SITES:n)(Betrachten Sie es als in irgendeiner Form
fortgeschrittenes Thema.
Neulinge sollten möglicherweise diesen Abschnitt
beim ersten Lesen überspringen).Dieser Abschnitt stellt Informationen über
die Mechanismen zum Herunterladen von Dateien zur
Verfügung und behandelt die Variablen
MASTER_SITES:n und
MASTER_SITES_NN.
Wir beziehen uns im weiteren Text auf diese Variablen
als MASTER_SITES:n.Etwas Hintergrundinformation zu Beginn: OpenBSD
verfügt über eine sehr elegante Option
innerhalb der Variablen DISTFILES und
PATCHFILES. Sowohl Dateien als auch
Patches können mit angehängten
:n-Bezeichnern versehen werden wobei
n in beiden Fällen
[0-9] sein kann und eine
Gruppenzugehörigkeit anzeigt. Ein Beispiel
hierfür ist:DISTFILES= alpha:0 beta:1In OpenBSD wird die Datei alpha
mit der Variable MASTER_SITES0
verknüpft anstatt dem in FreeBSD gebräuchlichen
MASTER_SITES und
beta mit
MASTER_SITES1.Das ist eine sehr interessante Möglichkeit,
die endlose Suche nach der richtigen Download-Seite zu
verkürzen.Stellen Sie sich zwei Dateien in
DISTFILES und 20 Webseiten in der
Variable MASTER_SITES vor. Alle Seiten
sind erschreckend langsam, beta
findet sich auf allen Seiten in
MASTER_SITES und
alpha 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!Übertragen Sie diesen Umstand auf noch mehr
DISTFILES und mehr
MASTER_SITES. Ganz sicher würde
unser distfiles survey master die
Erleichterung sehr zu schätzen wissen, die eine
solche Verringerung der Netzwerkbelastung bringen
würde.In den nächsten Abschnitten sehen Sie die
Implementierung dieser Idee durch FreeBSD. Dabei wurde das
Konzept von OpenBSD ein wenig verbessert.Prinzipielle InformationDieser 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
MASTER_SITES:n. Das ist für die
meisten Szenarien ausreichend. Falls Sie weitere
Informationen benötigen, sollten Sie den
nächsten Abschnitt lesen.Einige Programme bestehen aus mehreren Dateien,
welche von verschiedenen Webseiten heruntergeladen werden
müssen. Zum Beispiel besteht
Ghostscript 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.Um das zu unterstützen, muss jeder Eintrag in
DISTFILES mit einem Komma und
einem tag name abgeschlossen werden.
Jeder in MASTER_SITES aufgeführte
Webseite folgt ein Komma und eine Marke (tag), die
anzeigt, welche Datei von dieser Webseite heruntergeladen
werden kann.Stellen Sie sich bitte eine Applikation vor, deren
Quelltext in zwei Teile aufgeteilt ist,
source1.tar.gz
und source2.tar.gz, welche von zwei
verschiedenen Webseiten heruntergeladen werden
müssen. Das Makefile des Port
würde Zeilen enthalten wie in
.Vereinfachtes Beispiel für den Gebrauch von
MASTER_SITES:n mit einer Datei pro
WebseiteMASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2Verschiedene Dateien können die gleiche Marke
aufweisen. Ausgehend vom vorherigen Beispiel nehmen wir
an, dass es noch eine dritte Datei gibt
(source3.tar.gz), welche von
ftp.example2.com heruntergeladen werden
soll. Das Makefile würde dann
aussehen wie .Vereinfachtes Beispiel für den Gebrauch von
MASTER_SITES:n mit mehr als einer
Datei pro WebseiteMASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2Ausführliche InformationIn 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
(MASTER_SITES:n) funktioniert
und wie Sie Ihre Ports modifizieren, um ihn zu
nutzen.Elemente können nachstehend bezeichnet werden
mit :n
wobei n in diesem Falle
[^:,]+ ist. Das heißt
n könnte theoretisch
jede alphanumerische Zeichenkette sein, aber wir
beschränken sie auf
[a-zA-Z_][0-9a-zA-Z_]+ für
diesen Moment.Zudem ist die Zeichenkette case sensitive; d.h.
n unterscheidet sich von
N.Allerdings dürfen die folgenden Wörter
nicht gebraucht werden, da sie spezielle Bedeutungen
haben: default,
all und ALL
(diese Wörter werden intern genutzt in Punkt
).
Ausserdem ist DEFAULT ein
reserviertes Wort (beachten Sie ).Elemente mit angehängtem
:n gehören zur Gruppe
n, :m
gehört zur Gruppe m
und so weiter.Elemente ohne Anhängsel sind gruppenlos,
d.h. sie gehören alle zu der speziellen Gruppe
DEFAULT. Falls sie an irgendeinem
Element DEFAULT hängen, ist
dies überflüssig, es sei denn Sie wollen,
dass ein Element sowohl zu DEFAULT
als auch anderen Gruppen gleichzeitig gehört
(beachten Sie ).Die folgenden Beispiele sind gleichwertig, aber
das erste Beispiel ist vorzuziehen:MASTER_SITES= alpha
MASTER_SITES= alpha:DEFAULTGruppen 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.Wenn Sie wollen, dass ein Element gleichzeitig zu
mehreren Gruppen gehört, dann können Sie
diese durch ein Komma (,)
trennen.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 :m,n,o ein Element,
welches zu den Gruppen m,
n und o
gehört.Alle folgenden Beispiele sind gleichwertig,
aber das erste Beispiel ist vorzuziehen:MASTER_SITES= alpha alpha:SOME_SITE
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
MASTER_SITES= alpha:SOME_SITE,DEFAULT
MASTER_SITES= alpha:DEFAULT,SOME_SITEAlle Webseiten in einer Gruppe werden
gemäß MASTER_SORT_AWK
sortiert. Alle Gruppen innerhalb von
MASTER_SITES und
PATCH_SITES werden genauso
sortiert.Gruppensemantik kann benutzt werden in den
folgenden Variablen: MASTER_SITES,
PATCH_SITES,
MASTER_SITE_SUBDIR,
PATCH_SITE_SUBDIR,
DISTFILES und
PATCHFILES entsprechend der
folgenden Syntax:Elemente mit MASTER_SITES,
PATCH_SITES,
MASTER_SITE_SUBDIR und
PATCH_SITE_SUBDIR müssen
mit einem Schrägstrich beendet werden (
/). Falls Elemente zu
irgendwelchen Gruppen gehören, muss
:n
direkt nach dem Trenner /
stehen. Der
MASTER_SITES:n-Mechanismus
verlässt sich auf das Vorhandensein des
Trennzeichens /, um verwirrende
Elemente zu vermeiden in denen
:n ein zulässiger
Bestandteil des Elementes ist und das Auftreten
von :n die Gruppe
n anzeigt. Aus
Kompatibilitätsgründen (da der
/-Trenner sowohl in
MASTER_SITE_SUBDIR als auch
PATCH_SITE_SUBDIR-Elementen
nicht erforderlich ist) wird, falls das auf das
Anhängsel folgende nächste Zeichen kein
/ ist, auch
:n als gültiger Teil des
Elementes behandelt anstatt als Gruppenzusatz,
selbst wenn ein Element ein angehängtes
:n aufweist. Beachten Sie
sowohl
als auch .Ausführliches Beispiel von
MASTER_SITES:n in
MASTER_SITE_SUBDIRMASTER_SITE_SUBDIR= old:n new/:NEWVerzeichnisse innerhalb der Gruppe
DEFAULT ->
old:nVerzeichnisse innerhalb der Gruppe
NEW -> newAusführliches Beispiel von
MASTER_SITES:n mit
Komma-Operator, mehreren Dateien, mehreren
Webseiten und mehreren
UnterverzeichnissenMASTER_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 \
directoryDas vorstehende Beispiel führt zu
einem fein granulierten Herunterladen.
Die Webseiten werden in der exakten Reihenfolge
ihrer Nutzung aufgelistet.file1 wird
heruntergeladen vonMASTER_SITE_OVERRIDEhttp://site1/directory-trial:1/http://site1/directory-one/http://site1/directory/http://site2/http://site7/MASTER_SITE_BACKUPfile2 wird genauso
heruntergeladen wie
file1, da sie zur
gleichen Gruppe gehörenMASTER_SITE_OVERRIDEhttp://site1/directory-trial:1/http://site1/directory-one/http://site1/directory/http://site2/http://site7/MASTER_SITE_BACKUPfile3 wird
heruntergeladen vonMASTER_SITE_OVERRIDEhttp://site3/MASTER_SITE_BACKUPfile4 wird
heruntergeladen vonMASTER_SITE_OVERRIDEhttp://site4/http://site5/http://site6/http://site7/http://site8/directory-one/MASTER_SITE_BACKUPfile5 wird
heruntergeladen vonMASTER_SITE_OVERRIDEMASTER_SITE_BACKUPfile6 wird
heruntergeladen vonMASTER_SITE_OVERRIDEhttp://site8/MASTER_SITE_BACKUPWie gruppiere ich eine der speziellen Variablen
aus bsd.sites.mk, d.h.
MASTER_SITE_SOURCEFORGE?Lesen Sie .Ausführliches Beispiel von
MASTER_SITES:n mit
MASTER_SITE_SOURCEFORGEMASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforgesomething.tar.gz wird von
allen Webseiten innerhalb von
MASTER_SITE_SOURCEFORGE
heruntergeladen.Wie nutze ich dies mit
PATCH*-Variablen.In allen Beispielen wurden
MASTER*-Variablen genutzt,
aber sie funktionieren exakt genauso mit
PATCH*-Variablen, wie Sie an
.
sehen können.Vereinfachte Nutzung von
MASTER_SITES:n mit
PATCH_SITES.PATCH_SITES= http://site1/ http://site2/:test
PATCHFILES= patch1:testWas ändert sich für die Ports?
Was ändert sich nicht?Alle bestehenden Ports bleiben gleich. Der Code
für MASTER_SITES:n wird nur
aktiviert, falls es Elemente mit angehängtem
:n
entsprechend den zuvor erwähnten Syntax-Regeln
wie in
gezeigt gibt.Das Target des Port bleibt gleich:
checksum,
makesum,
patch,
configure,
build etc.
Mit der offensichtlichen Ausnahme von
do-fetch,
fetch-list,
master-sites
und patch-sites.do-fetch: nutzt die
neue Gruppierung DISTFILES und
PATCHFILES mit ihren darauf
zutreffenden Gruppenelementen in
MASTER_SITES und
PATCH_SITES welche zutreffende
Gruppenelemente sowohl in
MASTER_SITE_SUBDIR als auch
PATCH_SITE_SUBDIR aufweisen.
Sehen Sie hierzu .fetch-list: arbeitet
wie das alte fetch-list
mit der Ausnahme, dass es nur wie
do-fetch
gruppiert.master-sites
und patch-sites:
(inkompatibel zu älteren Versionen) geben
nur die Elemente der Gruppe
DEFAULT zurück.
Beziehungsweise sie führen genau genommen
die Targets von
master-sites-default und
patch-sites-default
aus.Weiterhin ist der Gebrauch des Target entweder
von master-sites-all oder
patch-sites-all der
direkten Überprüfung von
MASTER_SITES oder
PATCH_SITES vorzuziehen.
Zudem ist nicht garantiert, dass das direkte
Überprüfen in zukünftigen Versionen
funktionieren wird. Sehen Sie
für weitere Informationen zu diesen neuen
Port-Targets.Neue Port-TargetsEs gibt
master-sites-n
und
patch-sites-n-Targets,
welche die Elemente der jeweiligen Gruppe
n innerhalb von
MASTER_SITES und
PATCH_SITES auflisten.
Beispielweise werden sowohl
master-sites-DEFAULT als
auch patch-sites-DEFAULT
die Elemente der Gruppe
DEFAULT,
master-sites-test und
patch-sites-test der
Gruppe test usw.
zurückgeben.Es gibt das neue Target
master-sites-all und
patch-sites-all,
welche die Arbeit der alten Targets
master-sites und
patch-sites
ü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
MASTER_SITE_BACKUP und
MASTER_SITE_OVERRIDE auflisten
wie Gruppen mittels
DISTFILES oder
PATCHFILES definiert sind.
Das gleiche gilt entsprechend für
master-sites-all und
patch-sites-all.DIST_SUBDIRVerhindern Sie, dass Ihr Port das Verzeichnis
/usr/ports/distfiles 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.Makefile), dann setzen Sie die
Variable DIST_SUBDIR auf den Namen des
Ports (${PORTNAME} oder
${PKGNAMEPREFIX}${PORTNAME}
sollte hervorragend funktionieren). Dies wird
DISTDIR von der Vorgabe
/usr/ports/distfiles auf
/usr/ports/distfiles/DIST_SUBDIR ändern und stellt tatsächlich alle
für Ihren Port benötigten Dateien in dieses
Unterverzeichnis.Es wird zusätzlich nach dem Unterverzeichnis mit
dem gleichen Namen auf der Sicherung der Hauptseite auf
ftp.FreeBSD.org suchen (das
ausdrückliche Setzen von DISTDIR
in Ihrem Makefile wird dies nicht
gewährleisten, also nutzen Sie bitte
DIST_SUBDIR).Dies hat keine Auswirkungen auf die Variable
MASTER_SITES, die Sie in Ihrem
Makefile definieren.ALWAYS_KEEP_DISTFILESFalls 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 ALWAYS_KEEP_DISTFILES den
&os; Build Cluster anweisen eine Kopie der Dateien in
DISTFILES vorzuhalten. Nutzer dieser
Ports benötigen generell diese Dateien nicht, daher
ist es ein gutes Konzept, nur dann die Distfiles zu
DISTFILES hinzuzufügen, wenn
PACKAGE_BUILDING definiert ist.Nutzung von
ALWAYS_KEEP_DISTFILES..if defined(PACKAGE_BUILDING)
DISTFILES+= foo.tar.gz
ALWAYS_KEEP_DISTFILES= yes
.endifWenn Sie zusätzliche Dateien zu
DISTFILES hinzufügen,
dann beachten Sie bitte, dass Sie diese auch in
distinfo aufführen.
Zudem werden die zusätzlichen Dateien normalerweise
ebenso in WRKDIR extrahiert,
was für einige Ports zu unbeabsichtigten
Seiteneffekten führen mag und spezielle
Behandlung erfordert.MAINTAINERFügen Sie hier Ihre E-Mailadresse ein. Bitte.
:-)Beachten Sie bitte, dass nur eine einzelne E-Mailadresse
ohne Kommentar in der Variable MAINTAINER
zulässig ist. Das Format sollte
user@hostname.domain sein.
Bitte fügen Sie keinen beschreibenden Text wie z.B. Ihren
wirklichen Namen ein, dies verwirrt lediglich
bsd.port.mk.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
Die Herausforderung für einen
Port-Maintainer.Ä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!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.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.COMMENTDies ist eine einzeilige Beschreibung des Ports.
Bitte fügen Sie nicht den Paketnamen
(oder die Version der Software) in den Kommentar ein.
Der Kommentar soll mit einem Großbuchstaben beginnen
- und mit einem Punkt enden. Hier ist ein Beispiel:
+ und ohne Punkt enden. Hier ist ein Beispiel:
COMMENT= A cat chasing a mouse all over the screenDie COMMENT-Variable soll unmittelbar nach der
MAINTAINER-Variable im Makefile
stehen.Bitte versuchen Sie die COMMENT-Zeile auf weniger als 70
Zeichen zu begrenzen, da sie den Nutzern als einzeilige
Zusammenfassung des Ports angezeigt wird.Abhängigkeiten (dependencies)Viele Ports hängen von anderen Ports ab.
Es gibt sieben Variablen, welche Sie benutzen 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.LIB_DEPENDSDiese Variable spezifiziert die Shared-Libraries,
von denen der Port abhängt. Es ist eine Liste von
lib:dir:target-Tupeln
wobei lib den Name der gemeinsam
genutzten Bibliothek, dir das
Verzeichnis, in welchem sie zu finden ist, falls nicht
verfügbar, und target das
Target in diesem Verzeichnis angeben. Zum Beispiel wird
LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg
auf eine jpeg-Bibliothek mit der Hauptversionsnummer 9
prüfen, in das
graphics/jpeg-Unterverzeichnis Ihrer
Ports-Sammlung wechseln, es bauen und installieren, falls
es nicht gefunden wird.
Der target-Teil kann weggelassen
werden, falls er identisch mit
DEPENDS_TARGET ist (Vorgabe hierfür
ist install).Der lib-Teil ist ein
regulärer Ausdruck, welcher die Ausgabe von
ldconfig -r ausgewertet. Werte wie
intl.[5-7] und intl
sind zulässig. Das erste Muster,
intl.[5-7], stimmt überein mit:
intl.5, intl.6 oder
intl.7. Das zweite Muster,
intl, stimmt überein mit jeder
Version der intl-Bibliothek.Die Abhängigkeit wird zwei Mal überprüft,
einmal innerhalb des extract-Target
und dann innerhalb des
install-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.RUN_DEPENDSDiese Variable legt Binärdateien oder Dateien,
von denen der Port abhängt, für die Laufzeit fest.
Es ist eine Liste von
path:dir:target-Tupeln,
wobei path der Name der
Binärdatei oder Datei, dir
das Verzeichnis, in welchem sie gefunden werden kann, falls
nicht vorhanden, und target das
Target in diesem Verzeichnis angeben.
Falls path mit einem Slash
(/) beginnt, wird es als Datei behandelt
und deren Vorhandensein wird mit test -e;
überprüft. Andernfalls wird angenommen, dass es
eine Binärdatei ist und which -s
wird benutzt, um zu überprüfen, ob das Programm im
Pfad vorhanden ist.Zum Beispiel wirdRUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgrüberprüfen, ob die Datei oder das Verzeichnis
/usr/local/etc/innd existiert und es
erstellen und installieren aus dem
news/inn-Unterverzeichnis der
Ports-Sammlung, falls es nicht gefunden wird. Es wird zudem
überprüft, ob die Binärdatei namens
xmlcatmgr im Suchpfad vorhanden ist und
danach zum Unterverzeichnis
textproc/xmlcatmgr in Ihrer
Ports-Sammlung wechseln, es bauen und installieren,
falls es nicht gefunden wird.In diesem Fall ist innd 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.Der offizielle Suchpfad PATH,
welcher im Ports Cluster benutzt wird, ist/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/binDie Abhängigkeit wird innerhalb des
install-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 target-Teil kann
weggelassen werden, wenn er der gleiche ist wie in der
Variable DEPENDS_TARGET.BUILD_DEPENDSDiese Variable legt Binärdateien oder Dateien fest,
die dieser Port zur Erstellung benötigt. Wie
RUN_DEPENDS ist es eine Liste von
path:dir:target-Tupeln.
Zum Beispiel wird
BUILD_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip
überprüfen, ob eine Binärdatei
unzip vorhanden ist und in das
Unterverzeichnis archivers/unzip
Ihrer Ports-Sammlung wechseln und sie erstellen und
installieren, falls sie nicht gefunden wird.Erstellen bedeutet hier alles von der
Extraktion bis zur Kompilierung. Die Abhängigkeit
wird im extract-Target
überprüft.
Der target-Teil kann
weggelassen werden, falls er identisch mit der Variable
DEPENDS_TARGET ist.FETCH_DEPENDSDiese 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
path:dir:target-Tupeln.
Zum Beispiel wird
FETCH_DEPENDS=
ncftp2:${PORTSDIR}/net/ncftp2
überprüfen, ob eine Binärdatei namens
ncftp2 vorhanden ist, in das
Unterverzeichnis net/ncftp2 Ihrer
Ports-Sammlung wechseln, sie erstellen und installieren,
falls sie nicht gefunden wird.Die Abhängigkeit wird innerhalb des
fetch-Target überprüft.
Der target-Teil kann weggelassen
werden, falls er identisch mit der Variable
DEPENDS_TARGET ist.EXTRACT_DEPENDSDiese 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
path:dir:target-Tupeln.
Zum Beispiel wird
EXTRACT_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip
überprüfen, ob eine Binärdatei namens
unzip vorhanden ist, in das
Unterverzeichnis archivers/unzip
Ihrer Ports-Sammlung wechseln, sie erstellen und
installieren, falls sie nicht gefunden wird.Die Abhängigkeit wird innerhalb des
extract-Target überprüft.
Der target-Teil kann weggelassen
werden, falls er identisch mit der Variable
DEPENDS_TARGET ist.Nutzen Sie diese Variable nur, wenn die Extraktion
nicht funktioniert (die Vorgabe nimmt
gzip an) und nicht mit
USE_ZIP oder
USE_BZIP2 wie in beschrieben zum Laufen gebracht
werden kann.PATCH_DEPENDSDiese 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
path:dir:target-Tupeln.
Zum Beispiel wird
PATCH_DEPENDS=
${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
in das Unterverzeichnis java/jfc Ihrer
Ports-Sammlung wechseln, um es zu entpacken.Die Abhängigkeit wird innerhalb des
patch-Target überprüft.
Der target-Teil kann entfallen,
falls er identisch mit der Variable
DEPENDS_TARGET ist.USE_*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 Makefile
eines Ports zu erhöhen. Jede von ihnen ist im Stil von
USE_*.
Der Gebrauch dieser Variablen ist beschränkt auf das
Makefile eines Ports und
ports/Mk/bsd.*.mk. Es ist nicht
entworfen worden, um durch den Nutzer setzbare Optionen
einzukapseln; benutzen Sie
WITH_* und
WITHOUT_*
für diese Zwecke.Es ist immer falsch, irgendeine
USE_*-Variable
in der /etc/make.conf zu setzen.
Zum Beispiel würde das Setzen von
USE_GCC=3.2
eine Abhängigkeit für GCC32 für jeden Port
einschliesslich GCC32 selbst hinzufügen!
Die
USE_*-Varibalen
VariableBedeutungUSE_BZIP2Der Tarball dieses Ports wird mit
bzip2 komprimiert.USE_ZIPDer Tarball des Ports wird mit
zip komprimiert.USE_BISONDer Port benutzt bison
für die Erstellung.USE_CDRTOOLSDer Port erfordert
cdrecord entweder von
sysutils/cdrtools
oder sysutils/cdrtools-cjk,
abhängig davon, was der Nutzer vorgibt.
USE_GCCDieser Port benötigt eine bestimmte
Version von gcc zur Erstellung.
Die genaue Version kann festgelegt werden mit
Werten wie 3.2.
Mit 3.2+ kann die mindestens
erforderliche Version spezifiziert werden.
Der gcc aus
dem Basissystem wird genutzt, wenn er die
erforderliche Version erfüllt, andernfalls wird
eine geeignete Version des gcc
aus den Ports kompiliert und die Variablen
CC und CXX
werden angepasst.
Variablen zugehörig zu
gmake und dem
configure-Skript werden in
beschrieben, währenddessen
autoconf,
automake und
libtool in
beschrieben sind.
Perl-spezifische Variablen
werden in behandelt.
X11-Variablen sind aufgelistet in
.
behandelt GNOME-bezogene Variablen und KDE-bezogene Variablen.
dokumentiert Java-Variablen,
während Informationen zu
Apache,
PHP und PEAR-Modulen
enthält.
Python wird in
und
Ruby in
erörtert.
stellt Variablen für
SDL-Programme zur Verfügung
und enthält schliesslich
Variablen für Xfce.Minimale Version einer AbhängigkeitEine minimale Version einer Abhängigkeit kann in
jeder *_DEPENDS-Variable festgelegt
werden mit Ausnahme von LIB_DEPENDS
durch Anwendung folgender Syntax:p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-SpiffyDas 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.Anmerkungen zu AbhängigkeitenWie vorstehend beschrieben ist das Vorgabe-Target
DEPENDS_TARGET, wenn eine
Abhängigkeit benötigt wird.
Die Vorgabe hierfür ist install.
Dies ist eine Nutzer-Variable; sie wird niemals im
Makefile eines Ports definiert.
Falls Ihr Port einen besonderen Weg benötigt,
um mit einer Abhängigkeit umzugehen, dann benutzen
Sie bitte den :target-Teil der
*_DEPENDS-Variablen, anstatt
DEPENDS_TARGET zu ändern.Falls Sie make clean schreiben,
werden dessen Abhängigkeiten auch gesäubert.
Falls Sie dies nicht wollen, definieren Sie die Variable
NOCLEANDEPENDS 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.Um von einem anderen Port bedingungslos abhängig
zu sein, benutzen Sie bitte die Variable
${NONEXISTENT} als erstes Feld von
BUILD_DEPENDS oder
RUN_DEPENDS. 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
BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
immer zum jpeg-Port wechseln und ihn
extrahieren.Zirkuläre Abhängigkeiten sind fatalFühren Sie niemals irgendwelche zirkulären
Abhängigkeiten in der Ports-Sammlung ein!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:
cd /usr/ports; make index.
Dieser Prozess kann auf alten Maschinen sehr langsam sein,
aber Sie ersparen sich und einer Vielzahl von Menschen
möglicherweise eine Menge Ärger.MASTERDIRFalls 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
Makefile in allen ausser einem
Unterverzeichnis, wenn Sie Variablen intelligent nutzen.
In diesem einzigen Makefile können
Sie MASTERDIR verwenden, um anzugeben,
wo der Rest der Dateien liegt. Benutzen Sie bitte auch eine
Variable für
PKGNAMESUFFIX, damit die Pakete
unterschiedliche Namen haben werden.Wir demonstrieren dies am Besten an einem Beispiel. Es ist
Teil von
japanese/xdvi300/Makefile;PORTNAME= xdvi
PORTVERSION= 17
PKGNAMEPREFIX= ja-
PKGNAMESUFFIX= ${RESOLUTION}
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endifjapanese/xdvi300
verfügt ebenfalls über alle Patches, Paket-Dateien
usw. Wenn Sie make eintippen, wird der Port
die Standardvorgabe für die Auflösung nehmen (300)
und den Port ganz normal erstellen.Genauso wie für alle anderen Auflösungen ist
dies das vollständigexdvi118/Makefile:RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include "${MASTERDIR}/Makefile"(xdvi240/Makefile und
xdvi400/Makefile sind ähnlich).
Die MASTERDIR-Definition teilt dem
bsd.port.mk mit, dass die normalen
Unterverzeichnisse wie FILESDIR und
SCRIPTDIR unter
xdvi300 gefunden werden können.
Die RESOLUTION=118-Zeile wird die
RESOLUTION=300-Zeile in
xdvi300/Makefile überschreiben
und der Port wird mit einer Auflösung von 118
erstellt.ManualpagesDie Variablen MAN[1-9LN]
werden automatisch jede Manualpage zur
pkg-plist hinzufügen
(dies bedeutet, dass Sie Manualpages
nicht in der
pkg-plist auflisten dürfen,
lesen Sie bitte Erstellung
der PLIST für weitere Details).
Sie veranlassen zudem den Installationsabschnitt
dazu, die Manualpages zu Komprimieren oder zu Dekomprimieren
abhängig vom gesetzten Wert der Variable
NOMANCOMPRESS in
/etc/make.conf.Falls Ihr Port versucht verschiedene Namen für
Manualpages unter Zuhilfenahme von Symlinks oder Hardlinks
zu installieren, müssen Sie die Variable
MLINKS nutzen, um diese zu identifizieren.
Der von Ihrem Port installierte Link wird von
bsd.port.mk gelöscht und wieder
eingefügt, um sicherzustellen, dass er auf die korrekte
Datei zeigt. Jede Manualpage, welche in
MLINKS aufgeführt ist, darf nicht in
der pkg-plist aufgenommen werden.Falls die Manualpages während der Installation
komprimiert werden sollen, müssen Sie die Variable
MANCOMPRESSED setzen. Diese Variable kann
drei Werte annehmen, yes,
no und maybe.
yes bedeutet, dass Manualpages bereits
komprimiert installiert sind, bei no sind
sie es nicht und maybe bedeutet, dass die
Software bereits den Wert von NOMANCOMPRESS
beachtet, damit bsd.port.mk nichts
Besonderes auszuführen hat.MANCOMPRESSED wird automatisch auf
yes gesetzt, wenn
USE_IMAKE vorgegeben ist und gleichzeitig
NO_INSTALL_MANPAGES nicht. Im umgekehrten
Falle ist MANCOMPRESSED auf
no gesetzt.
Sie müssen es nicht explizit angeben, außer die
Standardvorgabe ist für Ihren Port nicht passend.Wenn Ihr Port den man tree irgendwo anders als in der
Variable MANPREFIX verankert, können
Sie ihn mit MANPREFIX bestimmen.
Sollten zudem Manualpages nur in bestimmten Abschnitten an
einem nicht-standardkonformen Platz liegen, wie z.B. bestimmte
Perl-Modul-Ports,
dann können Sie mittels der Variable
MANsectPREFIX
(wobei sect ein Wert aus
1-9, L oder
N ist) individuelle Pfade zu den
Manualpages festlegen.Wenn Ihre Manualpages in sprachspezifische
Unterverzeichnisse installiert werden, dann bestimmen Sie
bitte den Namen der Sprache mit der Variable
MANLANG. Der Wert dieser Variable ist
mit "" vorgegeben (das bedeutet nur
Englisch).Hier ist ein Beispiel, welches alles zusammenfasst.MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MLINKS= foo.1 alt-name.8
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yesDies zeigt an, dass sechs Dateien von diesem Port
installiert werden;${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${MANPREFIX}/man/man8/alt-name.8.gz
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.Falls nur manche Manualpages übersetzt sind,
können Sie einige dynamisch vom
MANLANG-Inhalt erzeugte Variablen
nutzen:MANLANG= "" de ja
MAN1= foo.1
MAN1_EN= bar.1
MAN3_DE= baz.3Dies führt zu folgender Liste von Dateien:${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.gzInfo-DateienFalls Ihr Paket GNU-Info-Dateien installiert, sollten
diese in der INFO-Variablen augelistet sein
(ohne das angehängte .info) mit einem
Eintrag für jedes Dokument. Von diesen Dateien wird
angenommen, dass sie nach
PREFIX/INFO_PATH
installiert werden. Sie können
INFO_PATH ändern, falls Ihr Paket
einen anderen Ort vorsieht. Jedoch wird dies nicht empfohlen.
Die Einträge enthalten nur den relativen Pfad zu
PREFIX/INFO_PATH.
Zum Beispiel installiert lang/gcc33 Info-Dateien nach
PREFIX/INFO_PATH/gcc33,
wobei INFO etwa so aussieht:
INFO= gcc33/cpp gcc33/cppinternals gcc33/g77 ...
Entsprechende Installations-/Deinstalltions-Codes werden vor
der Paket-Registrierung automatisch der vorläufigen
pkg-plist hinzugefügt.Makefile-OptionenEinige 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.KNOBS (Einstellungen)WITH_*
und
WITHOUT_*Diese Variablen sind entworfen worden, um vom
System-Administrator gesetzt zu werden. Es gibt viele,
die in ports/KNOBS
standardisiert sind.Benennen Sie Schalter bei der Erstellung eines Ports
nicht programmspezifisch. Verwenden Sie zum Beispiel im
Avahi-Port WITHOUT_MDNS anstelle von
WITHOUT_AVAHI_MDNS.Sie sollten nicht annehmen, dass ein
WITH_*
notwendigerweise eine korrespondierende
WITHOUT_*-Variable
hat oder umgekehrt. Im Allgemeinen wird diese
Vorgabe einfach unterstellt.Falls nicht anderweitig festgelegt, werden diese
Variablen nur dahingehend überprüft, ob sie
gesetzt sind oder nicht – nicht darauf,
ob sie auf bestimmte Werte wie YES
oder NO gesetzt sind.
Häufige
WITH_*
und
WITHOUT_*-Variablen
VariableBedeutungWITHOUT_NLSFalls gesetzt, bedeutet sie, dass eine
Internationalisierung nicht benötigt wird,
was Kompilierzeit sparen kann. Als Vorgabe
wird Internationalisierung gebraucht.WITH_OPENSSL_BASENutze die Version von OpenSSL aus dem
Basissystem.WITH_OPENSSL_PORTInstalliert die Version von OpenSSL aus
security/openssl, auch
wenn das Basissystem auf aktuellem Stand
ist.WITHOUT_X11Falls 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.
Benennung von Knobs (Einstellungen)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 KNOBS-Datei
eingesehen werden.Knob-Namen sollten wiederspiegeln, was der Knob
bedeutet und was er bewirkt. Wenn ein Port einen
lib-Präfix im PORTNAME hat,
dann soll das lib-Präfix im Knob-Namen
entfallen.OPTIONSHintergrundDie OPTIONS-Variable gibt dem
Nutzer, der diesen Port installiert, einen Dialog mit
auswählbaren Optionen und speichert diese in
/var/db/ports/portname/options.
Bei der nächsten Neuerstellung des Ports werden
diese Einstellungen wieder verwandt.
Sie werden sich niemals mehr an all die zwanzig
WITH_* und
WITHOUT_*-Optionen
erinnern müssen, die Sie benutzt haben, um diesen
Port zu erstellen!Wenn der Anwender make config
benutzt (oder ein make build das
erste Mal laufen lässt) wird das Framework auf
/var/db/ports/portname/options
die Einstellungen prüfen. Falls die Datei nicht
existiert, werden die Werte von
OPTIONS genutzt, um eine Dialogbox
zu erzeugen, in welcher die Optionen an- oder abgeschaltet
werden können. Dann wird die
options-Datei gespeichert und die
ausgewählten Variablen werden bei der Erstellung
des Ports benutzt.Falls eine neue Version des Ports
OPTIONS hinzufügt, wird der
Dialog mit den gespeicherten Werten dem Nutzer
angezeigt.Benutzen Sie make showconfig,
um die gespeicherte Konfiguration zu betrachten.
Benutzen Sie make rmconfig, um die
gespeicherte Konfiguration zu Löschen.SyntaxDie Syntax für die
OPTIONS-Variable lautet:
OPTIONS= OPTION "descriptive text" default ...
Der Wert als Vorgabe ist entweder ON
oder OFF. Wiederholungen dieser drei
Felder sind erlaubt.OPTIONS-Definitionen
müssen vor der Einbindung von
bsd.port.options.mk erscheinen.
Die WITH_* und
WITHOUT_*-Variablen können
nur nach der Einbindung von
bsd.port.options.mk getestet
werden. bsd.port.pre.mk kann auch
stattdessen eingebunden werden und wird immer noch von
vielen Ports eingebunden, die vor der Einführung von
bsd.port.options.mk erstellt wurden.
Jedoch wirken manche Variablen nicht wie gewohnt nach der
Einbindung von bsd.port.pre.mk,
typischerweise USE_*-Optionen.Einfache Anwendung von
OPTIONSOPTIONS= FOO "Enable option foo" On \
BAR "Support feature bar" Off
.include <bsd.port.options.mk>
.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 <bsd.port.mk>Veraltete Anwendung von
OPTIONSOPTIONS= FOO "Enable option foo" On
.include <bsd.port.pre.mk>
.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+= --without-foo
.else
CONFIGURE_ARGS+= --with-foo
.endif
.include <bsd.port.post.mk>Automatische Aktivierung von FunktionenWenn 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
--without-xxx oder
--disable-xxx in der Variable
CONFIGURE_ARGS einzeln ab.Falsche Behandlung einer Option.if defined(WITH_FOO)
LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+= --enable-foo
.endifStellen 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
make config-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.Korrekte Behandlung einer Option.if defined(WITH_FOO)
LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+= --enable-foo
.else
CONFIGURE_ARGS+= --disable-foo
.endifIm 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.Die Festlegung des ArbeitsverzeichnissesJeder Port wird extrahiert in ein Arbeitsverzeichnis,
welches beschreibbar sein muss. Das Ports-System gibt als
Standard vor, dass die DISTFILES in
einem Verzeichnis namens ${DISTNAME}
entpackt werden. Mit anderen Worten, wenn Sie:PORTNAME= foo
PORTVERSION= 1.0festgelegt haben, dann enthalten die Distributions-Dateien
des Ports ein Verzeichnis auf oberster Ebene,
foo-1.0, und der Rest der Dateien
befindet sich unter diesem Verzeichnis.Es gibt eine Reihe von Variablen, die Sie
überschreiben können, falls dies nicht der Fall
sein sollte.WRKSRCDiese Variable listet den Namen des Verzeichnisses,
welches erstellt wird, wenn die Distfiles der Applikation
extrahiert werden. Wenn unser vorheriges Beispiel in einem
Verzeichnis namens foo (und nicht
foo-1.0) extrahiert wurde,
würden Sie schreiben:WRKSRC= ${WRKDIR}/foooder möglicherweiseWRKSRC= ${WRKDIR}/${PORTNAME}
NO_WRKSUBDIRWenn der Port überhaupt nicht in einem
Unterverzeichnis extrahiert wird, sollten Sie dies mit dem
Setzen von NO_WRKSUBDIR anzeigen.NO_WRKSUBDIR= yesCONFLICTSFalls Ihr Paket nicht mit anderen Paketen koexistieren
kann (wegen Dateikonflikten, Laufzeit-Inkompatibilitäten
usw.), führen Sie bitte die anderen Paketnamen in der
Variable CONFLICTS auf. Sie können
hier Shell-Globs wie * und
? verwenden. Paketnamen sollten in der
gleichen Weise aufgezählt werden, wie sie in
/var/db/pkg auftauchen. Bitte stellen
Sie sicher, dass CONFLICTS nicht mit dem
Paket des Ports selbst übereinstimmt, da ansonsten das
Erzwingen der Installation durch
FORCE_PKG_REGISTER nicht länger
funktionieren wird.CONFLICTS setzt automatisch die
Variable IGNORE, welche
ausführlicher in dokumentiert ist.Beim Entfernen eines von mehreren in Konflikt stehenden
Ports ist es ratsam, die
CONFLICTS-Einträge in den anderen
Ports für einige Monate beizubehalten, um Nutzer zu
unterstützen, die ihre Ports nur sporadisch
aktualisieren.Installation von DateienINSTALL_* macrosNutzen Sie die Makros in
bsd.port.mk, um korrekte
Modi und Eigentümer von Dateien in Ihren
*-install-Targets
sicherzustellen.INSTALL_PROGRAM ist ein Befehl,
um binäre Binärdateien zu installieren.INSTALL_SCRIPT ist ein Befehl,
um ausführbare Skripte zu installieren.INSTALL_KLD ist ein Befehl, mit
dem Kernelmodule installiert werden können. Einige
Architekturen haben Probleme mit stripped-Modulen.
Daher sollten Sie diesen Befehl anstelle von
INSTALL_PROGRAM verwenden.INSTALL_DATA ist ein Befehl,
um gemeinsam nutzbare Daten zu installieren.INSTALL_MAN ist ein Befehl,
um Manualpages oder andere Dokumentation zu
installieren (es wird nichts komprimiert).Das sind grundsätzlich alle
install-Befehle mit
ihren passenden Flags.Zerlegen von BinärdateienZerlegen Sie keine Binärdateien manuell,
wenn Sie es nicht müssen. Alle Binaries sollten
gestripped werden; allerdings vermag das
INSTALL_PROGRAM-Makro gleichzeitig
eine Binärdatei zu installieren und zu strippen
(beachten Sie den nächsten Abschnitt).Wenn Sie eine Datei strippen müssen, aber nicht das
INSTALL_PROGRAM-Makro nutzen wollen, dann
kann ${STRIP_CMD} Ihr Programm strippen.
Dies wird typischerweise innerhalb des
post-install-Targets gemacht.
Zum Beispiel:post-install:
${STRIP_CMD} ${PREFIX}/bin/xdlNutzen 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 not stripped,
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.Installation eines ganzen Verzeichnisbaums
inklusive DateienManchmal muss man eine große Zahl von Dateien
unter Erhalt ihrer hierarchischen Struktur installieren,
d.h. Kopieraktionen über einen ganzen Verzeichnisbaum
von WRKSRC zu einem Zielverzeichnis unter
PREFIX.Für diesen Fall gibt es zwei Makros. Der Vorteil
der Nutzung dieser Makros anstatt cp ist,
dass sie korrekte Besitzer und Berechtigungen auf den
Zieldateien garantieren.
Das erste Makro, COPYTREE_BIN, wird alle
installierten Dateien ausführbar markieren und damit
passend für die Installation in
PREFIX/bin
vorbereiten. Das zweite Makro,
COPYTREE_SHARE, setzt keine
Ausführungsberechtigungen auf Dateien und ist daher
geeignet für die Installation von Dateien im Target von
PREFIX/share.post-install:
${MKDIR} ${EXAMPLESDIR}
(cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})Dieses Beispiel wird den Inhalt des
examples-Verzeichnisses im Distfile
des Drittanbieters in das Beispielverzeichnis Ihres Ports
kopieren.post-install:
${MKDIR} ${DATADIR}/summer
(cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)Und dieses Beispiel wird die Daten der Sommermonate in
das summer-Unterverzeichnis eines
DATADIR
installieren.Zusätzliche find-Argumente
können mit dem dritten Argument an die
COPYTREE_*-Makros übergeben werden.
Um zum Beispiel alle Dateien aus dem 1. Beispiel ohne die
Makefiles zu installieren, kann man folgenden Befehl
benutzen.post-install:
${MKDIR} ${EXAMPLESDIR}
(cd ${WRKSRC}/examples/ && \
${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")Beachten Sie bitte, dass diese Makros die installierten
Dateien nicht zur pkg-plist
hinzufügen, Sie müssen sie immer noch selbst
auflisten.Installation zusätzlicher DokumentationFalls 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
PREFIX/share/doc.
Dies kann wie vorstehend im Target des
post-install geschehen.Legen Sie ein neues Verzeichnis für Ihren Port an.
Das Verzeichnis sollte wiederspiegeln, was der Port ist.
Das bedeutet normalerweise PORTNAME.
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
PKGNAME nutzen.Machen Sie die Installation von der Variablen
NOPORTDOCS abhängig, damit die
Nutzer sie in /etc/make.conf abschalten
können:post-install:
.if !defined(NOPORTDOCS)
${MKDIR} ${DOCSDIR}
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
.endifHier einige praktische Variablen und wie sie
standardmässig bei Verwendung im
Makefile expandiert werden:
DATADIR wird expandiert zu
PREFIX/share/PORTNAME.DATADIR_REL wird expandiert zu
share/PORTNAME.DOCSDIR wird expandiert zu
PREFIX/share/doc/PORTNAME.DOCSDIR_REL wird expandiert zu
share/doc/PORTNAME.EXAMPLESDIR wird expandiert zu
PREFIX/share/examples/PORTNAME.EXAMPLESDIR_REL wird expandiert zu
share/examples/PORTNAME.NOPORTDOCS behandelt nur
zusätzliche Dokumentation, die in
DOCSDIR installiert ist.
Für normale Manualpages und Info-Seiten
wird die Variable benutzt.
Dinge, welche in DATADIR
und EXAMPLESDIR installiert werden,
legen die Variablen NOPORTDATA und
NOPORTEXAMPLES fest.Die Variablen werden nach PLIST_SUB
exportiert. Ihre Werte erscheinen dort als Pfadnamen relativ
zu PREFIX,
falls möglich. Das bedeutet, dass
share/doc/PORTNAME
standardmässig ersetzt wird durch
%%DOCSDIR%% in der Packliste usw.
(mehr zur Ersetzung durch die
pkg-plist finden Sie
hier).Alle installierten Dokumentationsdateien
und –Verzeichnisse
sollten in der pkg-plist dem
%%PORTDOCS%%-Präfix
enthalten sein, zum Beispiel:%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%Alternativ zur Auflistung der Dokumentationsdateien in
der pkg-plist kann in einem Port auch
die Variable PORTDOCS 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 DOCSDIR sein.
Wenn Sie also einen Port haben, welcher
PORTDOCS benutzt, und Sie haben eine vom
Standard abweichenden Platz für seine Dokumentation,
dann müssen Sie die Variable DOCSDIR
entsprechend setzen. Wenn ein Verzeichnis in
PORTDOCS 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 NOPORTDOCS
gesetzt ist, dann werden die Dateien und Verzeichnisse,
die in PORTDOCS 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
PORTDOCS zu installieren. Ein typisches
Beispiel für den Gebrauch von
PORTDOCS sieht wie folgt aus:PORTDOCS= README.* ChangeLog docs/*Die Äquivalente zu PORTDOCS
für unter DATADIR und
EXAMPLESDIR installierte Dateien sind
PORTDATA beziehungsweise
PORTEXAMPLES.Sie können auch pkg-message
benutzen, um Meldungen während der Installation
anzuzeigen. Lesen Sie diesen Abschnitt über den
Gebrauch von pkg-message
für weitere Details.
Die pkg-message-Datei muss nicht zur
pkg-plist hinzugefügt
werden.Unterverzeichnisse mit PREFIXLassen Sie den Port die Dateien in die richtigen
Unterverzeichnisse von PREFIX 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 lib, was natürlich auch nicht
der BSD-Philosophie entspricht und nicht gut funktioniert.
Viele der Dateien sollten in eines der folgenden
Verzeichnisse geschoben werden: etc
(Konfigurationsdateien), libexec
(intern gestartete Binärdateien),
sbin (Binärdateien für
Superuser/Manager), info
(Dokumentation für Info-Browser) oder
share (Architektur-unabhängige
Dateien). Lesen Sie hierzu &man.hier.7;; weitestgehend
greifen die Regeln für /usr auch
für /usr/local. Die Ausnahme sind
Ports, welche mit news aus dem USENET
arbeiten. In diesem Falle sollte
PREFIX/news
als Zielort für die Dateien benutzt werden.BesonderheitenEs gibt einige Dinge mehr, die zu beachten sind,
wenn man einen Port erstellt. Dieser Abschnitt
erklärt die wichtigsten.Shared-LibrariesWenn Ihr Port eine oder mehrere Shared-Libraries
installiert, dann definieren Sie bitte eine
USE_LDCONFIG make-Variable,
die bsd.port.mk anweisen wird,
${LDCONFIG} -m auf das
Verzeichnis, in das die neue Library installiert wird
(normalerweise
PREFIX/lib),
während des
post-install-Targets anzuwenden,
um sie im Shared-Library-Cache zu registrieren.
Diese Variable, wenn definiert, wird auch dafür sorgen,
dass ein entsprechendes
@exec /sbin/ldconfig -m und
@unexec /sbin/ldconfig -R-Paar zu Ihrer
pkg-plist-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.USE_LDCONFIG= yesWenn nötig, können Sie das Standardverzeichnis
außer Kraft setzen, indem Sie den
USE_LDCONFIG Wert auf eine Liste von
Verzeichnissen setzen, in die Shared Libraries installiert
werden sollen. Wenn Ihr Port z.B. diese Bibliotheken nach
PREFIX/lib/foo und
PREFIX/lib/bar
installiert, könnten Sie folgendes in Ihrem
Makefile benutzen:USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/barBitte überprüfen Sie dies genau. Oft ist das
überhaupt nicht nötig oder kann durch
-rpath oder das Setzen von
LD_RUN_PATH während des Linkens umgangen
werden (s. lang/moscow_ml für ein
Beispiel), oder durch einen Shell-Wrapper, der
LD_LIBRARY_PATH setzt, bevor er die
Binärdatei ausführt, wie es www/mozilla tut.Wenn Sie 32-Bit Libraries auf 64-Bit Systemen
installieren, benutzen Sie stattdessen
USE_LDCONFIG32.Versuchen Sie Shared-Library-Versionsnummern im
libfoo.so.0 Format zu halten.
Unser Runtime-Linker kümmert sich nur um die Major
(erste) Nummer.Wenn sich die Major-Library-Versionsnummer
während der Aktualisierung zu einer neuen
Portversion erhöht, sollte auch die
PORTREVISION aller Ports, die die
Shared-Library linken, erhöht werden, damit diese
mit der neuen Version der Bibliothek neu kompiliert
werden.Ports mit beschränkter VerbreitungLizenzen variieren und manche geben Restriktionen vor,
wie die Applikation gepackt werden oder ob sie
gewinnorientiert verkauft werden kann, usw.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;.In solchen Situationen können die in den folgenden
Abschnitten beschriebenen Variablen gesetzt werden.NO_PACKAGEDiese 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.Die DISTFILES 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, NO_CDROM ist ebenfalls
gesetzt.NO_PACKAGE 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
NO_PACKAGE.NO_PACKAGE sollte auf eine
Zeichenkette gesetzt werden, die den Grund beschreibt,
warum kein Paket erzeugt werden soll.NO_CDROMDiese Variable gibt an, dassobwohl wir binäre
Pakete erzeugen dürfen – wir weder
diese Pakete noch die DISTFILES des
Ports auf einer CD-ROM (oder ähnlichen Medien)
verkaufen dürfen. Die DISTFILES
des Ports dürfen allerdings immer noch auf FTP/HTTP
Mirrors.Wenn diese Variable und auch
NO_PACKAGE gesetzt ist, dann werden
nur die DISTFILES des Ports
erhältlich sein – und das nur
mittels FTP/HTTP.NO_CDROM 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
nichtkommerzielle Zwecke gilt.NOFETCHFILESDateien, die in der Variable
NOFETCHFILES aufgelistet sind,
sind von keiner der MASTER_SITES
abrufbar. Ein Beispiel solch einer Datei ist eine selbige,
welche vom Anbieter auf CD-ROM bereitgestellt wird.Werkzeuge, die das Vorhandensein dieser Dateien auf
den MASTER_SITES
überprüfen, sollten diese Dateien
ignorieren und sie nicht melden.RESTRICTEDSetzen Sie diese Variable, wenn die Lizenz der
Applikation weder das Spiegeln der
DISTFILES der Applikation noch
das Weiterverbreiten von binären Paketen in
jedweder Art erlaubt.NO_CDROM oder
NO_PACKAGE sollten nicht zusammen
mit RESTRICTED gesetzt werden, weil
letztere Variable die anderen beiden impliziert.RESTRICTED 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
DISTFILES manuell herunterladen
muss – möglicherweise erst nachdem
er sich für die Software registriert oder die
Bedingungen eines Endbenutzer-Lizenzvertrags
(EULA) akzeptiert hat.RESTRICTED_FILESWenn RESTRICTED oder
NO_CDROM gesetzt ist, ist diese
Variable auf ${DISTFILES}
${PATCHFILES} voreingestellt, sonst ist sie
leer. Wenn nicht jede dieser Dateien beschränkt ist,
dann führen Sie die betroffenen Dateien in dieser
Variable auf.Beachten Sie, dass der Porter für jede
aufgeführte Distributionsdatei einen Eintrag zu
/usr/ports/LEGAL hinzufügen
sollte, der genau beschreibt, was die Beschränkung
mit sich bringt.Build-MechanismenParalleles Bauen von PortsDas Ports-Framework von &os; unterstützt das
parallele Bauen von Ports, indem es mehrere
make-Instanzen ausführt, damit
SMP-Systeme ihre gesamte
CPU-Rechenleistung ausnützen
können und so das Bauen von Ports schneller und
effektiver werden kann.Dies ermöglicht der Parameter
-jX 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 MAKE_JOBS_SAFE=yes irgendwo
unterhalb des Abschnitts für Abhängigkeiten im
Makefile aktiviert wird.Eine weitere Möglichkeit im Umgang mit dieser
Option besteht für den Maintainer darin,
MAKE_JOBS_UNSAFE=yes zu setzen. Diese
Variable wird dann verwendet, wenn ein Port bekannterweise
mit -jX nicht gebaut werden kann, der
Benutzer jedoch für alle Ports den Mehrprozessorbau
durch FORCE_MAKE_JOBS=yes in
/etc/make.conf erzwingt.make, gmake
und imakeWenn Ihr Port GNU make
benutzt, dann setzen Sie bitte
USE_GMAKE=yes.
Port-Variablen im Zusammenhang mit gmakeVariableBedeutungUSE_GMAKEDer Port benötigt gmake
für den Build.GMAKEDer ganze Pfad zu gmake,
wenn es nicht im PATH ist.
Wenn Ihr Port eine X-Applikation ist, die
Makefile-Dateien aus
Imakefile-Dateien mit
imake erzeugt, dann setzen Sie
USE_IMAKE=yes. Das sorgt dafür,
dass die Konfigurationsphase automatisch ein
xmkmf -a ausführt.
Wenn das Flag ein Problem für
Ihren Port darstellt, setzen Sie
XMKMF=xmkmf. Wenn der Port
imake benutzt, aber das
install.man-Target nicht versteht,
dann sollte NO_INSTALL_MANPAGES=yes
gesetzt werden.Wenn das Makefile
im Quelltext Ihres Ports etwas anderes als
all als Haupt-Build-Target
hat, setzen Sie ALL_TARGET
entsprechend. Das Gleiche gilt für
install und
INSTALL_TARGET.configure SkriptWenn Ihr Port ein configure-Skript
benutzt, um Makefile-Dateien aus
Makefile.in-Dateien zu erzeugen,
setzen Sie GNU_CONFIGURE=yes.
Wenn Sie dem configure-Skript
zusätzliche Argumente übergeben wollen (das
Vorgabeargument ist --prefix=${PREFIX}
--infodir=${PREFIX}/${INFO_PATH}
--mandir=${MANPREFIX}/man
--build=${CONFIGURE_TARGET}), setzen Sie diese
zusätzlichen Argumente in
CONFIGURE_ARGS.
Zusätzliche Umgebungsvariablen können
überdie Variable CONFIGURE_ENV
übergeben werden.
Variablen für Ports, die configure
benutzenVariableBedeutungGNU_CONFIGUREDer Port benutzt ein
configure-Skript, um das Bauen
vorzubereiten.HAS_CONFIGUREWie GNU_CONFIGURE, nur
dass kein Standard-Konfigurations-Target zu
CONFIGURE_ARGS hinzugefügt
wird.CONFIGURE_ARGSZusätzliche Argumente für das
configure-Skript.CONFIGURE_ENVZusätzliche Umgebungsvariablen
für die Abarbeitung des
configure-Skriptes.CONFIGURE_TARGETErsetzt das Standard-Konfigurations-Target.
Vorgabewert ist
${MACHINE_ARCH}-portbld-freebsd${OSREL}.
Benutzung von sconsWenn Ihr Port SCons
benutzt, definieren Sie
USE_SCONS=yes.
Variablen für Ports, die
scons benutzenVariableBedeutungSCONS_ARGSPort-spezifische SCons-Argumente, die der
SCons-Umgebung übergeben werden.SCONS_BUILDENVVariablen, die in der System-Umgebung
gesetzt werden sollen.SCONS_ENVVariablen, die in der SCons-Umgebung
gesetzt werden sollen.SCONS_TARGETLetztes Argument, das SCons übergeben
wird – ähnlich
MAKE_TARGET.
Um SConstruct im Quelltext alles,
was SCons in SCONS_ENV übergeben
wird, respektieren zu lassen (das ist hauptsächlich
CC/CXX/CFLAGS/CXXFLAGS), patchen Sie
SConstruct, sodass das Build
Environment wie folgt konstruiert
wird:env = Environment(**ARGUMENTS)Es kann dann mit env.Append und
env.Replace modifiziert werden.Benutzung von GNU autotoolsEinführungDie 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:USE_AUTOTOOLS= tool:version[:operation] ...Als dies geschrieben wurde konnte
tool eins von
libtool, libltdl,
autoconf,
autoheader,
automake oder
aclocal sein.version gibt die einzelne
Werkzeug-Revision an, die benutzt werden soll (siehe
devel/{automake,autoconf,libtool}[0-9]+
für mögliche Versionen).operation ist eine
optionale Angabe, die modifiziert, wie das Werkzeug
benutzt wird.Es können auch mehrere Werkzeuge angegeben
werden – entweder durch Angabe aller in
einer einzigen Zeile oder durch Benutzung des
+= Makefile-Konstrukts.Schliesslich gibt es das spezielle Tool, genannt
autotools, 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
devel/autotools installiert.libtoolShared-Libraries, die das GNU Build-System benutzen,
verwenden normalerweise
libtool, um die Kompilierung und
Installation solcher Bibliotheken anzupassen.
Die übliche Praxis ist, eine Kopie von
libtool, die mit dem Quelltext
geliefert wird, zu benutzen. Falls Sie ein externes
libtool benötigen, können
Sie die Version, die von der Ports-Sammlung bereitgestellt
wird, benutzen:USE_AUTOTOOLS= libtool:version[:env]Ohne zusätzliche Angaben sagt
libtool:version dem Build-System, dass es das
Konfigurationsskript mit der auf dem System
installierten Kopie von libtool
patchen soll.
Die Variable GNU_CONFIGURE ist
impliziert. Außerdem werden einige
make– und shell-Variablen zur
weiteren Benutzung durch den Port gesetzt.
Für Genaueres siehe
bsd.autotools.mk.Mit der Angabe :env wird nur die
Umgebung vorbereitet.Schließlich können optional
LIBTOOLFLAGS und
LIBTOOLFILES gesetzt werden, um die
häufigsten Argumente und durch
libtool gepatchten Dateien außer
Kraft zu setzen. Die meisten Ports werden das aber nicht
brauchen. Für Weiteres siehe
bsd.autotools.mk.libltdlEinige Ports benutzen das
libltdl-Bibliothekspaket,
welches Teil der libtool-Suite ist.
Der Gebrauch dieser Bibliothek macht nicht automatisch
den Gebrauch von libtool selbst
nötig, deshalb wird ein separates Konstrukt zur
Verfügung gestellt.USE_AUTOTOOLS= libltdl:versionIm Moment sorgt dies nur für eine
LIB_DEPENDS-Abhängigkeit von dem
entsprechenden libltdl-Port und wird
zur Vereinfachung zur Verfügung gestellt,
um Abhängigkeiten von den Autotools-Ports
ausserhalb des USE_AUTOTOOLS-Systems
zu eliminieren. Es gibt keine weiteren Angaben für
dieses Werkzeug.autoconf und
autoheaderManche Ports enthalten kein Konfigurationsskript,
sondern eine autoconf-Vorlage in der
configure.ac-Datei.
Sie können die folgenden Zuweisungen benutzen,
um autoconf das Konfigurationsskript
erzeugen zu lassen, und auch autoheader
Header-Vorlagen zur Benutzung durch das
Konfigurationsskript erzeugen zu lassen.USE_AUTOTOOLS= autoconf:version[:env]undUSE_AUTOTOOLS= autoheader:versionwelches auch die Benutzung von
autoconf:version impliziert.Ähnlich wie bei libtool,
bereitet die Angabe des optionalen
:env nur die Umgebung für weitere
Benutzung vor. Ohne dieses wird der Port auch gepatched
und erneut konfiguriert.Die zusätzlichen optionalen Variablen
AUTOCONF_ARGS und
AUTOHEADER_ARGS können durch das
Makefile des Ports ausser Kraft
gesetzt werden, wenn erforderlich. Wie bei den
libtool-Äquivalenten werden die
meisten Ports dies aber nicht benötigen.automake und
aclocalManche Pakete enthalten nur
Makefile.am-Dateien. Diese
müssen durch automake in
Makefile.in-Dateien konvertiert
und dann durch configure
weiterbearbeitet werden, um schließlich ein
Makefile zu erzeugen.Ähnliches gilt für Pakete, die gelegentlich
keine aclocal.m4-Dateien mitliefern,
welche ebenfalls zum Erstellen der Software benötigt
werden. Diese können durch aclocal
erzeugt werden, welches configure.ac
oder configure.in durchsucht.aclocal hat eine ähnliche
Beziehung zu automake wie
autoheader zu
autoconf – beschrieben
im vorherigen Abschnitt. aclocal
impliziert die Benutzung von automake,
also haben wir:USE_AUTOTOOLS= automake:version[:env]undUSE_AUTOTOOLS= aclocal:versionwas auch die Benutzung von
automake:version
impliziert.Ähnlich wie bei libtool und
autoconf, bereitet die optionale Angabe
:env nur die Umgebung zur weiteren
Benutzung vor. Ohne sie wird der Port erneut
konfiguriert.Wie schon autoconf und
autoheader, hat sowohl
automake als auch
aclocal eine optionale
Argument-Variable AUTOMAKE_ARGS
bzw. ACLOCAL_ARGS, die durch das
Makefile des Ports, falls nötig,
außer Kraft gesetzt werden kann.Benutzung von GNU gettextGrundlegende BenutzungWenn Ihr Port gettext
benötigt, setzen Sie einfach
USE_GETTEXT auf yes,
und Ihr Port bekommt die Abhängigkeit von devel/gettext. Der Wert von
USE_GETTEXT kann auch die
benötigte Version der
libintl-Bibliothek angeben, der
grundlegenden Teil von
gettext – jedoch
wird von der Benutzung dieser Funktion
dringend abgeraten:
Ihr Port sollte einfach nur mit der aktuellen Version von
devel/gettext
funktionieren.Ein ziemlich häufiger Fall ist, dass ein Port
gettext und
configure benutzt. Normalerweise sollte
GNU configuregettext automatisch finden können.
Sollte das einmal nicht funktionieren, können
Hinweise über den Ort von gettext
in CPPFLAGS und LDFLAGS wie
folgt übergeben werden:USE_GETTEXT= yes
CPPFLAGS+= -I${LOCALBASE}/include
LDFLAGS+= -L${LOCALBASE}/lib
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="${CPPFLAGS}" \
LDFLAGS="${LDFLAGS}"Natürlich kann der Code kompakter sein,
wenn es keine weiteren Flags gibt, die
configure übergeben werden
müssen:USE_GETTEXT= yes
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
LDFLAGS="-L${LOCALBASE}/lib"Optionale BenutzungManche Softwareprodukte erlauben die Deaktivierung
von NLS - z.B. durch Übergeben von
an
configure. In diesem Fall sollte Ihr
Port gettext abhängig vom Status
von WITHOUT_NLS
benutzen. Für Ports mit niedriger bis mittlerer
Komplexität können Sie sich auf das folgende
Idiom verlassen:GNU_CONFIGURE= yes
.if !defined(WITHOUT_NLS)
USE_GETTEXT= yes
PLIST_SUB+= NLS=""
.else
CONFIGURE_ARGS+= --disable-nls
PLIST_SUB+= NLS="@comment "
.endifDer 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
Makefile-Teil dieser Aufgabe ist
schon durch obiges Idiom erledigt.
Das wird im Abschnitt über Fortgeschrittene
pkg-plist-Methoden
erklärt.
Kurz gesagt, jedes Vorkommen von
%%NLS%% in
pkg-plist wird durch
@comment , wenn NLS
abgeschaltet ist, oder durch eine leere Zeichenkette,
wenn NLS aktiviert ist, ersetzt. Folglich werden die
Zeilen, denen %%NLS%% 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
%%NLS%% vor jedem Pfad zu einer
Message-Catalog-Datei in pkg-plist
einzufügen. Zum Beispiel:%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
%%NLS%%share/locale/no/LC_MESSAGES/foobar.moIn sehr komplexen Fällen müssen Sie
eventuell fortgeschrittenere Techniken als die hier
vorgestellte benutzen - wie z.B. Dynamische
Packlistenerzeugung.Behandlung von Message-Catalog-VerzeichnissenBei der Installation von Message-Catalog-Dateien
gibt es einen Punkt zu beachten. Ihr Zielverzeichnis,
das unter LOCALBASE/share/locale
liegt, sollte nur selten von Ihrem Port erzeugt und
gelöscht werden. Die Verzeichnisse für die
gebräuchlichsten Sprachen sind in
/etc/mtree/BSD.local.dist
aufgelistet; das heisst, sie sind Teil des Systems.
Die Verzeichnisse für viele andere Sprachen sind
Teil des Ports devel/gettext. Sie wollen
vielleicht dessen pkg-plist
zur Hand nehmen, um festzustellen, ob Ihr Port eine
Message-Catalog-Datei für eine seltene Sprache
installiert.Die Benutzung von perlWenn MASTER_SITES auf
MASTER_SITE_PERL_CPAN gesetzt ist,
dann ist der bevorzugte Wert von
MASTER_SITE_SUBDIR der Top-Level-Name
der Hierarchie. Zum Beispiel ist der empfohlene Wert
für
p5-Module-Name-Module.
Die Top-Level-Hierarchie kann unter cpan.org
angeschaut werden. Dies sorgt dafür, dass der Port
weiter funktioniert, wenn sich der Autor des Moduls
ändert.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 MASTER_SITE_SUBDIR
erlaubt.Jede der Einstellungen unten kann sowohl auf
YES als auch auf eine
Versionszeichenkette wie 5.8.0+ gesetzt
werden. Wenn YES benutzt wird, bedeutet
das, dass der Port mit jeder der unterstützten
Perl-Versionen funktioniert.
Falls ein Port nur mit einer bestimmten
Perl-Version funktioniert, kann
darauf mit einer Versionszeichenkette hingewiesen werden,
die entweder eine Mindest- (z.B. 5.7.3+),
Maximal- (z.B. 5.8.0-) oder
Absolutversion (z.B. 5.8.3)
festlegt.
Variablen für Ports, die perl
benutzenVariableBedeutungUSE_PERL5Bedeutet, dass der Port perl 5
zum Erstellen und zum Ausführen benutzt.USE_PERL5_BUILDBedeutet, dass der Port perl 5
zum Erstellen benutzt.USE_PERL5_RUNBedeutet, dass der Port perl 5
zur Laufzeit benutzt.PERLDer gesamte Pfad zu
perl 5 – entweder
im Basissystem oder nachinstalliert über einen
Port – ohne die Versionsnummer. Benutzen
Sie diese Variable, wenn Sie #!-Zeilen in Skripten
ersetzen müssen.PERL_CONFIGUREPerls MakeMaker für die Konfiguration
benutzen. Dies impliziert
USE_PERL5.PERL_MODBUILDModule::Build für configure, build und install
benutzen. Dies impliziert
PERL_CONFIGURE.Nur lesbare VariablenPERL_VERSIONDie volle Version des installierten
perl (z.B.
5.8.9).PERL_LEVELDie installierte perl-Version
als ein Integer der Form MNNNPP
(z.B. 500809).PERL_ARCHWo perl architektur
abhängige Bibliotheken ablegt. Vorgabe ist
${ARCH}-freebsd.PERL_PORTName des perl-Ports, der
installiert ist (z.B. perl5).SITE_PERLVerzeichnis, in das die Site-spezifischen
perl-Pakete kommen. Dieser Wert
wird zu PLIST_SUB hinzugefügt.
Ports von Perl-Modulen, die keine offizielle
Webseite haben, sollen in der WWW-Zeile ihrer
pkg-descr-Datei auf
cpan.org verlinken.
Die bevorzugte URL-Form ist
http://search.cpan.org/dist/Module-Name/
(inklusive des Slash am Ende).Benutzung von X11X.Org-KomponentenDie 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 USE_XORG auf. Als dies
geschrieben wurde, wurden die folgenden Komponenten
bereitgestellt: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.Die aktuelle Liste finden Sie immer in
/usr/ports/Mk/bsd.xorg.mk.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 USE_GL
spezifizieren. ouml;gliche Optionen sind: glut,
glu, glw, gl und linux.
Für Abwärtskompatibilität gilt der
Wert yes als
glu.Beispiel für USE_XORGUSE_XORG= xrender xft xkbfile xt xaw
USE_GL= gluViele Ports definieren USE_XLIB,
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.
Variablen für Ports, die X benutzenUSE_XLIBDer Port benutzt die X-Bibliotheken. Soll
nicht mehr verwendet werden - benutzen Sie
stattdessen eine Liste von Komponenten in
USE_XORG.USE_X_PREFIXSoll nicht mehr benutzt werden, ist jetzt
äquivalent zu USE_XLIB und
kann einfach durch letzteres ersetzt
werden.USE_IMAKEDer Port benutzt imake.
Impliziert USE_X_PREFIX.XMKMFIst auf den Pfad zu xmkmf
gesetzt, wenn nicht in PATH. Vorgabe
ist xmkmf -a.
Variablen bei Abhängigkeit von einzelnen
Teilen von X11X_IMAKE_PORTEin Port, der imake und einige
andere Werkzeuge, die zum Erstellen von X11 benutzt
werden, bereitstellt.X_LIBRARIES_PORTEin Port, der die X11-Bibliotheken
bereitstellt.X_CLIENTS_PORTEin Port, der X11-Clients bereitstellt.X_SERVER_PORTEin Port, der den X11-Server bereitstellt.X_FONTSERVER_PORTEin Port, der den Fontserver bereitstellt.X_PRINTSERVER_PORTEin Port, der den Printserver bereitstellt.X_VFBSERVER_PORTEin Port, der den virtuellen Framebuffer-Server
bereitstellt.X_NESTSERVER_PORTEin Port, der einen nested X-Server
bereitstellt.X_FONTS_ENCODINGS_PORTEin Port, der Kodierungen für Schriftarten
bereitstellt.X_FONTS_MISC_PORTEin Port, der verschiedene Bitmap-Schriftarten
bereitstellt.X_FONTS_100DPI_PORTEin Port, der 100dpi Bitmap-Schriftarten
bereitstellt.X_FONTS_75DPI_PORTEin Port, der 75dpi Bitmap-Schriftarten
bereitstellt.X_FONTS_CYRILLIC_PORTEin Port, der kyrillische Bitmap-Schriftarten
bereitstellt.X_FONTS_TTF_PORTEin Port, der &truetype;-Schriftarten
bereitstellt.X_FONTS_TYPE1_PORTEin Port, der Type1-Schriftarten bereitstellt.X_MANUALS_PORTEin Port, der entwicklerorientierte Manualpages
bereitstellt.
Benutzung von X11-bezogenen Variablen in einem
Port# 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 xpmPorts, die Motif benötigenWenn Ihr Port eine Motif-Bibliothek benötigt,
definieren Sie USE_MOTIF im
Makefile.
Die Standard-Motif-Implementierung ist x11-toolkits/open-motif.
Benutzer können stattdessen x11-toolkits/lesstif wählen,
indem Sie die WANT_LESSTIF-Variable
setzen.Die Variable MOTIFLIB wird von
bsd.port.mk auf die entsprechende
Motif-Bibliothek gesetzt. Bitte patchen Sie den Quelltext
Ihres Ports, sodass er überall
${MOTIFLIB} benutzt, wo die
Motif-Bibliothek im Original Makefile
oder Imakefile referenziert
wird.Es gibt zwei verbreitete Fälle:Wenn sich der Port in seinem
Makefile oder
Imakefile auf die
Motif-Bibliothek als -lXm bezieht,
ersetzen Sie das einfach durch
${MOTIFLIB}.Wenn der Port in seinem
ImakefileXmClientLibs benutzt, ersetzen Sie
das durch ${MOTIFLIB}
${XTOOLLIB} ${XLIB}.Anmerkung: MOTIFLIB expandiert
(normalerweise) zu -L/usr/X11R6/lib
-lXm oder /usr/X11R6/lib/libXm.a
- d.h. Sie müssen kein
-L oder -l davor
einfügen.X11 SchriftartenWenn Ihr Port Schriftarten für das
X-Window-System installiert, legen Sie diese nach
LOCALBASE/lib/X11/fonts/local.Erzeugen eines künstlichen
DISPLAY durch XvfbManche 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
DISPLAY wird dem Build
übergeben.USE_DISPLAY= yesDesktop-EinträgeDesktop-Einträge (Freedesktop
Standard) können in Ihrem Port einfach
über die DESKTOP_ENTRIES-Variable
erzeugt werden. Diese Einträge erscheinen dann im
Applikationsmenü von standardkonformen
Desktop-Umgebungen wie GNOME oder KDE. Die
.desktop-Datei wird dann
automatisch erzeugt, installiert und der
pkg-plist hinzugefügt.
Die Syntax ist:DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotifyDie Liste der möglichen Kategorien ist auf der
Freedesktop
Webseite abrufbar.
StartupNotify zeigt an, ob die
Applikation den Status in Umgebungen, die
Startup-Notifications kennen, löschen wird.Beispiel:DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
"${DATADIR}/xtra/graf/tome-128.png" \
"tome -v -g" "Application;Game;RolePlaying" \
falseBenutzung von GNOMEDas FreeBSD/GNOME-Projekt benutzt seine eigene
Gruppe von Variablen, um zu definieren, welche
GNOME-Komponenten ein bestimmter Port benutzt. Eine
umfassende Liste dieser Variablen existiert innerhalb
der Webseite des FreeBSD/GNOME-Projektes.Benutzung von KDEVariablen-Definitionen
Variablen für Ports, die KDE benutzenUSE_KDELIBS_VERDer Port benutzt KDE-Bibliotheken. Die Variable
spezifiziert die Major Version von KDE, die benutzt
werden soll, und impliziert
USE_QT_VER der entsprechenden
Version. Der einzig mögliche Wert ist
3.USE_KDEBASE_VERDer Port benutzt die KDE-Base. Die Variable
spezifiziert die Major Version von KDE, die benutzt
werden soll, und impliziert
USE_QT_VER der entsprechenden
Version. Der einzig mögliche Wert ist
3.
Ports, die Qt benötigen
Variablen für Ports, die Qt
benötigenUSE_QT_VERDer Port benutzt das Qt-Toolkit. Mögliche
Werte sind 3 und
4; diese spezifizieren die Major
Version von Qt, die benutzt werden soll.
Entsprechende Parameter werden an das
configure-Skript und
make übergeben.QT_PREFIXEnthält den Pfad, wohin Qt installiert ist
(nur lesbare Variable).MOCEnthält den Pfad von moc
(nur lesbare Variable). Voreingestellt entsprechend des
USE_QT_VER-Werts.QTCPPFLAGSZusätzliche Compiler-Flags, die über
CONFIGURE_ENV an das Qt-Toolkit
übergeben werden. Voreingestellt entsprechend des
USE_QT_VER-Wertes.QTCFGLIBSZusätzliche Bibliotheken, die über
CONFIGURE_ENV für das Qt-Toolkit
gelinkt werden sollen. Voreingestellt entsprechend des
USE_QT_VER-Wertes.QTNONSTANDARDÄnderungen von
CONFIGURE_ENV,
CONFIGURE_ARGS und
MAKE_ENV sollen unterdrückt
werden.
Zusätzliche Variablen für Ports,
die Qt 4.xi benutzenQT_COMPONENTSSpezifiziert Tool– und
Bibliothek-Abhängigkeiten für Qt4.
Siehe unten für Details.UICEnthält den Pfad von uic
(nur lesbare Variable). Voreingestellt entsprechend des
USE_QT_VER-Wertes.QMAKEEnthält den Pfad von qmake
(nur lesbare Variable). Voreingestellt entsprechend des
USE_QT_VER-Wertes.QMAKESPECEnthält den Pfad der Konfigurationsdatei
für qmake
(nur lesbare Variable). Voreingestellt entsprechend des
USE_QT_VER-Wertes.
Wenn USE_QT_VER gesetzt ist,
werden dem configure-Skript einige
nützliche Einstellungen übergeben: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}"Wenn USE_QT_VER auf
4 gesetzt ist, werden auch die folgenden
Einstellungen übergeben:CONFIGURE_ENV+= UIC="${UIC}" QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}"
MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"Komponentenauswahl (nur bei Qt 4.x)Wenn USE_QT_VER auf 4 gesetzt ist,
können individuelle Qt4-Tool- und
Bibliotheksabhängigkeiten in der Variable
QT_COMPONENTS angegeben werden. An jede
Komponente kann _build oder
_run 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 _build und
Plugin-Komponenten mit _run. Die
gebräuchlichsten Komponenten werden im Folgenden
angegeben (alle verfügbaren Komponenten sind in
_QT_COMPONENTS_ALL in
/usr/ports/Mk/bsd.qt.mk
aufgelistet):
Verfügbare Qt4-BibliothekskomponentenNameBeschreibungcorelibKern-Bibliothek (kann weggelassen
werden– es sei denn, der Port benutzt nichts
außer corelib)guiGraphische
Benutzeroberflächen-BibliotheknetworkNetzwerk-BibliothekopenglOpenGL-Bibliothekqt3supportQt3-Kompatibilitäts-BibliothekqtestlibModultest-BibliothekscriptSkript-BibliotheksqlSQL-BibliothekxmlXML-Bibliothek
Sie können herausfinden, welche Bibliotheken die
Applikation benötigt, indem Sie nach erfolgreicher
Kompilierung ldd auf die
Hauptbinärdatei anwenden.
Verfügbare Qt4-Tool-KomponentenNameBeschreibungmocmeta object compiler (wird zum Build fast
jeder Qt-Applikation benötigt)qmakeMakefile-Generator / Build-WerkzeugrccResource-Compiler (wird benötigt, falls
die Applikation *.rc oder
*.qrc Dateien
enthält)uicUser-Interface-Compiler (wird benötigt,
falls die Applikation von Qt-Designer erzeugte
*.ui Dateien enthält -
gilt für praktisch jede Qt-Applikation mit
einer GUI)
Verfügbare Qt4-Plugin-KomponentenNameBeschreibungiconenginesSVG-Icon-Engine Plugin (wenn die Applikation
SVG-Icons mitliefert)imageformatsBildformatplugins für GIF, JPEG, MNG und
SVG (wenn die Applikation Bilddateien
mitliefert)
Qt4-Komponenten auswählenIn 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
_build:USE_QT_VER= 4
QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_buildZusätzliche BesonderheitenWenn die Applikation keine
configure Datei, sondern eine
.pro Datei hat, können Sie das
Folgende benutzen:HAS_CONFIGURE= yes
do-configure:
@cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} \
${QMAKE} -unix PREFIX=${PREFIX} texmaker.proBeachten Sie die Ähnlichkeit mit der
qmake-Zeile im mitgelieferten
BUILD.sh-Skript. Die
Übergabe von CONFIGURE_ENV
stellt sicher, dass qmake die
QMAKESPEC-Variable übergeben
bekommt, ohne die es nicht funktioniert.
qmake erzeugt Standard-Makefiles,
sodass es nicht nötig ist ein eigenes neues
build-Target zu schreiben.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.:Fehlende zusätzliche
Include-Pfade.
Viele Applikationen kommen mit System-Tray-Icon
Support– unterlassen es aber Includes
oder Bibliotheken in den X11 Verzeichnissen zu suchen.
Sie können qmake über die
Kommandozeile sagen, es soll Verzeichnisse zu den
Include- und Bibliotheks-Suchpfaden
hinzufügen - z.B.:${QMAKE} -unix PREFIX=${PREFIX} INCLUDEPATH+=${LOCALBASE}/include \
LIBS+=-L${LOCALBASE}/lib sillyapp.proFalsche Installations-Pfade.
Manchmal werden Daten wie Icons oder .desktop-Dateien
per Vorgabe in Verzeichnisse installiert, die nicht von
XDG-kompatiblen Applikationen durchsucht werden.
editors/texmaker
ist hierfür ein Beispiel– siehe
patch-texmaker.pro im
files-Verzeichnis dieses Ports
als eine Vorlage, die zeigt, wie man dies direkt in der
Qmake Projektdatei löst.Benutzung von JavaVariablen-DefinitionenWenn Ihr Port ein Java™ Development Kit (JDK)
benötigt, entweder zum Bauen, zur Laufzeit oder
sogar, um das Distfile auszupacken, dann sollten Sie
USE_JAVA setzen.Es gibt mehrere JDKs in der
Ports-Sammlung– 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 java/jdk15.
Variablen, die von Ports, die Java benutzen, gesetzt
werden müssenVariableBedeutungUSE_JAVASollte definiert sein, damit die übrigen
Variablen irgendeinen Effekt haben.JAVA_VERSIONDurch Leerzeichen getrennte Liste von geeigneten
Java-Versionen für den Port. Ein optionales
"+" ermöglicht die Angabe eines
Bereiches von Versionen (mögliche Werte:
1.1[+] 1.2[+] 1.3[+] 1.4[+]).JAVA_OSDurch Leerzeichen getrennte Liste von geeigneten
JDK-Port-Betriebssystemen für den Port. (erlaubte
Werte: native linux).JAVA_VENDORDurch Leerzeichen getrennte Liste von geeigneten
JDK-Port-Anbietern für den Port. (erlaubte Werte:
freebsd bsdjava sun ibm
blackdown).JAVA_BUILDBedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Build-Abhängigkeiten des Ports
hinzugefügt werden soll.JAVA_RUNBedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Laufzeit-Abhängigkeiten des Ports
hinzugefügt werden soll.JAVA_EXTRACTBedeutet, falls gesetzt, dass der ausgewählte
JDK-Port zu den Extract-Abhängigkeiten des Ports
hinzugefügt werden soll.USE_JIKESLegt fest, ob der Port den jikes
Bytecode-Compiler zum Kompilieren benutzen soll. Wenn
kein Wert für diese Variable gesetzt ist, wird der
Port jikes für die Kompilierung
benutzen– falls vorhanden. Sie können
die Benutzung von jikes auch
ausdrücklich verbieten oder erzwingen (durch
Setzen auf 'no' oder
'yes'). Im letzteren Fall wird
devel/jikes zu den
Build-Abhängigkeiten des Ports hinzugefügt.
In jedem Fall wird, wenn jikes
tatsächlich statt javac zur
Kompilierung benutzt wird, die Variable
HAVE_JIKES von
bsd.java.mk definiert.
Das Folgende ist eine Liste aller Variablen, die ein
Port bekommt, nachdem er USE_JAVA
gesetzt hat:
Bereitgestellte Variablen für Ports,
die Java benutzenVariableWertJAVA_PORTDer Name des JDK-Ports (z.B.
'java/jdk14').JAVA_PORT_VERSIONDie volle Version des JDK Ports (z.B.
'1.4.2'). Wenn Sie nur die ersten
beiden Stellen dieser Versionsnummer benötigen,
benutzen Sie
${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}.JAVA_PORT_OSDas vom JDK-Port benutzte Betriebssystem (z.B.
'linux').JAVA_PORT_VENDORDer Anbieter des JDK-Ports (z.B.
'sun').JAVA_PORT_OS_DESCRIPTIONBeschreibung des vom JDK-Port benutzten
Betriebssystems (z.B.
'Linux').JAVA_PORT_VENDOR_DESCRIPTIONBeschreibung des Anbieters des JDK-Ports (z.B.
'FreeBSD Foundation').JAVA_HOMEPfad zum Installationsverzeichnis des JDK (z.B.
'/usr/local/jdk1.3.1').JAVACPfad zum Java-Compiler, der benutzt werden soll
(z.B.
'/usr/local/jdk1.1.8/bin/javac' oder
'/usr/local/bin/jikes').JARPfad zum jar-Werkzeug, das
benutzt werden soll (z.B.
'/usr/local/jdk1.2.2/bin/jar' oder
'/usr/local/bin/fastjar').APPLETVIEWERPfad zum appletviewer-Werkzeug
(z.B.
'/usr/local/linux-jdk1.2.2/bin/appletviewer').JAVAPfad zur java Binärdatei.
Benutzen Sie dies, um Java-Programme auszuführen
(z.B.
'/usr/local/jdk1.3.1/bin/java').JAVADOCPfad zum
javadoc-Werkzeug.JAVAHPfad zum javah-Programm.JAVAPPfad zum javap-Programm.JAVA_KEYTOOLPfad zum keytool-Werkzeug.
Diese Variable ist nur verfügbar, wenn das JDK Java
1.2 oder höher ist.JAVA_N2APfad zum
native2ascii-Werkzeug.JAVA_POLICYTOOLPfad zum policytool Programm.
Diese Variable ist nur verfügbar, wenn das JDK
Java 1.2 oder höher ist.JAVA_SERIALVERPfad zum
serialver-Werkzeug.RMICPfad zum RMI Stub/Skeleton-Generator,
rmic.RMIREGISTRYPfad zum RMI Registry-Werkzeug,
rmiregistry.RMIDPfad zum RMI Daemon rmid.
Diese Variable ist nur verfügbar, wenn das JDK
Java 1.2 oder höher unterstützt.JAVA_CLASSESPfad zum Archiv, das die JDK-Klassendateien
enthält. Für das JDK 1.2 oder später
ist dies
${JAVA_HOME}/jre/lib/rt.jar.
Frühere JDKs benutzten
${JAVA_HOME}/lib/classes.zip.HAVE_JIKESIst dann gesetzt, wenn jikes
vom Port benutzt wird (s. USE_JIKES
oben).
Sie können das java-debug
make-Target benutzen, um Information zum Debuggen
Ihres Ports zu erhalten. Es wird die Werte vieler
der obenangegebenen Variablen anzeigen.Zusätzlich sind die folgenden Konstanten
definiert, damit alle Java-Ports auf eine konsistente
Art installiert werden können:
Konstanten, die für Ports, welche Java benutzen,
definiert sindKonstanteWertJAVASHAREDIRDas Basis-Verzeichnis für alles, was mit Java
zusammenhängt. Standardmäßig
${PREFIX}/share/java.JAVAJARDIRDas Verzeichnis, wohin JAR-Dateien installiert
werden sollen. Standardmäßig
${JAVASHAREDIR}/classes.JAVALIBDIRDas Verzeichnis, in dem JAR-Dateien, die von
anderen Ports installiert wurden, liegen.
Standardmäßig
${LOCALBASE}/share/java/classes.
Die entsprechenden Einträge sind sowohl in
PLIST_SUB (dokumentiert in
) als auch in
SUB_LIST definiert.Kompilieren mit AntWenn der Port mit Apache Ant kompiliert werden soll,
muss er USE_ANT setzen. Ant wird dann
als das sub-make-Kommando betrachtet. Wenn kein
do-build-Target vom Port definiert ist,
wird eine Standardvorgabe benutzt, die einfach Ant
entsprechend MAKE_ENV,
MAKE_ARGS und
ALL_TARGETS aufruft. Das ähnelt dem
USE_GMAKE-Mechanismus, der in dokumentiert ist.Wenn jikes anstelle von
javac benutzt wird (siehe
USE_JIKES in ), dann wird Ant es automatisch
benutzen, um den Port zu kompilieren.Optimales VerfahrenWenn Sie eine Java-Bibliothek portieren, sollte Ihr Port
die JAR-Datei(en) in ${JAVAJARDIR}
installieren, und alles andere unter
${JAVASHAREDIR}/${PORTNAME}
(ausgenommen die Dokumentation - siehe unten). Um die
Größe der Packlistendatei zu reduzieren,
können die JAR-Datei(en) direkt im
Makefile angegeben werden. Benutzen
Sie einfach die folgende Anweisung (wobei
myport.jar der Name der JAR-Datei ist,
die als Teil des Ports installiert wird):PLIST_FILES+= %%JAVAJARDIR%%/myport.jarBeim Portieren einer Java-Applikation installiert der
Port normalerweise alles unter einem einzigen Verzeichnis
(inklusive seiner JAR-Abhängigkeiten). Die Benutzung
von ${JAVASHAREDIR}/${PORTNAME}
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 ${JAVAJARDIR})
benutzen soll.Unabhängig von der Art Ihres Ports (Bibliothek
oder Applikation), sollte die zusätzliche Dokumentation
an die gleiche Stelle
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
(pkg-plist) festzulegen. Dies ist
ein Grund, warum dringend angeraten wird, das
PORTDOCS-Makro zu benutzen.
Außerdem, selbst wenn Sie den Satz von Dateien,
den javadoc erzeugen wird,
voraussagen können, die Größe der
resultierenden pkg-plist
befürwortet die Benutzung von
PORTDOCS.Der Vorgabewert für DATADIR ist
${PREFIX}/share/${PORTNAME}. Es ist
eine gute Idee, DATADIR für
Java-Ports stattdessen auf
${JAVASHAREDIR}/${PORTNAME} zu setzen.
In der Tat wird DATADIR automatisch zu
PLIST_SUB (dokumentiert in ) hinzugefügt, d.h. Sie können
%%DATADIR%% direkt in
pkg-plist benutzen.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 &os;
Java-Projekts Porter dazu, Ihre Ports aus dem
Quelltext kompilieren zu lassen, wann immer dies kein
Problem darstellt.Alle Eigenschaften, die in diesem Abschnitt
präsentiert wurden sind in
bsd.java.mk implementiert.
Sollten Sie jemals der Meinung sein, dass Ihr Port
ausgefeiltere Java-Unterstützung benötigt,
schauen Sie bitte erst in das
bsd.java.mk CVS Log, 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;.Obwohl es eine java-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
ports-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
bsd.java.mk.Gleichermaßen gibt es eine definierte Richtlinie
für die CATEGORIES eines Java-Ports,
die in erklärt
wird.Webanwendungen, Apache und PHPApache
Variablen für Ports, die Apache
verwendenUSE_APACHEDer Port benötigt Apache. Mögliche Werte:
yes (beliebige Version),
1.3, 2.0,
2.2, 2.0+,
etc. – Standard ist Version
1.3.WITH_APACHE2Der 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.APXSVollständiger Pfad zu der
apxs Binärdatei. Die Variable
kann neu gesetzt werden.HTTPDVollständiger Pfad zu der
httpd Binärdatei.
Die Variable kann neu gesetzt werden.APACHE_VERSIONBeinhaltet die Versionsnummer des aktuell
installierten Apache (nur lesbare Variable).
Diese Variable ist nach Einbinden der Datei
bsd.port.pre.mk
verfügbar. Mögliche Werte:
13, 20,
22.APACHEMODDIRVerzeichnis der Apache-Module. Diese Variable wird
automatisch in pkg-plist ersetzt.APACHEINCLUDEDIRVerzeichnis der Apache Header-Dateien. Diese
Variable wird automatisch in pkg-plist ersetzt.APACHEETCDIR Verzeichnis der Apache-Konfigurationsdateien.
Diese Variable wird automatisch in pkg-plist
ersetzt.
Nützliche Variablen für Ports von
Apache-ModulenMODULENAMEName des Moduls. Standardwert ist
PORTNAME. Beispiel:
mod_helloSHORTMODNAMEDer gekürzte Name des Moduls.
Standardmäßig
wird der Wert von MODULENAME
übernommen.
Beispiel: helloAP_FAST_BUILDVerwende apxs zum Kompilieren
und Installieren des Moduls.AP_GENPLISTEine pkg-plist wird
automatisch erzeugt.AP_INCVerzeichnis für zusätzliche
Header-Dateien, die beim Kompilieren mitverwendet
werden.AP_LIBVerzeichnis für zusätzliche
Bibliothek-Dateien, welche beim Kompilieren
mitverwendet werden.AP_EXTRASZusätzliche Flags für
apxs.
WebanwendungenWebanwendungen sollten nach PREFIX/www/programmname
installiert werden.
Der Einfachheit halber ist dieser Pfad sowohl im
Makefile als auch in
pkg-plist als
WWWDIR verfügbar. Der relative
Pfad PREFIX ist hingegen im
Makefile durch die Variable
WWWDIR_REL festgelegt.Der Benutzername und die Benutzergruppe,
mit deren Rechte Webanwendungen laufen, sind in
WWWOWN und WWWGRP
festgelegt. Standardwert ist bei beiden
www. Falls ein Port mit anderen
Rechten gestartet werden soll, so sollte die Anweisung
WWWOWN?= myuser verwendet werden. Dies
vereinfacht dem Benutzer eine Anpassung dieser Werte.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.PHP
Variablen für Ports, die PHP verwendenUSE_PHPDer Port benötigt PHP. Der Wert
yes bewirkt eine Abhängigkeit
des Ports von PHP. Es kann auch eine Liste der
benötigten PHP-Erweiterungen angegeben
werden. Beispiel:
pcre xml gettextDEFAULT_PHP_VERLegt die Version von PHP fest, die
standardmäßig installiert wird, falls noch
kein PHP vorhanden ist. Standardwert ist
4. Mögliche Werte sind:
4,5IGNORE_WITH_PHPDer Port funktioniert nicht mit der angegebenen
Version von PHP. Mögliche Werte:
4, 5USE_PHPIZEDer Port wird als PHP-Erweiterung gebaut.USE_PHPEXTDer Port wird wie eine PHP-Erweiterung
behandelt – Installation und
Eintragung in die PHP-Registry für
Erweiterungen.USE_PHP_BUILDSetzt PHP als build-Anhängigkeit.WANT_PHP_CLIBenötigt die Kommandozeilen-Version von
PHP.WANT_PHP_CGIBenötigt die CGI-Version von PHP.WANT_PHP_MODBenötigt das Apache-Modul von PHP.WANT_PHP_SCRBenötigt die Kommandozeilen- oder die
CGI-Version von PHP.WANT_PHP_WEBBenötigt das Apache-Modul oder die CGI-Version
von PHP.
PEAR ModuleDas Portieren von PEAR-Modulen ist sehr einfach.Mit Hilfe der Variablen FILES,
TESTS, DATA,
SQLS, SCRIPTFILES,
DOCS und EXAMPLES
können die zu installierenden Dateien angegeben werden.
Alle aufgeführten Dateien werden automatisch in die
jeweiligen Verzeichnisse installiert und der Datei
pkg-plist hinzugefügt.Die Datei
${PORTSDIR}/devel/pear/bsd.pear.mk
muss am Ende des Makefiles
eingebunden werden.Beispiel eines Makefiles für eine PEAR
KlassePORTNAME= 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 <bsd.port.pre.mk>
.include "${PORTSDIR}/devel/pear/bsd.pear.mk"
.include <bsd.port.post.mk>Python benutzenDie Ports unterstützen parallele Installationen
mehrerer Python-Versionen. Ports sollten sicherstellen,
dass der richtige python-Interpreter
verwendet wird – entsprechend der durch den
Benutzer definierbaren Variable
PYTHON_VERSION. Häufig bedeutet
dies, dass der Pfad zum python-Interpreter
durch den Wert der Variablen PYTHON_CMD
ersetzt werden muss.Ports, die Dateien unter
PYTHON_SITELIBDIR installieren, sollten
pyXY- als Präfix des Paketnamens
haben, sodass in deren Paketname die zugehörige
Python Version aufgeführt wird.PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
Nützliche Variablen für Ports,
die Python verwendenUSE_PYTHONDer Port benötigt Python. Die minimal
benötigte Version kann durch Werte wie
2.3+ angegeben werden.
Bereiche von Versionsnummern können durch Angabe der
minimalen und maximalen Versionsnummer, getrennt durch
einen Gedankenstrich, festgelegt werden, z.B.:
2.1-2.3USE_PYDISTUTILSVerwende Python-distutils zum Konfigurieren,
Kompilieren und Installieren. Dies ist erforderlich,
falls der Port eine setup.py-Datei
beinhaltet. Dadurch werden die
do-build und
do-install-Ziele und eventuell
auch das do-configure-Ziel
übergangen, falls GNU_CONFIGURE
nicht definiert ist.PYTHON_PKGNAMEPREFIXWird als PKGNAMEPREFIX verwendet,
um Pakete für unterschiedliche Python-Versionen zu
trennen. Beispiel: py24-PYTHON_SITELIBDIRVerzeichnis des site-Pakete Baums, der das
Installationsverzeichnis von Python (üblicherweise
LOCALBASE) beinhaltet. Die
PYTHON_SITELIBDIR-Variable kann
sehr nützlich bei der Installation von
Python-Modulen sein.PYTHONPREFIX_SITELIBDIRDie präfix-freie Variante von
PYTHON_SITELIBDIR. Benutzen Sie immer
%%PYTHON_SITELIBDIR%% in
pkg-plist, wenn möglich. Der
Standardwert von %%PYTHON_SITELIBDIR%%
ist
lib/python%%PYTHON_VERSION%%/site-packages
PYTHON_CMDKommandozeilen-Interpreter für Python mit
Versionsnummer.PYNUMERICListe der Abhängigkeiten für numerische
Erweiterungen.PYNUMPYListe der Abhängigkeiten für die neue
numerische Erweiterung numpy.
(PYNUMERIC ist vom Anbieter als
veraltet deklariert)PYXMLListe der Abhängigkeiten für
XML-Erweiterungen (wird ab Python 2.0 nicht mehr
benötigt, da im Basispaket enthalten).USE_TWISTEDSetzt die Abhängigkeit des Ports von
twistedCore. Die Liste der erforderlichen Komponenten
kann als Wert spezifiziert werden. Beispiel:
web lore pair flowUSE_ZOPESetzt Zope, eine Plattform für Webanwendungen,
als Abhängigkeit des Ports. Setzt die
Versionsabhängigkeit von Python auf 2.3. Setzt
ZOPEBASEDIR auf das Verzeichnis,
in welches Zope installiert wurde.
Eine vollständige Liste aller verfügbaren
Variablen ist in /usr/ports/Mk/bsd.python.mk
zu finden.Benutzung von Tcl/TkDie Ports-Sammlung unterstützt die parallele
Installation mehrerer
Tcl/Tk-Versionen. Ports sollten
mindestens die vorgegebene
Tcl/Tk-Version oder höher zu
unterstützen versuchen anhand der Variablen
USE_TCL und USE_TK. Es
ist möglich, die gewünschte Version von
tcl mit der Variable
WITH_TCL_VER vorzuschreiben.
Äußerst nützliche Variablen für
Ports, die Tcl/Tk
benutzenUSE_TCLDer Port benötigt die
Tcl-Bibliothek (nicht die
Shell). Eine notwendige Mindestversion kann mit Werten
wie 84+ angegeben werden. Einzelne nicht
unterstützte Versionen können mit der
Variable INVALID_TCL_VER festgelegt
werden.USE_TCL_BUILDDer Port benötigt
Tcl nur während der
Zeit, in der er gebaut wird.USE_TCL_WRAPPERPorts, welche zwar die
Tcl-Shell, aber nicht eine
bestimmte Version von tclsh
verlangen, sollten diese neue Variable verwenden. Ein
Wrapperskript für tclsh wird
auf dem System installiert. Der Benutzer kann
festlegen, welche tcl-Shell
gewünscht ist bzw. verwendet werden soll.WITH_TCL_VERBenutzerdefinierte Variable, welche die
gewünschte Tcl-Version
bestimmt.PORTNAME_WITH_TCL_VERGleich wie WITH_TCL_VER, nur
portspezifisch.USE_TCL_THREADSFordere threadfähiges
Tcl/Tk.USE_TKDer Port benötigt die
Tk-Bibliothek (nicht die
Wish-Shell). Impliziert USE_TCL mit
dem gleichen Wert. Für weitere Informationen
siehe die Beschreibung der Variable
USE_TCL.USE_TK_BUILDAnalog zur Variable
USE_TCL_BUILD.USE_TK_WRAPPERAnalog zur Variable
USE_TCL_WRAPPER.WITH_TK_VERAnalog zur Variable
WITH_TCL_VER und impliziert
WITH_TCL_VER mit dem gleichen
Wert.
Eine vollständige Liste der zur Verfügung
stehenden Variablen befindet sich in
/usr/ports/Mk/bsd.tcl.mk.Emacs benutzenDieser Abschnitt muss noch geschrieben werden.Ruby benutzen
Nützliche Variablen für Ports,
die Ruby verwendenVariableDescriptionUSE_RUBYDer Port benötigt Ruby.USE_RUBY_EXTCONFDer Port verwendet extconf.rb
für die Konfiguration.USE_RUBY_SETUPDer Port verwendet setup.rb
für die Konfiguration.RUBY_SETUPLegt den alternativen Namen von
setup.rb fest. Üblich ist der
Wert install.rb.
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
pkg-plist so häufig wie möglich
verwendet und in einem Port nicht neu definiert werden.
Ausgewählte read-only-Variablen für Ports,
die Ruby verwendenVariableBeschreibungBeispielRUBY_PKGNAMEPREFIXWird als PKGNAMEPREFIX verwendet,
um Pakete für verschiedene Versionen von Ruby zu
unterscheiden.ruby18-RUBY_VERSIONVollständige Version von Ruby in der Form
x.y.z.1.8.2RUBY_SITELIBDIRInstallationsverzeichnis der von der
Rechnerarchitektur unabhängigen
Bibliotheken./usr/local/lib/ruby/site_ruby/1.8RUBY_SITEARCHLIBDIRInstallationsverzeichnis der von der Rechnerarchitektur
abhängigen Bibliotheken./usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6RUBY_MODDOCDIRInstallationsverzeichnis für die Dokumentation
der Module./usr/local/share/doc/ruby18/patsyRUBY_MODEXAMPLESDIRInstallationsverzeichnis für die Beispiele der
Module./usr/local/share/examples/ruby18/patsy
Eine vollständige Liste der verfügbarenVariablen
kann in /usr/ports/Mk/bsd.ruby.mk
eingesehen werden.SDL verwendenDie Variable USE_SDL wird für die
automatische Konfiguration der Abhängigkeiten für Ports
benutzt, die auf SDL basierende Bibliotheken wie
devel/sdl12 und
x11-toolkits/sdl_gui
verwenden.Die folgenden SDL-Bibliotheken sind derzeit
bekannt:sdl: devel/sdl12gfx: graphics/sdl_gfxgui: x11-toolkits/sdl_guiimage: graphics/sdl_imageldbad: devel/sdl_ldbadmixer: audio/sdl_mixermm: devel/sdlmmnet: net/sdl_netsound: audio/sdl_soundttf: graphics/sdl_ttfFalls ein Port z.B. von
net/sdl_net und
audio/sdl_mixer
abhängt, so wäre die Syntax:USE_SDL= net mixerDie Abhängigkeit von
devel/sdl12, die durch
net/sdl_net und
audio/sdl_mixer entsteht,
wird automatisch zum Port hinzugefügt.Falls USE_SDL im Port verwendet wird,
so wird automatisch:die Abhängigkeit von
sdl12-config zu
BUILD_DEPENDS hinzugefügtdie Variable SDL_CONFIG zu
CONFIGURE_ENV hinzugefügtdie Abhängigkeit der ausgewählten
Bibliotheken zu LIB_DEPENDS
hinzugefügtUm zu überprüfen, ob die SDL-Bibliotheken
verfügbar sind, kann die Variable
WANT_SDL verwendet werden:WANT_SDL=yes
.include <bsd.port.pre.mk>
.if ${HAVE_SDL:Mmixer}!=""
USE_SDL+= mixer
.endif
.include <bsd.port.post.mk>wxWidgets verwendenDieser Abschnitt beschreibt den Status der
wxWidgets-Bibliotheken in den Ports
und deren Einbindung in das Ports-System.EinführungEs gibt viele Probleme bei der gleichzeitigen Verwendung
unterschiedlicher Versionen von
wxWidgets-Bibliotheken (Dateien
unterschiedlicher
wxWidgets-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.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
wx-config-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 configure-Skript, um
das gewünschte wx-config-Skript
festzulegen. Ansonsten müssen sie gepatcht
werden.Auswahl der VersionUm festzulegen, welche Version der
wxWidgets verwendet werden soll,
gibt es zwei Variablen (falls nur eine der beiden definiert
wird, so wird die andere auf einen Standardwert
gesetzt):
Variablen, um die
wxWidgets-Version festzulegenVariableBeschreibungStandardwertUSE_WXListe der Versionen, die der Port verwenden
kannAlle verfügbaren VersionenUSE_WX_NOTListe der Versionen, die der Port nicht verwenden
kannNichts
Es folgt eine Liste an möglichen
wxWidgets-Versionen und deren
zugehöriger Port:
Ab Version 2.5 werden auch Versionen in
Unicode unterstützt und über einen Unterport
mit dem Suffix -unicode installiert.
Dies kann aber auch über Variablen gehandhabt
werden (siehe ).Die Variablen in
können auf einen oder mehrere (durch Leerzeichen
getrennt) der folgenden Werte gesetzt werden:
Spezifikationen der
wxWidgets-VersionenBeschreibungBeispielEinzelne Version2.4Aufsteigende Versionsnummern2.4+Absteigende Versionsnummern2.6-Versionsinterval (muss aufsteigend sein)2.4-2.6
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.
Variablen zur Festlegung der bevorzugten
wxWidgets-VersionNameBestimmt fürWANT_WX_VERden PortWITH_WX_VERden Benutzer
KomponentenauswahlDesweiteren gibt es Anwendungen, die nicht direkt
wxWidgets-Bibliotheken sind, aber
trotzdem mit diesen zusammenhängen. Diese Anwendungen
können über die Variable
WX_COMPS festgelegt werden. Die folgenden
Komponenten sind verfügbar:
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 ). Die folgenden Typen sind
verfügbar:
Verfügbare Typen von
wxWidgets-AbhängigkeitenNameBeschreibungbuildKomponente wird zum Bau
benötigt – äquivalent zu
BUILD_DEPENDSrunKomponente wird zum Ausführen
benötigt – äquivalent zu
RUN_DEPENDSlibKomponente wird zum Bau und Ausführen
benötigt – äquivalent zu
LIB_DEPENDS
Die Standardwerte für die einzelnen Komponenten
sind in der folgenden Tabelle aufgeführt:
Standardtypen der
wxWidgets-AbhängigkeitenKomponenteTyp der Abhängigkeitwxlibcontriblibpythonrunmozillalibsvglib
Auswahl von
wxWidgets-KomponentenDer folgende Ausschnitt entspricht einem Port, der
die wxWidgets-Version
2.4 und die zugehörigen
Bibliotheken verwendet.USE_WX= 2.4
WX_COMPS= wx contribUnicodeDie wxWidgets-Bibliotheken
unterstützen Unicode seit der Version
2.5. In den Ports sind beide Versionen
verfügbar und können über die folgenden
Variablen ausgewählt werden:
Variablen, um Unicode in den
wxWidgets-Versionen
auszuwählenVariableBeschreibungBestimmt fürWX_UNICODEDer Port funktioniert
ausschließlich mit der
Unicode-Versionden PortWANT_UNICODEDer Port funktioniert in beiden
Versionen – bevorzugt wird jedoch
Unicodeden PortWITH_UNICODEDer Port verwendet die Unicode-Versionden BenutzerWITHOUT_UNICODEDer Port verwendet, falls unterstützt, die
normale Version (falls WX_UNICODE
nicht definiert ist)den Benutzer
Die Variable WX_UNICODE 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
WANT_UNICODE stattdessen.Feststellen der installierten VersionUm eine bereits installierte Version zu finden, muss
WANT_WX definiert werden. Falls diese
Variable nicht auf eine bestimmte Versionsnummer gesetzt
wird, werden die Komponenten einen Suffix mit der
Versionsnummer tragen. Die Variable
HAVE_WX wird gesetzt, falls eine
installierte Version vorgefunden wurde.Installierte
wxWidgets-Versionen
und –Komponenten feststellenDer folgende Ausschnitt kann in einem Port verwendet
werden, der wxWidgets
verwendet, falls es installiert ist, oder falls eine
Option dafür ausgewählt wurde.WANT_WX= yes
.include <bsd.port.pre.mk>
.if defined(WITH_WX) || ${HAVE_WX:Mwx-2.4} != ""
USE_WX= 2.4
CONFIGURE_ARGS+=--enable-wx
.endifDer folgende Ausschnitt kann verwendet werden, um
die Unterstützung für
wxPython zusätzlich zu der
von wxWidgets zu aktivieren
(beide in Version 2.6), wenn das
installiert ist, oder die Option ausgewählt
wurde.USE_WX= 2.6
WX_COMPS= wx
WANT_WX= 2.6
.include <bsd.port.pre.mk>
.if defined(WITH_WXPYTHON) || ${HAVE_WX:Mpython} != ""
WX_COMPS+= python
CONFIGURE_ARGS+=--enable-wxpython
.endifVordefinierte VariablenDie folgenden Variablen sind in den Ports
verfügbar (nachdem sie entsprechend definiert wurden).
Vordefinierte Variablen für Ports, die
wxWidgets verwendenNameBeschreibungWX_CONFIGPfad zum wxWidgetswx-config-Skript (mit
unterschiedlichem Namen)WXRC_CMDPfad zum wxWidgetswxrc-Programm (mit
unterschiedlichem Namen)WX_VERSIONVersion der wxWidgets, die
verwendet werden soll (z.B. 2.6)WX_UNICODEFalls Unterstützung für Unicode nicht
explizit definiert, jedoch verwendet wird, dann wird die
Unterstützung automatisch aktiviert.
Verarbeitung in
bsd.port.pre.mkFalls die Variablen gleich nach dem Importieren von
bsd.port.pre.mk benutzt werden sollen,
so muss die Variable WX_PREMK definiert
werden.Falls WX_PREMK definiert ist, so
werden Version, Abhängigkeiten, Komponenten und
vordefinierte Variablen nicht geändert, wenn die
Variablen des wxWidgets-Ports
nach dem Einbinden von
bsd.port.pre.mk geändert
werden.Verwendung von
wxWidgets-Variablen
in KommandosDer folgende Ausschnitt zeigt die Verwendung von
WX_PREMK durch Ausführen des
wx-config-Skriptes, um die
vollständige Version als Zeichenkette zu erhalten,
diese dann einer Variablen zuzuweisen und die Variable
anschließend einem Programm zu
übergeben.USE_WX= 2.4
WX_PREMK= yes
.include <bsd.port.pre.mk>
.if exists(${WX_CONFIG})
VER_STR!= ${WX_CONFIG} --release
PLIST_SUB+= VERSION="${VER_STR}"
.endifDie wxWidgets-Variablen
können problemlos in Kommandos benutzt werden, falls
diese in Targets ohne gesetztes
WX_PREMK verwendet werden.Weitere configure-ArgumenteEinige GNU configure-Skripte
können wxWidgets nicht
auffinden, falls nur die Umgebungsvariable
WX_CONFIG gesetzt ist, sondern
benötigen zusätzliche Argumente. Dafür kann
die Variable WX_CONF_ARGS benutzt
werden.
Zulässige Werte für
WX_CONF_ARGSMöglicher WertResultierendes Argumentabsolute--with-wx-config=${WX_CONFIG}relative--with-wx=${LOCALBASE}
--with-wx-config=${WX_CONFIG:T}
Verwendung von LuaDieser Abschnitt beschreibt den Status der
Lua-Bibliotheken in den Ports
und deren Einbindung in das Ports System.EinführungEs gibt viele Probleme bei der gleichzeitigen
Verwendung unterschiedlicher Versionen von
Lua-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.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.Auswahl der VersionUm festzulegen, welche Version von
Lua verwendet werden soll, gibt
es zwei Variablen (falls nur eine der beiden definiert ist,
so wird die andere auf einen Standardwert gesetzt):
Variablen, um die
Lua-Version festzulegenVariableBeschreibungStandardwertUSE_LUAListe der Versionen, welche der Port verwenden
kannAlle verfügbaren VersionenUSE_LUA_NOTListe der Versionen, die der Port nicht verwenden
kannNichts
Es folgt eine Liste an möglichen
Lua-Versionen und deren
zugehöriger Port:
Die Variablen in
können auf einen oder mehrere (durch Leerzeichen
getrennt) der folgenden Werte gesetzt werden:
Spezifikationen der
Lua-VersionenBeschreibungBeispielSpezielle Version4.0Aufsteigende Versionen5.0+Absteigende Versionen5.0-Versionenintervall (muss aufsteigend sein)5.0-5.1
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.
Variablen zur Festlegung der bevorzugten
Lua-VersionNameBestimmt fürWANT_LUA_VERden PortWITH_LUA_VERden Benutzer
Auswahl der
Lua-VersionDer folgende Ausschnitt entspricht einem Port, der
Lua in den Versionen
5.0 oder 5.1
verwenden kann und standardmäßig
5.0 verwendet. Diese Einstellung kann
durch die benutzerdefinierte Variable
WITH_LUA_VER überschrieben
werden.USE_LUA= 5.0-5.1
WANT_LUA_VER= 5.0KomponentenauswahlDesweiteren gibt es Anwendungen, die nicht direkt
Lua-Bibliotheken sind, aber
trotzdem mit diesen zusammenhängen. Diese Anwendungen
können über die Variable
LUA_COMPS festgelegt werden. Die
folgenden Komponenten sind verfügbar:
Verfügbare
Lua-KomponentenNameBeschreibungVersionseinschränkungenluaHauptbibliothekKeinetoluaBibliothek für die Unterstützung von C/C++-Code4.0-5.0rubyRuby-Bindungen4.0-5.0
Es gibt weitere Komponenten, die jedoch Module
für den Interpreter sind und nicht von Anwendungen
benutzt werden (nur von anderen Modulen).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 ). Die folgenden Typen sind
verfügbar:
Verfügbare Typen von
Lua-AbhängigkeitenNameBeschreibungbuildKomponente wird zum Bau
benötigt – äquivalent zu
BUILD_DEPENDSrunKomponente wird zum Ausführen
benötigt – äquivalent zu
RUN_DEPENDSlibKomponente wird zum Bau und zum Ausführen
benötigt – äquivalent zu
LIB_DEPENDS
Die Standardwerte für die einzelnen Komponenten
sind in der folgenden Tabelle aufgeführt:
Standardtypen für
Lua-AbhängigkeitenKomponenteTyp der Abhängigkeitlualib für
4.0-5.0 (shared) und
build für 5.1
(static)toluabuild (static)rubylib (shared)
Auswahl von
Lua-KomponentenDer folgende Ausschnitt entspricht einem Port,
welcher die Lua-Version
4.0 und die zugehörigen
Ruby-Bindungen
verwendet.USE_LUA= 4.0
LUA_COMPS= lua rubyFeststellen der installierten VersionUm eine bereits installierte Version zu finden, muss
WANT_LUA definiert werden. Falls diese
Variable nicht auf eine bestimmte Versionsnummer gesetzt
wird, werden die Komponenten einen Suffix mit der
Versionsnummer tragen. Die Variable
HAVE_LUA wird gesetzt, falls eine
installierte Version vorgefunden wurde.Installierte
Lua-Versionen
und– Komponenten feststellenDer folgende Ausschnitt kann in einem Port verwendet
werden, der Lua benutzt, falls
es installiert ist oder eine Option dafür
ausgewählt wurde.WANT_LUA= yes
.include <bsd.port.pre.mk>
.if defined(WITH_LUA5) || ${HAVE_LUA:Mlua-5.[01]} != ""
USE_LUA= 5.0-5.1
CONFIGURE_ARGS+=--enable-lua5
.endifDer folgende Ausschnitt kann verwendet werden, um
die Unterstützung für
tolua zusätzlich zu der
von Lua zu aktivieren (beide in
Version 4.0), wenn dies installiert ist oder die Option
ausgewählt wurde.USE_LUA= 4.0
LUA_COMPS= lua
WANT_LUA= 4.0
.include <bsd.port.pre.mk>
.if defined(WITH_TOLUA) || ${HAVE_LUA:Mtolua} != ""
LUA_COMPS+= tolua
CONFIGURE_ARGS+=--enable-tolua
.endifVordefinierte VariablenDie folgenden Variablen sind in den Ports
verfügbar (nachdem sie entsprechend definiert wurden).
Vordefinierte Variablen für Ports, die
Lua verwendenNameBeschreibungLUA_VERDie Lua-Version, die
verwendet wird (z.B. 5.1)LUA_VER_SHDie Hauptversion für
shared-Lua-Bibliotheken (z.B.
1)LUA_VER_STRDie Lua-Version ohne die
Punkte (z.B. 51)LUA_PREFIXDer Präfix, unter dem
Lua (und Komponenten)
installiert istLUA_SUBDIRDas Verzeichnis unter
${PREFIX}/bin,
${PREFIX}/share und
${PREFIX}/lib, in welchem
Lua installiert istLUA_INCDIRDas Verzeichnis, in dem
Lua- und
tolua-Header-Dateien
installiert sindLUA_LIBDIRDas Verzeichnis, in dem
Lua– und
tolua-Bibliotheken
installiert sindLUA_MODLIBDIRDas Verzeichnis, in dem
Lua Modul-Bibliotheken
(.so) installiert sindLUA_MODSHAREDIRDas Verzeichnis, in dem
Lua-Module
(.lua) installiert sindLUA_PKGNAMEPREFIXDer Paketnamen-Präfix, der von
Lua-Modulen verwendet
wirdLUA_CMDDas Verzeichnis, in dem der
Lua-Interpreter liegtLUAC_CMDDas Verzeichnis, in dem der
Lua-Compiler liegtTOLUA_CMDDas Verzeichnis, in dem das
tolua-Programm liegt
Einem Port mitteilen, in welchem Verzeichnis
Lua liegtDer folgende Ausschnitt zeigt, wie einem Port,
welcher ein configure-Skript verwendet, mitgeteilt werden
kann, wo die Lua-Header-Dateien
und Bibliotheken liegen.
USE_LUA= 4.0
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"Verarbeitung in
bsd.port.pre.mkFalls die Variablen gleich nach dem Einbinden von
bsd.port.pre.mk benutzt werden sollen,
so muss die Variable LUA_PREMK definiert
werden.Falls LUA_PREMK definiert ist, so
werden Version, Abhängigkeiten, Komponenten und
vordefinierte Variablen nicht geändert, wenn die
Variablen des Lua-Ports
nach dem Einbinden von
bsd.port.pre.mk geändert
werden.Verwendung von
Lua-Variablen in
KommandosDer folgende Ausschnitt zeigt die Verwendung von
LUA_PREMK durch Ausführen des
Lua-Interpreters, um die
vollständige Version als Zeichenkette zu erhalten,
diese dann einer Variablen zuzuweisen und die Variable
schließlich einem Programm zu übergeben.USE_LUA= 5.0
LUA_PREMK= yes
.include <bsd.port.pre.mk>
.if exists(${LUA_CMD})
VER_STR!= ${LUA_CMD} -v
CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
.endifDie Lua-Variablen
können problemlos in Befehlen benutzt werden, falls
diese in Targets ohne gesetztes
LUA_PREMK verwendet werden.Xfce verwendenDie USE_XFCE-Variable wird für
die automatische Konfiguration der Abhängigkeiten
eingesetzt, welche die Xfce-Basisbibliotheken oder Anwendungen
wie x11-toolkits/libxfce4gui und
x11-wm/xfce4-panel
verwenden.Die folgenden Xfce-Bibliotheken und -Anwendungen werden
derzeit unterstützt:libexo: x11/libexolibgui: x11-toolkits/libxfce4guilibutil: x11/libxfce4utillibmcs: x11/libxfce4mcsmcsmanager: sysutils/xfce4-mcs-managerpanel: x11-wm/xfce4-panelthunar: x11-fm/thunarwm: x11-wm/xfce4-wmxfdev: dev/xfce4-dev-toolsDie folgenden zusätzlichen Parameter werden
unterstützt:configenv: Benutzen Sie dies, wenn Ihr Port eine
speziell angepasste
CONFIGURE_ENV-Variable benötigt,
um seine erforderlichen Bibliotheken zu finden.
-I${LOCALBASE}/include
-L${LOCALBASE}/lib wird CPPFLAGS
hinzugefügt und ergibt
CONFIGURE_ENV.Wenn also ein Port von sysutils/xfce4-mcs-manager
abhängt und die speziellen CPPFLAGS in seiner
configure-Umgebung verlangt, dann würde die Syntax wie
folgt aussehen:USE_XFCE= mcsmanager configenvBenutzung von Datenbanken
Variablen für Ports, die Datenbanken
benutzenVariableBedeutungUSE_BDBFalls die Variable auf yes
gesetzt ist, füge eine Abhängigkeit von
databases/db41
hinzu. Die Variable kann auch folgende Werte
annehmen: 2, 3, 40, 41, 42, 43, 44, 45, 46 oder 47.
Sie können eine Folge akzeptierter Werte
angeben - USE_BDB=42+ stellt die
höchste installierte Version fest und greift
auf 42 zurück, falls sonst nichts installiert
ist.USE_MYSQLFalls die Variable auf yes
gesetzt ist, füge databases/mysql50-server
als Abhängigkeit hinzu. Die damit
verknüpfte Variable
WANT_MYSQL_VER kann Werte wie
323, 40, 41, 50, 51 oder 60 annehmen.USE_PGSQLFalls die Variable auf yes
gesetzt ist, füge eine Abhängigkeit von
databases/postgresql82
hinzu. Die damit verknüpfte Variable
WANT_MYSQL_VER kann Werte wie 73,
74, 80, 81, 82 oder 83 annehmen.
Starten und Anhalten von Diensten (rc Skripten)rc.d-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 rc.d-Framework. Details zu
deren Benutzung können im rc.d Kapitel
des Handbuchs nachgelesen werden. Ausführliche
Beschreibungen der verfügbaren Befehle stehen in
&man.rc.8; und &man.rc.subr.8;. Desweiteren gibt es einen Artikel zu
praktischen Aspekten bezüglich
rc.d-Skripten.Ein oder mehrere rc-Skripten können installiert
werden mittels:USE_RC_SUBR= doormandSkripten müssen im Unterverzeichnis
files abgelegt und jeder Skript-Datei
muss ein .in-Suffix hinzugefügt
werden. Der einzige Unterschied zu einem
rc.d-Skript aus dem Basissystem ist, dass
die Zeile . /etc/rc.subr in
. %%RC_SUBR%% umbenannt werden muss,
da ältere Versionen von &os; die Datei
/etc/rc.subr nicht besitzen.
Standarderweiterungen wie SUB_LIST werden
ebenfalls unterstützt. Die Verwendung von
%%PREFIX%% und
%%LOCALBASE%% wird dringend empfohlen.
Näheres zu SUB_LIST kann im zugehörigen Kapitel
nachgelesen werden.Für &os;-Versionen, die älter als 6.1-RELEASE
sind, ist die Integration mittels &man.rcorder.8;
möglich, indem USE_RCORDER anstatt
USE_RC_SUBR verwendet wird. Die Verwendung
dieser Methode wird aber nicht mehr empfohlen.Seit &os; 6.1-RELEASE sind lokale
rc.d-Skripten (inklusive der durch Ports
installierten) im allgemeinen &man.rcorder.8; des
Basissystems.Beispiel eines einfachen
rc.d-Skripts:#!/bin/sh
# PROVIDE: doormand
# REQUIRE: LOGIN
#
# 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.
#
. %%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"Für die Wertzuweisung von Variablen sollte
"=" anstatt ":=" 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
doormand_flags="" in seiner
rc.conf.local-Datei stehen haben, und
eine Variablenzuweisung mittels ":=" würde in
diesem Fall die Benutzerdefinition überschreiben.Der Suffix des rc-Skriptes wird durch
RC_SUBR_SUFFIX für die weitere
Verwendung im Makefile des Ports
bereitgestellt. Aktuelle Versionen von &os; fügen keinen
Suffix den Skriptnamen hinzu im Gegensatz zu ältere
Versionen, die dies mit dem Suffix .sh
taten.Es sollten keine weiteren Skripten mit der
.sh-Endung hinzugefügt werden.
Irgendwann wird es ein Massenumbenennen aller Skripten im
Repository geben, die immer noch diese Endung haben.Anhalten und Deinstallieren von DienstenEs 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.Der Datei pkg-plist sollte eine
Zeile wie folgt zugefügt werden:@stopdaemon doormandDas Argument muss dabei mit dem Inhalt der
USE_RC_SUBR-Variablen
übereinstimmen.Fortgeschrittene
pkg-plist-MethodenÄnderungen an pkg-plist mit
Hilfe von make-VariablenEinige Ports, insbesondere die
p5--Ports, müssen, abhängig von
ihren Konfigurationsoptionen (oder im Falle der p5-Ports von
der perl-Version), die
pkg-plist verändern. Um dies zu
vereinfachen, werden für jeden Eintrag in
pkg-plist die Variablen
%%OSREL%%, %%PERL_VER%%
und %%PERL_VERSION%% durch die jeweiligen
Werte ersetzt. Der Wert von %%OSREL%% ist
die Revisionsnummer des Betriebssystems (z.B.
4.9). %%PERL_VERSION%%
und %%PERL_VER%% geben die
vollständige Versionsnummer von perl
(z.B. 5.8.9) an. Weitere, die
Dokumentationsdateien des Ports betreffende
%%VARS%%, werden
im entsprechenden
Abschnitt erläutert.Falls Sie weitere Ersetzungen von Variablen
durchführen müssen, können Sie in der Variable
PLIST_SUB eine Liste von
VAR=VALUE-Paaren
angeben, wobei in der pkg-plist%%VAR%% durch
VALUE ersetzt wird.Wenn Sie z.B. einen Port haben, der viele Dateien in ein
versionsspezifisches Unterverzeichnis installiert, dann
können Sie etwas wieOCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}in das Makefile schreiben und
%%OCTAVE_VERSION%% verwenden,
unabhängig davon, wo die Variable in
pkg-plist verwendet wird. In diesem Fall
müssen Sie bei einem Upgrade des Ports nicht dutzende
(oder manchmal sogar hunderte) Zeilen in
pkg-plist anpassen.Diese Ersetzung (ebenso wie das Hinzufügen weiterer
Manualpages) wird
zwischen den pre-install- und
do-install-Targets ausgeführt,
indem aus PLIST
gelesen und in
TMPPLIST geschrieben
wird (Standard:
WRKDIR/.PLIST.mktmp).
Falls Ihr Port also
PLIST während dem
Erstellen generiert, so sollte dies vor oder in
pre-install geschehen. Muss Ihr Port
die resultierende Datei verändern, so sollte dies in
post-install mit der Ausgabedatei
TMPPLIST
erfolgen.Eine weitere Möglichkeit, die Paketliste eines
Ports zu verändern, besteht darin die Variablen
PLIST_FILES und
PLIST_DIRS zu setzen. Der Wert jeder der
beiden Variablen stellt eine Liste von Pfadnamen dar, die
zusammen mit dem Inhalt von
PLIST in
TMPPLIST geschrieben
wird. Dabei unterliegen die Namen in
PLIST_FILES und
PLIST_DIRS der weiter oben beschriebenen
Substitution von
%%VAR%%. Die
Namen aus PLIST_FILES werden ansonsten
unverändert in die endgültige Paketliste
übernommen, während den Namen aus
PLIST_DIRS noch der Wert von
@dirrm vorangestellt wird. Damit die
Verwendung von PLIST_FILES und
PLIST_DIRS überhaupt möglich
ist, müssen diese gesetzt werden, bevor
TMPPLIST geschrieben
wird – z.B. in
pre-install oder vorher.Leere VerzeichnisseAufräumen leerer VerzeichnisseBitte sorgen Sie dafür, dass ihre Ports bei der
Deinstallation leere Verzeichnisse löschen. Dazu wird
für jedes Verzeichnis, das der Port erzeugt hat, eine
@dirrm-Zeile angegeben. Um ein
Verzeichnis zu löschen müssen Sie zuerst dessen
Unterverzeichnisse entfernen. :
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/onekoEs kann allerdings auch vorkommen, dass
@dirrm Fehler ausgibt, da andere Ports
ein Verzeichnis ebenfalls nutzen. Deshalb können Sie
@dirrmtry verwenden, um nur Verzeichnisse
zu löschen, die wirklich leer sind, und damit
Warnhinweise vermeiden.@dirrmtry share/doc/gimpDadurch wird es weder eine Fehlermeldung geben noch
wird &man.pkg.delete.1; abnormal beendet werden - auch dann
nicht, wenn
${PREFIX}/share/doc/gimp
nicht leer ist, da andere Ports hier ebenfalls Dateien
installiert haben.Erstellen leerer VerzeichnisseUm 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
pkg-plist über der entsprechenden
@dirrm Zeile eingetragen werden:@exec mkdir -p %D/share/foo/templatesKonfigurationsdateienSollte Ihr Port Konfigurationsdateien in
PREFIX/etc
benötigen, so sollten Sie diese
nicht einfach installieren und in
pkg-plist auflisten. Dies würde
&man.pkg.delete.1; veranlassen, diese Dateien zu löschen,
selbst wenn wenn sie vom Benutzer editiert wurden.Stattdessen sollten Beispieldateien mit einem
entsprechenden Suffix (beispielsweise
filename.sample)
versehen werden. Ist die Konfigurationsdatei nicht vorhanden,
so sollte die Beispieldatei an deren Platz kopiert werden. Bei
der Deinstallation sollte die Konfigurationsdatei
gelöscht werden, aber nur, wenn sie nicht vom Benutzer
verändert wurde. Das alles muss sowohl im
Makefile des Ports als auch in der
pkg-plist (für die Installation aus
einem Paket) sichergestellt werden.Beispiel aus einem Makefile:post-install:
@if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \
fiBeispiel aus einer pkg-plist:@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
etc/orbit.conf.sample
@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fiWahlweise können Sie auch eine Nachricht ausgegeben lassen,
in der Sie den Nutzer auffordern, die Datei an die richtige
Stelle zu kopieren und zu bearbeiten, bevor das Programm
ausgeführt werden kann.Dynamische oder statische PaketlisteEine statische Paketliste ist eine
Paketliste, die in der Ports-Sammlung, entweder in Form der
pkg-plist (mit oder ohne der Ersetzung
von Variablen) oder durch PLIST_FILES und
PLIST_DIRS im Makefile
eingebettet, verfügbar ist. Selbst wenn der Inhalt durch
ein Werkzeug oder ein Target im Makefile automatisch erzeugt
wird, bevor die Datei von einem Committer
in die Ports-Sammlung aufgenommen wird, so ist dies immer noch
eine statische Liste, da es möglich ist den Dateiinhalt
zu betrachten ohne ein Distfile Herunterladen oder Kompilieren
zu müssen.Eine dynamische Paketliste ist eine
Paketliste, die beim Kompilieren des Ports erstellt wird,
abhängig davon, welche Dateien und Verzeichnisse
installiert werden. Es ist nicht möglich diese Liste zu
betrachten, bevor der Quelltext heruntergeladen und kompiliert
oder nachdem ein make clean ausgeführt
wurde.Der Einsatz dynamischer Paketlisten ist zwar nicht
untersagt, aber Sie sollten, wann immer das möglich ist,
statische Paketlisten verwenden, da die Nutzer dann
&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 Javadoc
erzeugen).Maintainer, die dynamische Paketlisten bevorzugen,
werden dazu aufgefordert, neue Targets zu Ihren Ports
hinzuzufügen, welche die
pkg-plist-Datei erzeugen, sodass Benutzer
den Inhalt überprüfen können.Automatisiertes Erstellen von PaketlistenAls Erstes sollten Sie sich vergewissern, dass der Port
bis auf pkg-plist vollständig
ist.Als Nächstes erstellen Sie einen temporären
Verzeichnisbaum, in welchem Ihr Port installiert werden kann,
und installieren Sie alle Abhängigkeiten.&prompt.root; mkdir /var/tmp/$(make -V PORTNAME)
&prompt.root; mtree -U -f $(make -V MTREE_FILE) -d -e -p /var/tmp/$(make -V PORTNAME)
&prompt.root; make depends PREFIX=/var/tmp/$(make -V PORTNAME)Speichern Sie die Verzeichnisstruktur in einer neuen
Datei.&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort > OLD-DIRSErstellen Sie eine leere
pkg-plist-Datei:&prompt.root; :>pkg-plistWenn Ihr Port auf PREFIX achtet (was
er machen sollte), so kann der Port nun installiert und die
Paketliste erstellt werden.&prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME)
&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * \! -type d) | sort > pkg-plistSie müssen auch alle neu erstellten Verzeichnisse in
die Paketliste aufnehmen.&prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plistZu guter Letzt muss die Paketliste noch manuell
aufgeräumt werden - es funktioniert eben nicht
alles automatisch. Manualpages sollten im
Makefile des Ports unter
MANn
aufgeführt sein und nicht in der Paketliste.
Konfigurationsdateien des Benutzers sollten entfernt oder als
filename.sample
installiert werden. Die info/dir-Datei
sollte nicht aufgeführt sein und die zugehörigen
install-info-Zeilen sollten
hinzugefügt werden, wie im info files-Abschnitt
beschrieben. Alle Bibliotheken, die der Port installiert,
sollten aufgelistet werden, wie es im Shared Libraries-Abschnitt
festgelegt ist.Alternativ dazu können Sie das
plist-Skript in
/usr/ports/Tools/scripts/ verwenden, um
die Paketliste automatisch zu erstellen. Das
plist-Skript ist ein
Ruby-Skript, das die meisten der in
den vorangehenden Absätzen kurz dargestellten manuellen
Schritte automatisiert.Der erste Schritt ist
derselbe wie oben: Nehmen Sie die ersten drei Zeilen, also
mkdir, mtree und
make depends. Installieren und bauen Sie
dann den Port:&prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME)Und lassen Sie plist die
pkg-plist-Datei erstellen:&prompt.root; /usr/ports/Tools/scripts/plist -Md -m $(make -V MTREE_FILE) /var/tmp/$(make -V PORTNAME) > pkg-plistDie Paketliste muss immer noch von Hand aufgeräumt
werden, wie es oben erklärt wurde.Ein weiteres Werkzeug zur Erzeugung einer ersten
pkg-plist-Datei ist ports-mgmt/genplist. Wie bei jedem
automatisierten Hilfswerkzeug, sollte die erzeugte
pkg-plist-Datei überprüft und
bei Bedarf von Hand nachbearbeitet werden.Die pkg-*
DateienEs gibt noch einige Tricks mit
pkg-*, die wir
noch nicht erwähnt haben, die aber oft sehr praktisch
sind.pkg-messageWenn Sie dem Anwender bei der Installation weitere
Informationen anzeigen wollen, so können Sie diese
Nachricht in pkg-message 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.Wollen Sie nur ein paar Zeilen über die
Einstellungen zum Erstellen des Ports oder Warnungen ausgeben,
benutzen Sie ECHO_MSG.
pkg-message ist nur für Schritte
nach der Installation vorgesehen. Sie sollten den Unterschied
zwischen ECHO_MSG und
ECHO_CMD beachten: Ersteres wird benutzt,
um Informationen auf dem Bildschirm auszugeben, während
Letzteres für Kommando-Pipelining bestimmt ist.Ein gutes Beispiel für die Benutzung der beiden
Befehle ist in shells/bash2/Makefile zu
finden: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) >/etc/shells
@${RM} /etc/shells.bakDie pkg-message wird nicht zur
pkg-plist hinzugefügt. Sie wird
auch nicht automatisch angezeigt, falls ein Anwender den
Port installiert. Sie müssen also die Ausgabe selbst im
post-install-Ziel des Make-Vorgangs
veranlassen.pkg-installSollte 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
pkg-install benutzen. Dieses Skript wird
automatisch dem Paket hinzugefügt und zweimal von
&man.pkg.add.1; ausgeführt: Zuerst als
${SH} pkg-install ${PKGNAME}
PRE-INSTALL und beim zweiten Mal als
${SH} pkg-install ${PKGNAME}
POST-INSTALL. $2 kann also
getestet werden, um festzustellen, in welchem Modus das Skript
ausgeführt wird. Die Umgebungsvariable
PKG_PREFIX wird auf das Verzeichnis gesetzt, in
welches das Paket installiert wird. Siehe &man.pkg.add.1;
für weiterführende Informationen.Das Skript wird nicht automatisch ausgeführt,
wenn Sie den Port mit make install
installieren. Wenn Sie es ausführen lassen wollen, dann
müssen Sie es im Makefile aufrufen:
PKG_PREFIX=${PREFIX} ${SH}
${PKGINSTALL} ${PKGNAME}
PRE-INSTALL.pkg-deinstallDieses Skript wird ausgeführt, wenn ein Paket
deinstalliert wird.Es wird zweimal von &man.pkg.delete.1; aufgerufen. Das
erste Mal als ${SH} pkg-deinstall
${PKGNAME} DEINSTALL und dann als
${SH} pkg-deinstall ${PKGNAME}
POST-DEINSTALL.pkg-reqMuss Ihr Port entscheiden, ob er installiert werden
soll oder nicht, können Sie ein
pkg-req-Bedingungsskript
verwenden. Dieses wird automatisch bei der Installation/
Deinstallation aufgerufen, um zu entscheiden, ob die
Installation/ Deinstallation fortgesetzt werden soll.Das Skript wird während der Installation von
&man.pkg.add.1; als pkg-req ${PKGNAME}
INSTALL aufgerufen. Bei der Deinstallation wird es
von &man.pkg.delete.1; als pkg-req ${PKGNAME}
DEINSTALL ausgeführt.Ändern der Namen der
pkg-*
DateienAlle Namen der
pkg-* Dateien
werden durch Variablen festgelegt. Sie können sie bei
Bedarf also im Makefile des Ports
ändern. Das ist besonders nützlich, wenn Sie die
gleichen pkg-*
Dateien in mehreren Ports nutzen oder in eine der oben genannten
Dateien schreiben wollen. Schreiben Sie niemals außerhalb
des Unterverzeichnisses WRKDIRpkg-*, eine Erklärung hierzu finden
Sie in Schreiben ausserhalb von
WRKDIR.Hier ist eine Liste von Variablennamen und ihren
Standardwerten (PKGDIR ist
standardmäßig
${MASTERDIR}).VariableStandardwertDESCR${PKGDIR}/pkg-descrPLIST${PKGDIR}/pkg-plistPKGINSTALL${PKGDIR}/pkg-installPKGDEINSTALL${PKGDIR}/pkg-deinstallPKGREQ${PKGDIR}/pkg-reqPKGMESSAGE${PKGDIR}/pkg-messageBitte benutzen Sie diese Variablen anstatt
PKG_ARGS zu ändern. Wenn Sie
PKG_ARGS modifizieren, werden diese Dateien
bei der Installation des Ports nicht korrekt in
/var/db/pkg installiert.Nutzung von SUB_FILES und
SUB_LISTDie Variablen SUB_FILES und
SUB_LIST sind nützlich, um dynamische
Werte in Port-Dateien zu verwenden, wie beispielsweise der
Installations-PREFIX in
pkg-message.Die Variable SUB_FILES enthält
eine Liste von Dateien, die automatisch verändert werden.
Jede Datei in
SUB_FILES muss ein entsprechendes Pendant
datei.in im Verzeichnis
FILESDIR haben. Die modifizierte Version
wird in WRKDIR angelegt. Dateien, die als
Werte von USE_RC_SUBR (oder veraltet in
USE_RCORDER) gespeichert werden, werden
automatisch zu SUB_FILES hinzugefügt.
Für die Dateien pkg-message,
pkg-install,
pkg-deinstall und
pkg-req werden die jeweiligen
Makefile-Variablen selbsttätig auf die geänderte
Version der Datei gesetzt.Die Variable SUB_LIST ist eine Liste
von VAR=WERT-Paaren. Jedes Paar
%%VAR%% in den Dateien von
SUB_FILES wird mit WERT
ersetzt. Einige gebräuchliche Paare werden automatisch
definiert: PREFIX,
LOCALBASE,
DATADIR, DOCSDIR,
EXAMPLESDIR. Jede Zeile, die mit
@comment beginnt, wird nach der
Variablen-Ersetzung aus der neu erstellten Datei
gelöscht.Im folgenden Beispiel wird %%ARCH%%
mit der Systemarchitektur in pkg-message
ersetzt:SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}Beachten Sie bitte, dass in diesem Beispiel die Datei
pkg-message.in im Verzeichnis
FILESDIR vorhanden sein muss.Hier ein Beispiel für eine gute
pkg-message.in: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.Ihren Port testenmake describe ausführenEinige der &os;-Werkzeuge zur Pflege von Ports, wie zum
Beispiel &man.portupgrade.1;, verwenden eine Datenbank names
/usr/ports/INDEX, welche Eigenschaften,
wie z.B. Port-Abhängigkeiten, verfolgt.
INDEX wird vom Makefile der höchsten
Ebene, ports/Makefile, mittels
make index erstellt, welches in das
Unterverzeichnis jedes Ports wechselt und dort make
describe ausführt. Wenn also make
describe bei einem Port fehlschlägt, kann
INDEX nicht generiert werden und schnell
werden viele Leute darüber unzufrieden sein.Es ist wichtig diese Datei erzeugen zu können,
unabhängig davon, welche Optionen in
make.conf vorhanden sind. Bitte
vermeiden Sie es daher beispielsweise
.error-Anweisungen zu benutzen, wenn zum
Beispiel eine Abhängigkeit nicht erfüllt wird
(Lesen Sie dazu bitte ).Wenn make describe eine Zeichenkette
anstatt einer Fehlermeldung erzeugt, sind Sie wahrscheinlich
auf der sicheren Seite. Vergleichen Sie die erzeugte
Zeichenkette mit bsd.port.mk, um mehr
über deren Bedeutung zu erfahren.Beachten Sie bitte außerdem, dass die Benutzung
einer aktuellen Version von portlint (wie
im nächsten Abschnitt beschrieben) automatisch
make describe startet.PortlintBitte überprüfen Sie Ihre Arbeit stets mit
portlint,
bevor Sie diese einreichen oder committen.
portlint warnt Sie bei häufigen
Fehlern, sowohl funktionaler als auch stilistischer Natur.
Für einen neuen (oder repokopierten) Port ist
portlint -A die gründlichste Variante;
für einen bereits existierenden Port ist
portlint -C ausreichend.Da portlint 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.Port ToolsDas Programm ports-mgmt/porttools ist Teil der
Ports-Sammlung.port 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
port test verwenden, damit die Tests,
inklusive der portlint-Überprüfung,
durchgeführt werden. Dieser Befehl spürt ausserdem
alle nicht in pkg-plist enthaltenen
Dateien auf und gibt eine Liste dieser aus. Hier ein
Beispiel:&prompt.root; port test /usr/ports/net/csupPREFIX und
DESTDIRPREFIX bestimmt, an welche Stelle der
Port installiert werden soll. In der Regel ist
dies/usr/local oder
/opt. Benutzer können
PREFIX setzen, wie sie wollen. Ihr Port
muss sich an diese Variable halten.DESTDIR, wenn es vom Benutzer gesetzt
wird, bestimmt die alternative Umgebung (in der Regel eine
Jail oder ein installiertes System, welches an anderer Stelle
als / eingehängt ist).
Ein Port wird unter
DESTDIR/PREFIX
installiert und registriert sich in der Paket-Datenbank unter
DESTDIR/var/db/pkg.
Da DESTDIR mittels eines
&man.chroot.8;-Aufrufs vom Ports-System automatisch gesetzt
wird, brauchen Sie keine Änderungen oder besondere Pflege
für DESTDIR-konforme Ports.Der Wert von PREFIX wird auf
LOCALBASE gesetzt (Standard ist
/usr/local).
Falls USE_LINUX_PREFIX gesetzt ist, wird
PREFIXLINUXBASE
annehmen (Standard ist
/compat/linux).Die Vermeidung der hart kodierten Angaben von
/usr/local oder
/usr/X11R6 im Quelltext wird den Port
viel flexibler machen und erleichtert es die Anforderungen
anderer Einsatzorte zu erfüllen. Für X-Ports, die
imake benutzen, geschieht dies automatisch;
andernfalls kann dies erreicht werden, indem alle Angaben von
/usr/local (oder
/usr/X11R6 für X-Ports, die nicht
imake benutzen) in den verschiedenen
Makefiles im Port ersetzt werden, um
${PREFIX} zu lesen, da diese Variable
automatisch an jede Stufe des Build- und Install-Prozesses
übergeben wird.Vergewissern Sie sich bitte, dass Ihre Anwendung nichts
unter /usr/local an Stelle von
PREFIX installiert. Um dies festzustellen,
können Sie folgendes machen:&prompt.root; make clean; make package PREFIX=/var/tmp/$(make -V PORTNAME)Wenn etwas außerhalb von PREFIX
installiert wird, so gibt der Prozess der Paketerstellung eine
Meldung aus, dass es die Dateien nicht finden kann.Dies prüft nicht das Vorhandensein eines internen
Verweises oder die richtige Verwendung von
LOCALBASE für Verweise auf Dateien
anderer Ports. Das Testen der Installation in
/var/tmp/$(make -V PORTNAME) würde
dies erledigen.Die Variable PREFIX kann in Ihrem
Makefile oder der Umgebung des Benutzers
neu gesetzt werden. Allerdings wird für einzelne Ports
dringend davon abgeraten diese Variable in den
Makefiles direkt zu setzen.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 PAGER erwartet, dass es
den vollständigen Pfadnamen von less
enthält, benutzen Sie folgendes Compiler-Flag:
-DPAGER=\"${LOCALBASE}/bin/less\"
anstatt -DPAGER=\"/usr/local/bin/less\".
Somit ist die Wahrscheinlichkeit höher, dass es auch
funktioniert, wenn der Administrator den ganzen
/usr/local-Baum an eine andere Stelle
verschoben hat.Die TinderboxWenn Sie ein begeisterter Ports-Entwickler sind
möchten Sie vielleicht einen Blick auf die
Tinderbox werfen. Es ist ein
leistungsstarkes System zur Erstellung und zum Testen von
Ports, welches auf Skripten basiert, die auf Pointyhat verwendet werden. Sie
können Tinderbox installieren,
indem Sie den Port ports-mgmt/tinderbox benutzen.
Bitte lesen Sie die mitgelieferte Dokumentation
gründlich, da die Konfiguration nicht einfach ist.Um Näheres darüber zu erfahren, besuchen Sie
bitte die Tinderbox
Homepage.Einen Port aktualisierenWenn 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 ports/ports-current der FreeBSD
FTP-Spiegelseiten. Wenn Sie allerdings mit mehr als ein paar
Ports arbeiten, werden Sie es wahrscheinlich einfacher finden
CVSup zu benutzen, um Ihre gesamte
Ports-Sammlung aktuell zu halten, wie es im Handbuch
beschrieben wird. Das hat zusätzlich den Vorteil, dass Sie
so auch alle Abhängigkeiten des Ports aktuell
halten.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
FreeBSD
Problembericht Datenbank (PR - Problem Report) (auch
bekannt als GNATS). Wählen Sie dazu
Ports im Drop-Down-Menü und geben Sie
den Namen des Ports ein.Allerdings wird manchmal vergessen den Namen des Ports
eindeutig im Feld für die Zusammenfassung anzugeben. In
diesem Fall können Sie das FreeBSD
Ports Monitoring System (auch bekannt als
portsmon) nutzen. Dieses versucht PRs von
Ports nach Portname zu sortieren. Um PRs nach einem bestimmten
Port zu durchsuchen können Sie die Übersicht
eines Ports verwenden.Wenn es keine wartenden PRs gibt, ist der nächste
Schritt eine E-Mail an den Maintainer des Ports zu schicken, wie
von make maintainer 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
ports@FreeBSD.org 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.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. Bitte führen Sie die Änderungen
durch und speichern Sie die Ausgabe des rekursiven
diff des neuen und alten Portverzeichnisses
(wenn Ihr verändertes Portverzeichnis z.B.
superedit und das Original
superedit.bak heißt, dann speichern
Sie bitte die Ergebnisse von diff -ruN superedit.bak
superedit). Sowohl vereinheitlichendes als auch
kontextabhängiges diff (Auflistung der Unterschiede zweier
Dateien) sind akzeptabel, aber im Allgemeinen bevorzugen
Port-Committer vereinheitlichende diffs.
Bitte beachten Sie die Verwendung der
-N-Option. Dies ist der gebräuchliche
Weg diff 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. Um gängige Operationen mit Korrekturdateien zu
vereinfachen, können Sie
/usr/ports/Tools/scripts/patchtool.py
benutzen. Aber lesen Sie bitte vorher
/usr/ports/Tools/scripts/README.patchtool.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 2000 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
Developer's Handbook nach).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 [maintainer
update] an den Anfang Ihrer Zusammenfassung und setzen
Sie die Klasse des PR auf
maintainer-update. Ansonsten sollte die
Klasse des PR change-request
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.Bevor Sie den PR mit &man.send-pr.1; abschicken, sollten
Sie den Abschnitt Den
Problembericht schreiben im Artikel über
Problemberichte lesen. Dieser enthält sehr viel mehr
Informationen darüber, wie man nützliche
Problemberichte verfasst.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 pkg_add -r
installieren.Noch einmal: Bitte verwenden Sie &man.diff.1; und nicht
&man.shar.1;, um Aktualisierungen existierender Ports zu
senden.Nun, da Sie all das geschafft haben, werden Sie in nachlesen können, wie Sie den Port
aktuell halten.Sicherheit der PortsWarum Sicherheit so wichtig istEs 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.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 – 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 – neben
Softwarefehlern – haben kann, und machen
deshalb Sicherungskopien wichtiger Daten. Zumal ein
kritischer Fehler sehr schnell entdeckt wird.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.Sicherheitslücken schliessenBei 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 den Port als
FORBIDDEN markieren 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
die Standardvorgehensweise zum
Einreichen von Änderungen beachtet
werden – es sei denn, Sie haben das Recht
diese direkt in den Ports-Baum zu committen.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.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– und
WWW-Spiegel verteilt und die unsichere Version damit
verdrängt. PORTREVISION sollte
erhöht werden – es sei denn,
PORTREVISION hat sich im Laufe der
Korrektur des Fehlers geändert. Das heißt, Sie
sollten PORTREVISION 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 PORTREVISION
somit schon verändert wurde. Bitte beachten
Sie den betreffenden
Abschnitt für weitere Informationen.Die Community informiert haltenDie VuXML-DatenbankEin 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 müssen.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 der FreeBSD
VuXML-Datenbank aufgezeichnet. Das Team der
Sicherheitsverantwortlichen beobachtet diese wegen
Angelegenheiten, die Ihr Eingreifen erfordern.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 – egal
welche – zögern Sie bitte nicht die
Sicherheitsverantwortlichen zu kontaktieren, wie es in den
FreeBSD
Sicherheitsinformationen beschrieben wird.In Ordnung, Sie haben sich also für den
schwierigen Weg entschieden. Wie vielleicht aus dem Titel
hervorgeht, ist die VuXMl-Datenbank hauptsächlich ein
XML-Dokument. Die Quelldatei vuln.xml
können Sie im Port security/vuxml finden. Deshalb
wird der komplette Pfadname PORTSDIR/security/vuxml/vuln.xml
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.Eine kurze Einführung in VuXMLDas 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 <Tag> muss ein passendes
</Tag> 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 – das heißt
komplexere Regeln zur Schachtelung. Klingt so ähnlich
wie HTML, oder? Der größte Unterschied ist: XML
ist erweiterbar
(eXtensible) – 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.Lassen Sie uns nun einen realistischen VuXML-Eintrag
betrachten:<vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9">
<topic>Several vulnerabilities found in Foo</topic>
<affects>
<package>
<name>foo</name>
<name>foo-devel</name>
<name>ja-foo</name>
<range><ge>1.6</ge><lt>1.9</lt></range>
<range><ge>2.*</ge><lt>2.4_1</lt></range>
<range><eq>3.0b1</eq></range>
</package>
<package>
<name>openfoo</name>
<range><lt>1.10_7</lt></range>
<range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
</package>
</affects>
<description>
<body xmlns="http://www.w3.org/1999/xhtml">
<p>J. Random Hacker reports:</p>
<blockquote
cite="http://j.r.hacker.com/advisories/1">
<p>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.</p>
</blockquote>
</body>
</description>
<references>
<freebsdsa>SA-10:75.foo</freebsdsa>
<freebsdpr>ports/987654</freebsdpr>
<cvename>CAN-2010-0201</cvename>
<cvename>CAN-2010-0466</cvename>
<bid>96298</bid>
<certsa>CA-2010-99</certsa>
<certvu>740169</certvu>
<uscertsa>SA10-99A</uscertsa>
<uscertta>SA10-99A</uscertta>
<mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&m=203886607825605</mlist>
<url>http://j.r.hacker.com/advisories/1</url>
</references>
<dates>
<discovery>2010-05-25</discovery>
<entry>2010-07-13</entry>
<modified>2010-09-17</entry>
</dates>
</vuln>Die Namen der Tags sollten selbsterklärend sein
– also werfen wir einen genaueren Blick auf
die Felder, die Sie selbst ausfüllen
müssen:Dies ist die höchste Tag-Ebene eines
VuXML-Eintrags. Es ist ein vorgeschriebenes Attribut
vid, 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. Wahlweise können Sie, wenn Sie
FreeBSD 4.x verwenden, den Port devel/p5-Data-UUID
verwenden und folgenden Befehl aufrufen:perl -MData::UUID -le 'print lc new Data::UUID->create_str'Dies ist eine einzeilige Beschreibung des
gefundenen Fehlers.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– und
Developement-Zweige, lokalisierte Versionen und
Slave-Ports ein, die verschiedene
Auswahlmöglichkeiten wichtiger
Kompilierungszeit-Optionen bieten.Es liegt in Ihrer Verantwortung all diese
betroffenen Pakete zu finden, wenn Sie den
VuXML-Eintrag schreiben.Behalten Sie im
Hinterkopf, dass make search
name=foo Ihr Freund ist. Die wichtigsten
Punkte, auf die Sie achten sollten, sind die
folgenden:die foo-devel
Variante eines foo
Ports;andere Varianten mit einem Suffix wie
-a4 (für
Druck-betreffende Pakete),
-without-gui (für Pakete
mit deaktivierter X-Unterstützung) oder
ähnlichejp-,
ru-, zh-
und andere, eventuell lokalisierte, Varianten in
den entsprechenden Länderkategorien der
Ports-SammlungBetroffene Versionen der Pakete werden hier als
ein Bereich oder mehrere durch eine Kombination aus
<lt>, <le>
, <eq>,
<ge>, und
<gt>-Elementen ausgegeben.
Die angegebenen Bereiche sollten sich nicht
überschneiden.In einer Bereichsangabe steht
* (Asterisk) für die kleinste
Versionsnummer. Insbesondere ist
2.* kleiner als
2.a. Deshalb kann ein Stern benutzt
werden, um auf alle möglichen Alpha
-, Beta– und
RC -Versionen zuzutreffen. Zum
Beispiel passt
<ge>2.*</ge><lt>3.*
</lt> auf alle Versionen der Form
2.x, während
<ge>
2.0</ge><lt>3.0</lt> das
nicht erfüllt, da es nicht auf 2.r3
passt, auf 3.b aber
schon.Das obige Beispiel legt fest, dass Versionen von
1.6 bis 1.9
betroffen sind – außerdem
Versionen 2.x vor
2.4_1 und Version
3.0b1.Mehrere zusammenhängende Gruppen von
Paketen (im wesentlichen Ports) können im
Abschnitt <affected>
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 <package>
Abschnittes.Die Versionsbereiche sollten, wenn möglich,
sowohl PORTEPOCH als auch
PORTREVISION erlauben. Bitte denken Sie
daran, dass gemäß der Vergleichsregeln eine
Version mit einer PORTEPOCH, die
nicht Null ist, größer ist als jede Version
ohne PORTEPOCH. Das heißt,
3.0,1 ist größer als
3.1 oder sogar
8.9.Das ist die Zusammenfassung des Problems. In
diesem Feld wird XHTML verwendet. Zumindest
umschließende <p> und
</p> 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.Dieser Abschnitt enthält Verweise auf
relevante Dokumente. Es wird empfohlen so viele
Referenzen wie nötig aufzuführen.Das ist ein FreeBSD
Sicherheitshinweis.Das ist ein
FreeBSD Problembericht.Das ist eine Mitre CVE
Kennung.Das ist eine SecurityFocus
Fehler-Kennung.Das ist ein Sicherheitshinweis von US-CERT.Das ist eine Mitteilung über eine
Schwachstelle von US-CERT.Das ist ein Cyber-Sicherheitsalarm von US-CERT.Das ist ein technischer Cyber-Sicherheitsalarm
von US-CERT.Das ist eine URL zu einem archivierten Posting
auf einer Mailingliste. Das Attribut
msgid ist optional und gibt die
Nachrichtenkennung des Postings an.Das ist eine gewöhnliche URL. Sie sollte
nur verwendet werden, wenn keine der anderen
Referenzkategorien verfügbar ist.Das ist das Datum, an dem die
Sicherheitslücke bekannt wurde
(JJJJ-MM-TT).Das ist das Datum, an dem der Eintrag
hinzugefügt wurde
(JJJJ-MM-TT).Das ist das Datum, an dem zuletzt irgendeine
Information des Eintrags verändert wurde
(JJJJ-MM-TT). Neue
Einträge dürfen dieses Feld nicht enthalten.
Es sollte beim Editieren eines existierenden Eintrags
eingefügt werden.Ihre Änderungen an der VuXML-Datenbank
testenNehmen wir an, Sie haben gerade einen Eintrag
für eine Sicherheitslücke in dem Paket
clamav geschrieben oder
ausgefüllt, die in der Version
0.65_7 korrigiert wurde.Als Voraussetzung sollten Sie eine neue Version der
Ports ports-mgmt/portaudit und
ports-mgmt/portaudit-db
installieren.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 0.65_6 zutreffen:&prompt.user; packaudit
&prompt.user; portaudit clamav-0.65_6Um packaudit auszuführen,
müssen Sie die Berechtigung haben
DATABASEDIR zu
schreiben – üblicherweise ist das
/var/db/portaudit.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
74a9541d-5d6c-11d8-80e3-0020ed76ef5a)
und einen neuen Eintrag in der VuXML-Datenbank anlegen.
Bitte überprüfen Sie danach die Syntax mit
folgendem Befehl:&prompt.user; cd ${PORTSDIR}/security/vuxml && make validateSie werden zumindest eines der folgenden Pakete
benötigen: textproc/libxml2, textproc/jade.Jetzt bauen Sie bitte die
portaudit-Datenbank aus der VuXML-Datei
neu:&prompt.user; packauditUm sicherzustellen, dass der Abschnitt
<affected> Ihres Eintrags die
richtigen Pakete betrifft, verwenden Sie bitte den
folgenden Befehl:&prompt.user; portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5aBitte lesen Sie in &man.portaudit.1; nach, um ein
besseres Verständnis der Befehlssyntax zu
entwickeln.Bitte stellen Sie sicher, dass Ihr Eintrag keine
falschen Treffer in der Ausgabe erzeugt.Jetzt überprüfen Sie bitte, dass Ihr
Eintrag die richtigen Versionen des Pakets angibt:&prompt.user; portaudit clamav-0.65_6 clamav-0.65_7
Affected package: clamav-0.65_6 (matched by clamav<0.65_7)
Type of problem: clamav remote denial-of-service.
Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
1 problem(s) found.Offensichtlich sollte die erste Version ausgegeben
werden – die zweite jedoch nicht.Abschließend überprüfen Sie bitte,
ob die Webseite, die aus der VuXML-Datenbank erzeugt wird,
wie erwartet aussieht:&prompt.user; mkdir -p ~/public_html/portaudit
&prompt.user; packaudit
&prompt.user; lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.htmlWas man machen respektive vermeiden sollteEinführungHier 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 PR
Datenbank, welche andere Menschen eingereicht haben,
kontrollieren. Senden Sie bitte Kommentare zu Ports, die Sie
verifizieren wie unter Bug
Reports and General Commentary beschrieben. Der
Abgleich von Ports aus der PR-Datenbank hilft uns diese
schneller zu committen, und zeigt auch, dass Sie wissen, worum
es geht.WRKDIRSchreiben Sie in keine Dateien außerhalb von
WRKDIR. WRKDIR ist der
einzige Ort, welcher während des Erstellen des Ports
garantiert beschreibbar ist (siehe Ports
Installieren von CDROM für ein Beispiel, um Ports
in einem schreibgeschützen Zweig zu erstellen). Wenn Sie
eine der pkg-*
Dateien modifizieren müssen, sollten Sie eine Variable erneut
definieren, anstatt die Datei zu
überschreiben.WRKDIRPREFIXVergewissern Sie sich, dass Ihr Port
WRKDIRPREFIX beachtet. Die meisten Ports
sollten sich darüber keine Sorgen machen. Beachten Sie
bitte, falls auf WRKDIR eines anderen Ports
verwiesen wird, dass die korrekte Position
WRKDIRPREFIXPORTSDIR/subdir/name/work,
und nicht etwa
PORTSDIR/subdir/name/work,
.CURDIR/../../subdir/name/work
oder ähnliches ist.Falls Sie WRKDIR selbst definieren,
sollten Sie sicherstellen, dass Sie
${WRKDIRPREFIX}${.CURDIR} am
Anfang anfügen.Unterschiedliche Betriebssysteme und
BetriebssystemversionenSie 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.Der bevorzugte Weg, um 4.3BSD/Reno (1990) und neuere
Versionen des BSD-Quelltextes zu unterscheiden, ist das
BSD-Makro zu nutzen, welches in sys/param.h
definiert ist. Hoffentlich ist diese Datei schon
enthalten – falls nicht, so fügen Sie
folgenden Quelltext:#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endifan der richtigen Stelle in der .c
Datei hinzu. Wir glauben, dass jedes System, welches diese
beiden Symbole definiert, die Datei
sys/param.h 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;.Eine andere Möglichkeit zur Unterscheidung ist der
GNU Autoconf-Stil:#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endifVergessen Sie nicht
-DHAVE_SYS_PARAM_H zu den
CFLAGS im Makefile
hinzuzufügen, falls Sie diese Methode benutzen
sollten.Sobald Sie sys/param.h
hinzugefügt haben, können Sie mit Hilfe von#if (defined(BSD) && (BSD >= 199103))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.Benutzen Sie:#if (defined(BSD) && (BSD >= 199306))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.Der Wert des BSD-Makros ist
199506 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
__FreeBSD__ Makro sollte stattdessen
verwandt werden.Sparsam sollte eingesetzt werden:__FreeBSD__ ist in allen Versionen
von FreeBSD definiert. Benutzen Sie dieses Makro, falls
die Änderung(en), die Sie machen,
nur FreeBSD betrifft.
Portierungsfallen, wie der Gebrauch von
sys_errlist[] gegenüber
strerror() sind Berkeley-Eigenheiten,
keine FreeBSD Änderungen.In FreeBSD 2.x, ist __FreeBSD__
auf 2 definiert. In älteren
Versionen, ist es 1. Alle späteren
Versionen erhöhen es, damit es mit der
Haupt-Versionsnummer übereinstimmt.Falls Sie zwischen einem FreeBSD 1.x und einem
FreeBSD 2.x (oder höher) System unterscheiden
müssen, ist es normalerweise richtig, die
BSD-Makros (wie oben beschrieben) zu
benutzen. Gibt es tatsächlich eine
FreeBSD-spezifische Änderung (wie z.B. spezielle
Optionen von Shared-Libraries für
ld), ist es nicht zu beanstanden
__FreeBSD__ und #if
__FreeBSD__ > 1 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:#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endifIn den Tausenden von Ports, die bis jetzt erstellt
wurden, gab es nur ein oder zwei Fälle, in denen
__FreeBSD__ 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.__FreeBSD_version WerteHier ist eine praktische Liste von
__FreeBSD_version-Werten wie in sys/param.h
definiert:
__FreeBSD_version-WerteWertDatumRelease1194112.0-RELEASE199501, 19950319. März 19952.1-CURRENT1995049. April 19952.0.5-RELEASE19950826. August 19952.2-CURRENT vor 2.119951110. November 19952.1.0-RELEASE19951210. November 19952.2-CURRENT vor 2.1.519960710. Juli 19962.1.5-RELEASE19960812. Juli 19962.2-CURRENT vor 2.1.619961215. November 19962.1.6-RELEASE1996122.1.7-RELEASE22000019. Februar 19972.2-RELEASE(nicht geändert)2.2.1-RELEASE(nicht geändert)2.2-STABLE nach 2.2.1-RELEASE22100115. April 19972.2-STABLE nach texinfo-3.922100230. April 19972.2-STABLE nach top22200016. Mai 19972.2.2-RELEASE22200119. Mai 19972.2-STABLE nach 2.2.2-RELEASE2250002. Oktober 19972.2.5-RELEASE22500120. November 19972.2-STABLE nach 2.2.5-RELEASE22500227. Dezember 19972.2-STABLE nach der Aufnahme von ldconfig -R22600024. März 19982.2.6-RELEASE22700021. Juli 19982.2.7-RELEASE22700121. Juli 19982.2-STABLE nach 2.2.7-RELEASE22700219. September 19982.2-STABLE nach &man.semctl.2; Änderung22800029. November 19982.2.8-RELEASE22800129. November 19982.2-STABLE nach 2.2.8-RELEASE30000019. Februar 19963.0-CURRENT vor &man.mount.2; Änderung30000124. September 19973.0-CURRENT nach &man.mount.2; Änderung3000022. Juni 19983.0-CURRENT nach &man.semctl.2; Änderung3000037. Juni 19983.0-CURRENT nach ioctl arg Änderungen3000043. September 19983.0-CURRENT nach ELF-Konvertierung30000516. Oktober 19983.0-RELEASE30000616. Oktober 19983.0-CURRENT nach 3.0-RELEASE30000722. Januar 19993.0-STABLE nach 3/4 Zweig3100009. Februar 19993.1-RELEASE31000127. März 19993.1-STABLE nach 3.1-RELEASE31000214. April 19993.1-STABLE nach Änderung der C++
Konstruktor/Destruktor-Reihenfolge3200003.2-RELEASE3200018. Mai 19993.2-STABLE32000229. August 19993.2-STABLE nach binär-inkompatibler IPFW und
Socket-Änderungen3300002. September 19993.3-RELEASE33000116. September 19993.3-STABLE33000224. November 19993.3-STABLE nach Hinzufügen von &man.mkstemp.3;
zur libc3400005. Dezember 19993.4-RELEASE34000117. Dezember 19993.4-STABLE35000020. Juni 20003.5-RELEASE35000112. Juli 20003.5-STABLE40000022. Januar 19994.0-CURRENT nach 3.4 Zweig40000120. Februar 19994.0-CURRENT nach der Änderung im Verhalten des
dynamischen Linkers.40000213. März 19994.0-CURRENT nach Änderung der C++
Konstruktor/Destruktor Reihenfolge.40000327. März 19994.0-CURRENT nach funktionierendem &man.dladdr.3;.4000045. April 19994.0-CURRENT nach der __deregister_frame_info
Fehlerbehebung für den dynamischen Linker (auch
4.0-CURRENT nach EGCS 1.1.2 Integration).40000527. April 19994.0-CURRENT nach &man.suser.9; API Änderung
(auch 4.0-CURRENT nach newbus).40000631. Mai 19994.0-CURRENT nach Änderung der
cdevsw-Registrierung.40000717. Juni 19994.0-CURRENT nach Hinzufügen von so_cred
für Zugangsberechtigungen auf Socket-Ebene.40000820. Juni 19994.0-CURRENT nach Hinzufügen eines poll
Syscall-Wrappers zur libc_r.40000920. Juli 19994.0-CURRENT nach der Änderung des Kernel
dev_t-Typs zum struct
specinfo-Zeiger.40001025. September 19994.0-CURRENT nach dem Beseitigen eines Fehlers in
&man.jail.2;.40001129. September 19994.0-CURRENT nach der sigset_t
Datentyp Änderung.40001215. November 19994.0-CURRENT nach dem Wechsel zum GCC
2.95.2-Compiler.4000134. Dezember 19994.0-CURRENT nach Hinzufügen der erweiterbaren
Linux Mode ioctl-Routinen.40001418. Januar 20004.0-CURRENT nach dem OpenSSL-Import.40001527. Januar 20004.0-CURRENT nach der C++ ABI Änderung in GCC
2.95.2 von -fvtable-thunks zu -fno-vtable-thunks als
Standard.40001627. Februar 20004.0-CURRENT nach OpenSSH-Import.40001713. März 20004.0-RELEASE40001817. März 20004.0-STABLE nach 4.0-RELEASE4000195. Mai 20004.0-STABLE nach der Einführung von
verzögerten Prüfsummen.4000204. Juni 20004.0-STABLE nach dem Einpflegen des
libxpg4-Quelltextes in die libc.4000218. Juli 20004.0-STABLE nach der Aktualisierung von Binutils auf
2.10.0, Änderungen der binären ELF-Markierungen,
Aufnahme von tcsh ins Basissystem.41000014. Juli 20004.1-RELEASE41000129. Juli 20004.1-STABLE nach 4.1-RELEASE41000216. September 20004.1-STABLE nachdem &man.setproctitle.3; von der
libutil in die libc verschoben wurde.41100025. September 20004.1.1-RELEASE4110014.1.1-STABLE nach 4.1.1-RELEASE42000031. Oktober 20004.2-RELEASE42000110. Januar 20014.2-STABLE nach Kombinaion von libgcc.a und
libgcc_r.a und zugehörigen Änderungen der
GCC-Bindungen.4300006. März 20014.3-RELEASE43000118. Mai 20014.3-STABLE nach der Einführung von
wint_t.43000222. Juli 20014.3-STABLE nach dem Einpflegen der PCI
Stromstatus-API.4400001. August 20014.4-RELEASE44000123. Oktober 20014.4-STABLE nach der Einführung von
d_thread_t.4400024. November 20014.4-STABLE nach den Änderungen der
mount-Struktur (betrifft Dateisystem-Kernelmodule).
44000318. Dezember 20014.4-STABLE nachdem die Userland-Komponenten von
smbfs importiert worden sind.45000020. Dezember 20014.5-RELEASE45000124. Februar 20024.5-STABLE nach der Umbenennung von Elementen der
USB-Struktur.45000416. April 20024.5-STABLE nachdem die
sendmail_enable &man.rc.conf.5;
Variable geändert worden ist, um den Wert
NONE zu akzeptieren.45000527. April 20024.5-STABLE nachdem XFree86 4 als Standard zum Bauen
der Pakete benutzt wird.4500061. Mai 20024.5-STABLE nach dem Reparieren des Empfangsfilters,
welcher anfällig für einfache DoS-Attacken
war.46000021. Juni 20024.6-RELEASE46000121. Juni 20024.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.46000219. Juli 20024.6.2-RELEASE46010026. Juni 20024.6-STABLE46010126. Juni 20024.6-STABLE nach dem Einfließen von `sed -i' aus
CURRENT.4601021. September 20024.6-STABLE nach dem Einfließen von vielen
neuen pkg_install-Funktionen aus HEAD (HEAD = die
aktuellste und letzte Version des
Quellverzeichnisbaumes).4700008. Oktober 20024.7-RELEASE4701009. Oktober 20024.7-STABLE47010110. November 2002Beginn 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.47010223. Januar 20034.7-STABLE nach dem Einfliessen von
mbuf-Änderungen, um m_aux mbufs mit denen von m_tag
zu ersetzen47010314. Februar 20034.7-STABLE erhält OpenSSL 0.9.748000030. März 20034.8-RELEASE4801005. April 20034.8-STABLE48010122. Mai 20034.8-STABLE nachdem &man.realpath.3; Thread-sicher
gemacht wurde.48010210. August 20034.8-STABLE Änderung der 3ware-API in twe.49000027. Oktober 20034.9-RELEASE49010027. Oktober 20034.9-STABLE4901018. Januar 20044.9-STABLE nachdem e_sid zu der Struktur
kinfo_eproc hinzugefügt wurde.4901024. Februar 20044.9-STABLE nach dem Einfliessen der
libmap-Funktionalität für rtld.49100025. Mai 20044.10-RELEASE4911001. Juni 20044.10-STABLE49110111. August 20044.10-STABLE nach dem Einfliessen von Revision
20040629 der Paket-Werkzeuge aus CURRENT.49110216. November 20044.10-STABLE nach der Fehlerbehebung in der VM, um
das Freigeben von fiktiven Speicherseiten korrekt zu
handhaben.49200017. Dezember 20044.11-RELEASE49210017. Dezember 20044.11-STABLE49210118. April 20064.11-STABLE nach dem Hinzufügen von
libdata/ldconfig Verzeichnissen zu den
mtree-Dateien.50000013. März 20005.0-CURRENT50000118. April 20005.0-CURRENT nach Hinzufügen von
zusätzlichen Feldern in den ELF-Headern und
Ändern der Methode zur ELF-Markierung von
Binärdateien.5000022. Mai 20005.0-CURRENT nach kld-Metadaten
Änderungen.50000318. Mai 20005.0-CURRENT nach buf/bio Änderungen.50000426. Mai 20005.0-CURRENT nach binutils Aktualisierung.5000053. Juni 20005.0-CURRENT nach dem Einfliessen des libxpg4
Quelltextes in die libc und der Einführung der
TASKQ-Schnittstelle.50000610. Juni 20005.0-CURRENT nach dem Hinzufügen der
AGP-Schnittstellen.50000729. Juni 20005.0-CURRENT nach der Aktualisierung von Perl auf
Version 5.6.0.5000087. Juli 20005.0-CURRENT nach der Aktualisierung des
KAME-Quelltextes zu den 2000/07-Quellen.50000914. Juli 20005.0-CURRENT nach ether_ifattach() und
ether_ifdetach() Änderungen.50001016. Juli 20005.0-CURRENT nachdem die mtree-Standards zurück
zur ursprünglichen Variante geändert wurden; -L
hinzugefügt, um Symlinks zu folgen.50001118. Juli 20005.0-CURRENT nachdem die kqueue-API geändert
worden ist.5000122. September 20005.0-CURRENT nachdem &man.setproctitle.3; von
libutil nach libc verschoben worden ist.50001310. September 20005.0-CURRENT nach dem ersten SMPng-Commit.5000144. Januar 20015.0-CURRENT nachdem <sys/select.h> nach
<sys/selinfo.h> verschoben worden ist.50001510. Januar 20015.0-CURRENT nach dem Kombinieren von libgcc.a und
libgcc_r.a und damit verbundene Änderungen an
GCC-Bindungen.50001624. Januar 20015.0-CURRENT nach der Änderung das
Zusammenbinden von libc und libc_r zu erlauben, womit die
-pthread Option veraltet ist.50001718. Februar 20015.0-CURRENT nach dem Umschalten von struct ucred zu
struct xucred, um die vom Kernel exportierte API für
mount u.a.zu stabilisieren.50001824. Februar 20015.0-CURRENT nach dem Hinzufügen der CPUTYPE
make Variable zum Kontrollieren von CPU-spezifischen
Optimierungen.5000199. Juni 20015.0-CURRENT nach dem Verschieben von
machine/ioctl_fd.h nach sys/fdcio.h50002015. Juni 20015.0-CURRENT nach der Umbenennung der
locale-Namen.50002122. Juni 20015.0-CURRENT nach dem Bzip2-Import. Kennzeichnet
auch, dass S/Key entfernt wurde.50002212. Juli 20015.0-CURRENT nach SSE Unterstützung.50002314. September 20015.0-CURRENT nach KSE-Meilenstein 2.5000241. Oktober 20015.0-CURRENT nach d_thread_t, und nachdem UUCP in
die Ports verschoben worden ist.5000254. Oktober 20015.0-CURRENT nach Änderungen in der ABI bei der
Weitergabe von Deskriptoren und Berechtigungen auf 64 Bit
Plattformen.5000269. Oktober 20015.0-CURRENT nachdem XFree86 4 als Standard zum
Erstellen der Pakete benutzt wird und die neue libc
strnstr()-Funktion hinzugefügt wurde.50002710. Oktober 20015.0-CURRENT nachdem die neue libc
strcasestr()-Funktion hinzugefügt wurde.50002814. Dezember 20015.0-CURRENT nachdem die Userland-Komponenten von
smbfs importiert wurden.(nicht geändert)5.0-CURRENT nachdem die neuen C99-Ganzzahlen mit
spezifischer Breite hinzugefügt wurden.50002929. Januar 20025.0-CURRENT nachdem eine Änderung im
Rückgabewert von &man.sendfile.2; gemacht
wurde.50003015. Februar 20025.0-CURRENT nach der Einführung des Types
fflags_t, welches die passende
Größe für Dateiflags hat.50003124. Februar 20025.0-CURRENT nach der Umbenennung der USB
elements-Struktur.50003216. März 20025.0-CURRENT nach der Einführung von Perl
5.6.1.5000333. April 20025.0-CURRENT nachdem die
sendmail_enable &man.rc.conf.5;
Variable geändert worden ist, um den Wert
NONE zu akzeptieren.50003430. April 20025.0-CURRENT nachdem mtx_init() einen dritten
Parameter entgegen nimmt.50003513. Mai 20025.0-CURRENT mit GCC 3.1.50003617. Mai 20025.0-CURRENT ohne Perl in /usr/src50003729. Mai 20025.0-CURRENT nach dem Hinzufügen von
&man.dlfunc.3;50003824. Juli 20025.0-CURRENT nachdem die Typen von einigen Elementen
der sockbuf-Struktur geändert wurden und nachdem die
Struktur neu geordnet wurde.5000391. September 20025.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.50004020. September 20025.0-CURRENT nachdem verschiedene Änderungen an
Plattenfunktionen gemacht wurden, um die Anhängigkeit
von Interna der disklabel-Struktur zu entfernen.5000411. Oktober 20025.0-CURRENT nach dem Hinzufügen von
&man.getopt.long.3; zur libc.50004215. Oktober 20025.0-CURRENT nach der Aktualisierung von Binutils
auf 2.13, bei denen die FreeBSD-Emulation, vec und das
Ausgabeformat geändert wurden.5000431. November 20025.0-CURRENT nach dem Hinzufügen schwacher
pthread_XXX Stubs zur libc, womit libXThrStub.so veraltet
ist. 5.0-RELEASE.50010017. Januar 20035.0-CURRENT nach dem Erstellen des
RELENG_5_0-Zweiges50010119. Februar 2003<sys/dkstat.h> ist leer und sollte nicht
inkludiert werden.50010225. Februar 20035.0-CURRENT nach der Änderung in der
d_mmap_t-Schnittstelle.50010326. Februar 20035.0-CURRENT nachdem taskqueue_swi geädert
wurde, um ohne Giant zu arbeiten, und taskqueue_swi_giant
hinzugefügt wurde, um Giant zu verwenden.50010427. Februar 2003cdevsw_add() und cdevsw_remove() gibt es nicht
länger. Auftauchen der
MAJOR_AUTO-Allokationsmöglichkeit.5001054. März 20035.0-CURRENT nach der neuen
cdevsw-Initialisierungsmethode.5001068. März 2003devstat_add_entry() wurde durch
devstat_new_entry() ersetzt.50010715. März 2003Devstat Schnittstellenänderung; siehe
sys/sys/param.h 1.149.50010815. März 2003Token-Ring Schnittstellenänderungen.50010925. März 2003Hinzufügen von vm_paddr_t.50011028. März 20035.0-CURRENT nachdem &man.realpath.3;
Thread-sicher gemacht wurde.5001119. April 20035.0-CURRENT nachdem &man.usbhid.3; mit
NetBSD synchronisiert wurde.50011217. April 20035.0-CURRENT nach der neuen NSS Implementierung
und Hinzufügen der POSIX.1 getpw*_r, getgr*_r
Funktionen.5001132. Mai 20035.0-CURRENT nach Entfernen des alten
rc-Systems.5010004. Juni 20035.1-RELEASE.5011002. Juni 20035.1-CURRENT nach dem Erstellen des RELENG_5_1
Zweiges.50110129. Juni 20035.1-CURRENT nachdem die Semantik von
sigtimedwait(2) and sigwaitinfo(2) korrigiert
wurden.5011023. Juli 20035.1-CURRENT nach dem Hinzufügen der lockfunc und
lockfuncarg-Felder zu &man.bus.dma.tag.create.9;.50110331. Juli 20035.1-CURRENT nach der Integration des GCC 3.3.1-pre
20030711 Snapshots.5011045. August 20035.1-CURRENT 3ware-API Änderungen in twe.50110517. August 20035.1-CURRENT Unterstützung von dynamisch
gebundenen /bin und /sbin und Verschieben von Bibliotheken
nach /lib.5011068. September 20035.1-CURRENT nachdem im Kernel Unterstützung
für Coda 6.x hinzugefügt wurden.50110717. September 20035.1-CURRENT nachdem die 16550 UART-Konstanten von
<dev/sio/sioreg.h> nach
<dev/ic/ns16550.h> verschoben
wurden. Und nachdem die libmap Funktionalität
vorbehaltlos vom rtld unterstützt wurde.50110823. September 20035.1-CURRENT nach Aktualisierung der PFIL_HOOKS API.50110927. September 20035.1-CURRENT nachdem kiconv(3) hinzugefügt
wurde.50111028. September 20035.1-CURRENT nachdem der standardmäßige
Ablauf von open und close in cdevsw geändert
wurde.50111116. Oktober 20035.1-CURRENT nachdem das Layout von cdevsw
geändert wurde.50111216. Oktober 20035.1-CURRENT nach dem Hinzufügen von
Mehrfachvererbung in kobj.50111331. Oktober 20035.1-CURRENT nach der if_xname Änderung in der
Struktur ifnet50111416. November 20035.1-CURRENT nachdem /bin und /sbin geändert
wurden, um sie dynamisch zu binden.5020007. Dezember 20035.2-RELEASE50201023. Februar 20045.2.1-RELEASE5021007. Dezember 20035.2-CURRENT nach dem Erstellen des RELENG_5_2-Zweiges.50210119. Dezember 20035.2-CURRENT nachdem die
__cxa_atexit/__cxa_finalize Funktionen zur libc
hinzugefügt wurden.50210230. Januar 20045.2-CURRENT nachdem die Standard-Thread Bibliothek
von libc_r zu libpthread geändert wurde.50210321. Februar 20045.2-CURRENT nach dem Gerätetreiber API
Megapatch.50210425. Februar 20045.2-CURRENT nachdem getopt_long_only()
hinzugefügt wurde.5021055. März 20045.2-CURRENT nachdem NULL für C in ((void *)0)
geändert wurde, was mehr Warnungen erzeugt.5021068. März 20045.2-CURRENT nachdem pf beim Bauen und Installieren
mit eingebunden wird.50210710. März 20045.2-CURRENT nachdem time_t auf der sparc64-Plattform
in einen 64-bit Wert geändert wurde.50210812. März 20045.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.50210922. März 20045.2-CURRENT nach der Einführung der
bus_alloc_resource_any API50211027. März 20045.2-CURRENT nach dem Hinzufügen von UTF-8
locales50211111. April 20045.2-CURRENT nach dem Entfernen der getvfsent(3)
API50211213. April 20045.2-CURRENT nach dem Hinzufügen der .warning
Directive für make.5021134. Juni 20045.2-CURRENT nachdem ttyioctl() zwingend erforderlich
für serielle Treiber gemacht wurde.50211413. Juni 20045.2-CURRENT nach dem Import des
ALTQ-Frameworks.50211514. Juni 20045.2-CURRENT nachdem sema_timedwait(9) geändert
wurde, 0 bei Erfolg und einen von 0 verschiedenen
Fehlercode im Falle eines Fehlers
zurückzuliefern.50211616. Juni 20045.2-CURRENT nach dem Ändern der Kernel
Struktur dev_t, in ein Zeiger auf die Struktur cdev *50211717. Juni 20045.2-CURRENT nach dem Ändern der Kernelstruktur
udev_t in dev_t.50211817. Juni 20045.2-CURRENT nachdem Unterstützung für
CLOCK_VIRTUAL und CLOCK_PROF zu clock_gettime(2) und
clock_getres(2) hinzugefügt wurde.50211922. Juni 20045.2-CURRENT nachdem die Überprüfung des
Klonens von Netzwerk-Schnittstellen geändert
wurde.5021202. Juli 20045.2-CURRENT nach dem Einfliessen von Revision
20040629 der Paket-Werkzeuge.5021219. Juli 20045.2-CURRENT nachdem Bluetooth-Quelltext als nicht
i386-spezifisch markiert wurde.50212211. Juli 20045.2-CURRENT nach der Einführung des KDB
Debugger Frameworks, der Umwandlung des DDB in ein Backend
und der Einführung des GDB-Backends.50212312. Juli 20045.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
xorg als standardmäßige X
Implementierung wurde auch zu dieser Zeit
durchgeführt.50212424. Juli 20045.2-CURRENT nachdem die Art und Weise, wie rc.d-Skripte
von Ports und Altlasten gestartet werden, getrennt wurde.50212528. Juli 20045.2-CURRENT nachdem die vorherige Änderung
rückgängig gemacht wurde.50212631. Juli 20045.2-CURRENT nach dem Entfernen von
kmem_alloc_pageable() und dem Import von GCC 3.4.2.5021272. August 20045.2-CURRENT nachdem die UMA Kernel API
geändert wurde, um Konstruktoren und
Initialisierungsmethoden zu erlauben
fehlzuschlagen.5021288. August 20045.2-CURRENT nach der Änderung in der vfs_mount
Signatur sowie allgemeines Ersetzen von PRISON_ROOT durch
SUSER_ALLOWJAIL in der suser(9) API.50300023. August 20045.3-BETA/RC vor der Änderung der pfil-API.50300122. September 20045.3-RELEASE50310016. Oktober 20045.3-STABLE nach dem Erstellen des RELENG_5_3-Zweiges.5031013. Dezember 20045.3-STABLE nach dem Hinzufügen von
Fülloptionen im Stile der libc zu
&man.strftime.3;.50310213. Februar 20055.3-STABLE nachdem OpenBSD's nc(1) von CURRENT
importiert wurde.50310327. Februar 20055.4-PRERELEASE nach dem Einfliessen der Reparaturen
aus CURRENT, in
<src/include/stdbool.h> und
<src/sys/i386/include/_types.h>,
um die GCC-Kompatibilität des Intel C/C++-Compilers
zu benutzen.50310428. Februar 20055.4-PRERELEASE nach dem Einfliessen der
Änderung aus CURRENT in ifi_epoch statt der lokalen
Zeit die Betriebszeit des Systems zu benutzen.5031052. März 20055.4-PRERELEASE nach dem Einfliessen der Reparaturen
von EOVERFLOW in vswprintf(3) aus CURRENT.5040003. April 20055.4-RELEASE.5041003. April 20055.4-STABLE nach dem Erstellen des
RELENG_5_4-Zweiges.50410111. Mai 20055.4-STABLE nach dem Vergrößern der
standardmäßigen Stackgröße für
Threads.50410224. Juni 20055.4-STABLE nach dem Hinzufügen von sha256.5041033. Oktober 20055.4-STABLE nach dem Einfliessen von if_bridge aus
CURRENT.50410413. November 20055.4-STABLE nach dem Einfliessen von bsdiff und
portsnap aus CURRENT.50410517. Januar 20065.4-STABLE nach dem Einfliessen der Änderung
von ldconfig_local_dirs aus CURRENT.50500012. Mai 20065.5-RELEASE.50510012. Mai 20065.5-STABLE nach dem Erstellen des RELENG_5_5-Zweiges.60000018. August 20046.0-CURRENT60000127. August 20046.0-CURRENT nach der festen Aktivierung von
PFIL_HOOKS im Kernel.60000230. August 20046.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.6000038. September 20046.0-CURRENT nach dem erneuten Hinzufügen des
Elements ifi_epoch zur Struktur if_data.60000429. September 20046.0-CURRENT nach dem Hinzufügen der Struktur
inpcb als Argument in der pfil API.6000055. Oktober 20046.0-CURRENT nach dem Hinzufügen des "-d
DESTDIR" Schalters zu newsyslog.6000064. November 20046.0-CURRENT nach dem Hinzufügen von
Fülloptionen im Style der libc zu
&man.strftime.3;.60000712. Dezember 20046.0-CURRENT nach dem Hinzufügen von 802.11
Framework Neuerungen.60000825. Januar 20056.0-CURRENT Änderung an den VOP_*VOBJECT()
Funktionen und Einführung des MNTK_MPSAFE Schalters
für Dateisysteme, welche ohne Giant arbeiten.6000094. Februar 20056.0-CURRENT nach dem Hinzufügen von cpufreq
Framework und Treibern.6000106. Februar 20056.0-CURRENT nachdem OpenBSD's nc(1) importiert
wurde.60001112. Februar 20056.0-CURRENT nachdem der Anschein von
matherr() Unterstützung in SVID2
entfernt wurde.60001215. Februar 20056.0-CURRENT nach dem Vergrößern der
standardmäßigen Stackgröße für
Threads.60001319. Februar 20056.0-CURRENT nach dem Einfliessen der Reparaturen in
<src/include/stdbool.h> und
<src/sys/i386/include/_types.h>,
um die GCC-Kompatibilität des Intel C/C++-Compilers
zu benutzen.60001421. Februar 20056.0-CURRENT nachdem die Überprüfungen auf
EOVERFLOW in vswprintf(3) korrigiert wurden.60001525. Februar 20056.0-CURRENT nach dem Einfliessen der Änderung,
in ifi_epoch, statt der lokalen Zeit, die Betriebzeit des
Systems zu benutzen.60001626. Februar 20056.0-CURRENT nachdem das Format von LC_CTYPE auf der
Festplatte verändert wurde.60001727. Februar 20056.0-CURRENT nachdem das Format der NLS-Kataloge auf
der Festplatte verändert wurde.60001827. Februar 20056.0-CURRENT nachdem das Format von LC_COLLATE auf
der Festplatte verändert wurde.60001928. Februar 2005Installation der acpica Include-Dateien in
/usr/include.6000209. März 2005Hinzufügen des MSG_NOSIGNAL Schalters zur
send(2) API.60002117. März 2005Hinzufügen von Feldern zu cdevsw60002221. März 2005gtar wurde aus dem Basissystem entfernt.60002313. April 2005Die Optionen LOCAL_CREDS, LOCAL_CONNWAIT für
Sockets wurde zu unix(4) hinzugefügt.60002419. April 2005&man.hwpmc.4; und zugehörige Werkzeuge wurden
zu 6.0-CURRENT hinzugefügt.60002526. April 2005Die Struktur icmphdr wurden zu 6.0-CURRENT
hinzugefügt.6000263. Mai 2005pf Aktualisierung auf 3.7.6000276. Mai 2005Kernel libalias und ng_nat wurden
eingeführt.60002813. Mai 2005POSIX ttyname_r(3) wurde über unistd.h und
libc zur Verfügung gestellt.60002929. Mai 20056.0-CURRENT nachdem libpcap zu Version v0.9.1 alpha
096 aktualisiert wurde.6000305. Juni 20056.0-CURRENT nach dem Import von NetBSDs
if_bridge(4).60003110. Juni 20056.0-CURRENT nachdem die Struktur ifnet aus dem
Treiber softcs herausgelöst wurde.60003211. Juli 20056.0-CURRENT nach dem Import von libpcap
v0.9.1.60003325. Juli 20056.0-STABLE nachdem die Versionen aller gemeinsam
genutzten Bibliotheken, welche seit RELENG_5 nicht
geändert wurden, erhöht wurden.60003413. August 20056.0-STABLE nachdem das Argument credential zu der
dev_clone-Ereignisbehandlung hinzugefügt wurde.
6.0-RELEASE.6001001. November 20056.0-STABLE nach dem Erstellen des
6.0-RELEASE-Zweiges.60010121. Dezember 20056.0-STABLE nach dem Aufnehmen von Skripten aus den
local_startup-Verzeichnissen in &man.rcorder.8; des
Basissystems.60010230. Dezember 20056.0-STABLE nach dem Aktualisieren der ELF-Typen und
Konstanten.60010315. Januar 20066.0-STABLE nach dem Einfliessen der pidfile(3)-API
aus CURRENT.60010417. Januar 20066.0-STABLE nach dem Einfliessen der Änderung
von ldconfig_local_dirs aus CURRENT.60010526. Februar 20066.0-STABLE nach der NLS-Katalogunterstützung
von csh(1).6010006. Mai 20066.1-RELEASE6011006. Mai 20066.1-STABLE nach 6.1-RELEASE.60110122. Juni 20066.1-STABLE nach dem Import von csup.60110211. Juli 20066.1-STABLE nach der iwi(4)-Aktualisierung.60110317. Juli 20066.1-STABLE nach der Aktualisierung der
Namensauflösung zu BIND9 und Aufnahme der
ablaufinvarianten Versionen der netdb-Funktionen.6011048. August 20066.1-STABLE nachdem Unterstützung für DSO
(dynamic shared objects - gemeinsam genutzte, dynamische
Objekte) in OpenSSL aktiviert wurde.6011052. September 20066.1-STABLE nachdem 802.11 Reparaturen die API der
IEEE80211_IOC_STA_INFO ioctl geändert haben.60200015. November 20066.2-RELEASE60210015. September 20066.2-STABLE nach 6.2-RELEASE.60210112. Dezember 20066.2-STABLE nach dem Hinzufügen der Wi-Spy
Eigenart.60210228. Dezember 20066.2-STABLE nachdem pci_find_extcap() hinzugefügt
wurde.60210316. Januar 20076.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.60210428. Januar 20076.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.60210520. Februar 20076.2-STABLE nach dem Einpflegen der BSD lizensierten
Version von &man.gzip.1;, welche von NetBSD portiert wurde
aus CURRENT.60210631. März 20076.2-STABLE nach dem Einpflegen der PCI MSI und
MSI-X Unterstützung aus CURRENT.6021076. April 20076.2-STABLE nach dem Einpflegen von ncurses 5.6 und
Unterstützung für Multibyte-Zeichen aus
CURRENT.60210811. April 20076.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.60210917. April 20076.2-STABLE nach dem Einpflegen von readline 5.2
Patchset 002 aus CURRENT.6021102. Mai 20076.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.60211111. Juni 20076.2-STABLE nach dem Einpflegen von BOP_BDFLUSH aus
CURRENT und dem daraus resultierendem Bruch mit dem
Dateisystemmodul KBI.60211221. September 20076.2-STABLE nach dem Einpflegen von libutil(3) aus
CURRENT.60211325. Oktober 20076.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.60211430. Oktober 20076.2-STABLE, nachdem die ctype
ABI-Aufwärtskompatibilität wiederhergestellt
wurde.60211521. November 2007FreeBSD 6.2-STABLE nach der Entfernung/Eliminierung
der wide und single Byte ctype-Trennung60300025. November 20076.3-RELEASE60310025. November 20076.3-STABLE nach 6.3-RELEASE.6031017. Dezember 20076.3-STABLE, nachdem der Support für den
Multibyte-Datentyp im Bit-Makro gefixt wurde.60310224. April 20086.3-STABLE nach Hinzufügen von l_sysid zu
struct flock.60310327. Mai 20086.3-STABLE nach Einfließen der
memrchr-Funktion.60310415. Juni 20086.3-STABLE nach Übernahme der
Unterstützung von :u als
Variablenwandler in make(1).6040004. Oktober 20086.4-RELEASE6041004. Oktober 20086.4-STABLE nach 6.4-RELEASE.70000011. Juli 20057.0-CURRENT.70000123. Juli 20057.0-CURRENT nachdem die Versionen aller gemeinsam
genutzten Bibliotheken, welche seit RELENG_5 nicht
geändert wurden, erhöht wurden.70000213. August 20057.0-CURRENT nachdem ein Berechtigungs-Argument zur
dev_clone-Ereignisroutine hinzugefügt wurde.70000325. August 20057.0-CURRENT nachdem memmem(3) zur libc
hinzugefügt wurde.70000430. Oktober 20057.0-CURRENT nachdem die Argumente der
Kernelfunktion solisten(9) modifiziert wurden, um einen
Backlog-Parameter (Anzahl der maximalen wartenden
Verbindungen) zu akzeptieren.70000511. November 20057.0-CURRENT nachdem IFP2ENADDR() geändert
wurde, einen Zeiger auf IF_LLADDR()
zurückzugeben.70000611. November 20057.0-CURRENT nach dem Hinzufügen des
if_addr-Elements zur Struktur
ifnet und dem Entfernen von
IFP2ENADDR().7000072. Dezember 20057.0-CURRENT nach dem Aufnehmen von Skripten aus den
local_startup Verzeichnissen in &man.rcorder.8; des
Basissystems.7000085. Dezember 20057.0-CURRENT nach dem Entfernen der MNT_NODEV
mount-Option.70000919. Dezember 20057.0-CURRENT nach ELF-64 Typen Änderungen und
Symbol Versionierung.70001020. Dezember 20057.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.70001131. Dezember 20057.0-CURRENT nachdem auf allen Plattformen
außer Alpha tv_sec in time_t umgewandelt
wurde.7000128. Januar 20067.0-CURRENT nach Änderung von
ldconfig_local_dirs.70001312. Januar 20067.0-CURRENT nach Änderung in
/etc/rc.d/abi um
/compat/linux/etc/ld.so.cache als
Symlink in ein schreibgeschütztes Dateisystem zu
unterstützen.70001426. Januar 20067.0-CURRENT nach pts Import.70001526. März 20067.0-CURRENT nach Einführung von Version 2 der
&man.hwpmc.4;'s ABI.70001622. April 20067.0-CURRENT nach dem Hinzufügen von
&man.fcloseall.3; zur libc.70001713. Mai 20067.0-CURRENT nach dem Entfernen von ip6fw.70001815. Juli 20067.0-CURRENT nach dem Import von snd_emu10kx.70001929. Juli 20067.0-CURRENT nach dem Import von OpenSSL
0.9.8b.7000203. September 20067.0-CURRENT nach dem Hinzufügen der
bus_dma_get_tag-Funktion7000214. September 20067.0-CURRENT nach dem Import von libpcap 0.9.4 und
tcpdump 3.9.4.7000229. September 20067.0-CURRENT nach der dlsym Änderung, ein
angefordertes Symbol sowohl in der spezifizierten dso, als
auch in den impliziten Abhängigkeiten
nachzuschlagen.70002323. September 20067.0-CURRENT nach dem Hinzufügen neuer
Sound-IOCTLs für die OSSv4-Mixer-API.70002428. September 20067.0-CURRENT nach dem Import von OpenSSL
0.9.8d.70002511. November 20067.0-CURRENT nach dem Hinzufügen der
libelf.70002626. November 20067.0-CURRENT nach größeren
Änderungen an den Sound sysctls.70002730. November 20067.0-CURRENT nach dem Hinzufügen der
Wi-Spy-Eigenart.70002815. Dezember 20067.0-CURRENT nach dem Hinzufügen von
sctp-Aufrufen zur libc.70002926. Januar 20077.0-CURRENT nach dem Ersetzen von GNU &man.gzip.1;
durch eine von NetBSD portierte Version, die unter
BSD-Lizenz steht.7000307. Februar 20077.0-CURRENT nach dem Entfernen der IPIP
Tunnelkapselung (VIFF_TUNNEL) aus dem IPv4
Multicast-Forwarding-Quelltext.70003123. Februar 20077.0-CURRENT nach den Modifizierungen an
bus_setup_intr() (newbus).7000322. März 20077.0-CURRENT nach der Aufnahme der Firmware für
ipw(4) und iwi(4).7000339. März 20077.0-CURRENT nach Unterstützung für
Multibyte-Zeichen.70003419. März 20077.0-CURRENT nach Änderungen, wie insmntque(),
getnewvnode() und vfs_hash_insert() arbeiten.70003526. März 20077.0-CURRENT nach Hinzufügen eines
Benachrichtigungsmechanismus für CPU
Frequenzänderungen.7000366. April 20077.0-CURRENT nach dem Import des ZFS
Dateisystemes.7000378. April 20077.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.70003830. April 20077.0-CURRENT nachdem &man.getenv.3;, &man.putenv.3;,
&man.setenv.3; und &man.unsetenv.3; geändert wurden,
um POSIX konform zu sein.7000391. Mai 20077.0-CURRENT nachdem die Änderungen von 700038
rückgängig gemacht wurden.70004010. Mai 20077.0-CURRENT nach dem Hinzufügen von
&man.flopen.3; zur libutil.70004113. Mai 20077.0-CURRENT nachdem Symbol Versionierung aktiviert
und die standardmäßige Thread-Bibliothek zu
libthr geändert wurde.70004219. Mai 20077.0-CURRENT nach dem Import von GCC 4.2.0.70004321. Mai 20077.0-CURRENT nachdem die Versionen aller
Shared-Libraries, welche seit RELENG_6 nicht geändert
wurden, erhöht worden sind.7000447. Juni 20077.0-CURRENT nachdem das Argument für
vn_open()/VOP_OPEN() vom Dateideskriptorindex zur Struktur
file * geädert wurde.70004510. Juni 20077.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.70004611. Juni 20077.0-CURRENT nach aktualisierter 802.11 wireless
Unterstützung.70004711. Juni 20077.0-CURRENT, nachdem
TCP-LRO-Schnittstellen-Ressourcen hinzugefügt
wurden.70004812. Juni 20077.0-CURRENT, nachdem die RFC 3678
API-Unterstützung zum IPv4-Stack hinzugefügt
wurde. Veraltetes RFC 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.7000493. Juli 20077.0-CURRENT, nachdem pf von OpenBSD 4.1
importiert wurde(nicht geändert)7.0-CURRENT, nachdem die IPv6-Unterstützung
um FAST_IPSEC erweitert, KAME IPSEC entfernt und
FAST_IPSEC in IPSEC umbenannt wurde.7000504. Juli 20077.0-CURRENT, nachdem Aufrufe von
setenv/putenv/usw. von der traditionellen
BSD-Art und Weise nach POSIX konvertiert
wurden.7000514. Juli 20077.0-CURRENT, nachdem neue Systemaufrufe
(mmap/lseek/usw.) implementiert wurden.7000526. Juli 20077.0-CURRENT, nachdem die I4B-Header nach
include/i4b verschoben wurden.70005330. September 20077.0-CURRENT, nachdem die Unterstützung
für PCI Domänen hinzugefügt
wurde.70005425. Oktober 20077.0-CURRENT, nach der Trennung in "wide und
single byte ctype".70005528. Oktober 20077.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.70010022. Dezember 20077.0-STABLE nach 7.0-RELEASE.7001018. Februar 20087.0-STABLE nach Einführung von
m_collapse().70010230. März 20087.0-STABLE nach Einfließen von
kdb_enter_why().70010310. April 20087.0-STABLE nach Hinzufügen von l_sysid zu
struct flock.70010411. April 20087.0-STABLE nach Übernahme von
procstat(1).70010511. April 20087.0-STABLE nach Einführung von
umtx-Features.70010615. April 20087.0-STABLE nach Hinzufügen der
Unterstützung von &man.write.2; zu
&man.psm.4;.70010720. April 20087.0-STABLE nach Hinzufügen des Befehls
F_DUP2FD zu &man.fcntl.2;.7001085. Mai 20087.0-STABLE nach einigen Änderungen an
&man.lockmgr.9;, welche die Einbindung von
sys/lock.h zur Verwendung von
&man.lockmgr.9; voraussetzen.70010927. Mai 20087.0-STABLE nach Einfließen der
memrchr-Funktion.7001105. August 20087.0-STABLE nach Einführung eines Clients
für den Kernel NFS lockd.70011120. August 20087.0-STABLE nach Hinzufügen einer
Unterstützung von physisch fortlaufender
Jumbo Frames.70011227. August 20087.0-STABLE nach Einfließen einer
Kernelunterstützung für DTrace.70100025. November 20087.1-RELEASE70110025. November 20087.1-STABLE nach 7.1-RELEASE.70110110. Januar 20097.1-STABLE nach Übernahme von
strndup.70110217. Januar 20097.1-STABLE nach Hinzufügen einer
Unterstützung von cpuctl(4).7011037. Februar 20097.1-STABLE nach Einfließen der
Unterstützung von Jails mit keinen oder mehreren
IPv4-/IPv6-Adressen.70110414. Februar 20097.1-STABLE, nachdem der Besitzer des Suspend in
struct mount gespeichert wird und die Funktion
vfs_susp_clean in struct vfsops aufgenommen
ist.70110512. März 20097.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.70110614. März 20097.1-STABLE nach der Übernahme einer
Fehlerbehebung für Warteoperationen, die
POSIX-Semaphore verwenden.70200015. April 20097.2-RELEASE70210015. April 20097.2-STABLE nach 7.2-RELEASE.70210115. Mai 20097.2-STABLE, nachdem ichsmb(4) dahingehend
geändert wurde, dass es links-ausgerichtete
Adressierung von Slaves verwendet, um anderen
SMBus-Kontrollertreibern zu entsprechen.70210228. Mai 20097.2-STABLE nach dem Einfließen der Funktion
fdopendir.80000011. Oktober 20078.0-CURRENT. Nach der Trennung in "wide und
single byte ctype".80000116. Oktober 20078.0-CURRENT, nachdem libpcap 0.9.8 und
tcpdump 3.9.8 importiert wurden.80000221. Oktober 20078.0-CURRENT, nachdem kthread_create() und
Konsorten in kproc_create() usw. umbenannt
wurden.80000324. Oktober 20078.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.80000412. November 20078.0-CURRENT, nachdem der agp(4) Treiber verschoben
wurde von src/sys/pci nach src/sys/dev/agp.8000054. Dezember 20078.0-CURRENT nach Änderungen
am Jumbo Frame Allocator.8000067. Dezember 20078.0-CURRENT, nach dem Hinzufügen der
callgraph capture Funktionalität zu &man.hwpmc.4;.80000725. Dezember 20078.0-CURRENT nach dem Hinzufügen von "why"
als Argument in kdb_enter().80000828. Dezember 20078.0-CURRENT nach Entfernen der Option
LK_EXCLUPGRADE.8000099. Januar 20088.0-CURRENT nach Einführung von
&man.lockmgr.disown.9;80001010. Januar 20088.0-CURRENT nach Änderungen am
&man.vn.lock.9;-Prototyp.80001113. Januar 20088.0-CURRENT nach Änderungen an den
Prototypen von &man.VOP.LOCK.9; und
&man.VOP.UNLOCK.9;.80001219. Januar 20088.0-CURRENT nach Einführung von
&man.lockmgr.recursed.9;, &man.BUF.RECURSED.9; und
&man.BUF.ISLOCKED.9; sowie Entfernung von
BUF_REFCNT().80001323. Januar 20088.0-CURRENT nach Einführung der
ASCII-Kodierung.80001424. Januar 20088.0-CURRENT nach Änderungen am
&man.lockmgr.9;-Prototyp und Entfernung von
lockcount() sowie
LOCKMGR_ASSERT().80001526. Januar 20088.0-CURRENT nach Erweiterung der Datentypen der
&man.fts.3;-Strukturen.8000161. Februar 20088.0-CURRENT nach Hinzufügen eines neuen
Parameters zu MEXTADD(9).8000176. Februar 20088.0-CURRENT nach Einführung der Optionen
LK_NODUP und LK_NOWITNESS in die
&man.lockmgr.9;-Umgebung.8000188. Februar 20088.0-CURRENT nach Hinzufügen von
m_collapse.8000199. Februar 20088.0-CURRENT nach Hinzufügen einer Arbeits-,
Wurzel- und Jailverzeichnisunterstützung zur
sysctl-Variable kern.proc.filedesc.80002013. Februar 20088.0-CURRENT nach Einführung der Funktionen
&man.lockmgr.assert.9; und
BUF_ASSERT.80002115. Februar 20088.0-CURRENT nach Einführung von
&man.lockmgr.args.9; und Entfernung der Option
LK_INTERNAL.800022(zurückgezogen)8.0-CURRENT nach Setzen von BSD &man.ar.1;
als Systemstandard.80002325. Februar 20088.0-CURRENT nach Prototypenänderungen an
&man.lockstatus.9; und &man.VOP.ISLOCKED.9;, eigens zur
Abschaffung des Parameters
struct thread.8000241. März 20088.0-CURRENT nach Beseitigung der Funktionen
lockwaiters und
BUF_LOCKWAITERS, Änderung
des Rückgabewerts der Funktion
brelvp von void nach int sowie
Einführung neuer Optionen für
&man.lockinit.9;.8000258. März 20088.0-CURRENT nach Hinzufügen des Kommandos
F_DUP2FD zu &man.fcntl.2;.80002612. März 20088.0-CURRENT nach Änderung des Parameters
für die Priorität an cv_broadcastpri, sodass
0 für keine Priorität steht.80002724. März 20088.0-CURRENT nach Änderung der
Monitoring ABI von BPF, als Zero-Copy Puffer
hinzugefügt wurden.80002826. März 20088.0-CURRENT nach Hinzufügen von l_sysid zu
struct flock.80002928. März 20088.0-CURRENT nach Wiedereingliederung der Funktion
BUF_LOCKWAITERS und
Hinzufügen von &man.lockmgr.waiters.9;.8000301. April 20088.0-CURRENT nach Einführung der Funktionen
&man.rw.try.rlock.9; und &man.rw.try.wlock.9;.8000316. April 20088.0-CURRENT nach Einführung der Funktionen
lockmgr_rw und
lockmgr_args_rw.8000328. April 20088.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.8000338. April 20088.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
/dev/psm%d geschrieben und
der Status dann von dort gelesen werden.80003410. April 20088.0-CURRENT nach Einführung der Funktion
memrchr.80003516. April 20088.0-CURRENT nach Einführung der Funktion
fdopendir.80003620. April 20088.0-CURRENT nach Umstellung des Standards 802.11
auf Unterstützung von Multi-BSS (auch
vaps).8000379. Mai 20088.0-CURRENT nach Hinzufügen einer
Unterstützung für
Multi Routing-Tabellen (siehe setfib(1),
setfib(2)).80003826. Mai 20088.0-CURRENT nach Entfernen von netatm und
ISDN4BSD.80003914. Juni 20088.0-CURRENT nach Entfernen von sgtty.80004026. Juni 20088.0-CURRENT nach Einführung eines Clients
für den Kernel NFS lockd.80004122. Juli 20088.0-CURRENT nach Hinzufügen von
arc4random_buf(3) und arc4random_uniform(3).8000428. August 20088.0-CURRENT nach Hinzufügen von
cpuctl(4).80004313. August 20088.0-CURRENT nach Änderung von bpf(4) zur
Verwendung einer einzelnen Gerätedatei anstatt
von Klonierung.80004417. August 20088.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.80004520. August 20088.0-CURRENT nach Eingliederung des
MPSAFE TTY-Layers, einschließlich
Änderungen an diversen Treibern und Werkzeugen,
die mit ihm kommunizieren.8000468. September 20088.0-CURRENT nach Abschottung der GDT pro CPU auf
der AMD64-Architektur.80004710. September 20088.0-CURRENT nach Entfernen von VSVTX, VSGID und
VSUID.80004816. September 20088.0-CURRENT nach Anpassung des Codes für
Kernel NFS mount, sodass einzelne
Mountoptionen im Parameter struct iovec an
nmount() akzeptiert werden und nicht nur ein
großes struct nfs_args.80004917. September 20088.0-CURRENT nach Entfernen von &man.suser.9; und
&man.suser.cred.9;.80005020. Oktober 20088.0-CURRENT nach API-Änderungen im Umgang
mit dem Buffer Cache.80005123. Oktober 20088.0-CURRENT nach Entfernen der Makros
&man.MALLOC.9; und &man.FREE.9;.80005228. Oktober 20088.0-CURRENT nach Einführung von accmode_t
und Umbennung des Parameters a_mode an VOP_ACCESS nach
a_accmode.8000532. November 20088.0-CURRENT nach Änderung des Prototyps von
&man.vfs.busy.9; und Einführung der Optionen
MBF_NOWAIT sowie MBF_MNTLSTLOCK.80005422. November 20088.0-CURRENT nach Hinzufügen von Funktionen
im Bereich buf_ring, Memory Barriers und ifnet,
um mehrere Sendeschlangen auf Hardwareebene für
Karten zu ermöglichen, die dies
unterstützen, sowie einer
Ring Buffer-Implementierung ohne Lock, um
Treibern zu ermöglichen, Paketschlangen
effizienter zu verwalten.80005527. November 20088.0-CURRENT nach Hinzufügen einer
Unterstützung für &intel; Core, Core2
und Atom zu &man.hwpmc.4;.80005629. November 20088.0-CURRENT nach Einführung von Jails mit
mehreren oder gar keinen IPv4-/IPv6-Adressen.8000571. Dezember 20088.0-CURRENT nach Wechsel zum
ath_hal Quellcode.80005812. Dezember 20088.0-CURRENT nach Einführung der Funktion
VOP_VPTOCNP.80005915. Dezember 20088.0-CURRENT gliedert das neue ARPv2 ein.80006019. Dezember 20088.0-CURRENT nach Hinzufügen von
makefs.80006115. Januar 20098.0-CURRENT nach Umsetzung von
TCP Appropriate Byte Counting.80006228. Januar 20098.0-CURRENT nach Entfernen von minor(),
minor2unit(), unit2minor() usw.80006318. Februar 20098.0-CURRENT nach Änderung der
GENERIC-Konfiguration zur Verwendung des
USB2-Stack und Hinzufügen von fdevname(3).80006423. Februar 20098.0-CURRENT, nachdem der USB2-Stack nach dev/usb
verschoben wurde, um es zu ersetzen.80006526. Februar 20098.0-CURRENT nach Umbenennen aller Funktionen in
libmp(3).80006627. Februar 20098.0-CURRENT nach Anpassung des devfs-Verhaltens
im Zusammenhang mit USB.80006728. Februar 20098.0-CURRENT nach Hinzufügen von getdelim(),
getline(), stpncpy(), strnlen(), wcsnlen(),
wcscasecmp() und wcsncasecmp().8000682. März 20098.0-CURRENT nach Umbenennen der Geräteklasse
ushub in uhub.8000699. März 20098.0-CURRENT nach Umbenennen von libusb20.so.1 in
libusb.so.1.8000709. März 20098.0-CURRENT nach der Einführung von IGMPv3
und Source-Specific-Multicast (SSM) in den
IPv4-Stack.80007114. März 20098.0-CURRENT nach der Anpassung von gcc zur
Verwendung der C99-Inline-Semantik in den Modi c99 und
gnu99.80007215. März 20098.0-CURRENT, nachdem die Option IFF_NEEDSGIANT
entfernt wurde; Netzwerktreiber, die nicht MPSAFE
sind, werden nicht mehr unterstützt.80007318. März 20098.0-CURRENT, nachdem die dynamische Ersetzung von
Zeichenkettenkürzeln für rpath und
benötigte Pfade implementiert wurde.80007424. März 20098.0-CURRENT nach dem Einfließen von
tcpdump 4.0.0 und libpcap 1.0.0.8000756. April 20098.0-CURRENT, nachdem die Deklarationen von
struct vnet_net, struct vnet_inet und
struct vnet_ipfw geändert wurden.8000769. April 20098.0-CURRENT nach dem Hinzufügen von
Laufzeitprofilen in dummynet.80007714. April 20098.0-CURRENT nach dem Entfernen von VOP_LEASE()
und vop_vector.vop_lease.80007815. April 20098.0-CURRENT, nachdem die Felder aus
struct rt_weight zu struct rt_metrics und
struct rt_metrics_lite hinzugefügt wurden,
wobei die Deklaration von struct rt_metrics_lite
geändert wurde. RTM_VERSION wurde
hochgezählt (zurückgezogen).80007915. April 20098.0-CURRENT, nachdem Pointer auf
struct llentry zu struct route und
struct route_in6 hinzugefügt wurden.80008015. April 20098.0-CURRENT nach Änderung der Deklaration
von struct inpcb.80008119. April 20098.0-CURRENT nach Änderung der Deklaration
von struct malloc_type.80008221. April 20098.0-CURRENT nach Änderung der Deklaration
von struct ifnet und Hinzufügen von if_ref()
und if_rele() zur Verwaltung von Referenzen auf
ifnet.80008322. April 20098.0-CURRENT nach der Implementierung einer
systemnahen Bluetooth-HCI-API.80008429. April 20098.0-CURRENT nach Änderungen an IPv6-SSM und
MLDv2.80008530. April 20098.0-CURRENT, nachdem der Bau von VIMAGE-Kernel
mit einem aktiven Image unterstützt wird.8000868. Mai 20098.0-CURRENT nach Hinzufügen der
Unterstützung für Eingabezeilen mit
beliebiger Länge durch patch(1).80008711. Mai 20098.0-CURRENT nach einigen Änderungen im
Zusammenhang mit dem VFS-KPI. Der Thread-Parameter
wurde von den FSD-Teilen des VFS entfernt.
VFS_*-Funktionen benötigen
den Kontext nicht mehr, da er sich immer auf
curthread bezieht. In wenigen
Sonderfällen ist das bisherige Verhalten nicht
geändert worden.80008820. Mai 20098.0-CURRENT nach Änderungen am
net80211-Monitormodus.80008923. Mai 20098.0-CURRENT nach dem Hinzufügen der
Unterstützung von UDP-Kontrollblocks.80009023. Mai 20098.0-CURRENT nach der Virtualisierung der
Schnittstellenklonierung.80009127. Mai 20098.0-CURRENT nach dem Hinzufügen von
hierarchischen Jails und dem Entfernen des globalen
securelevel.80009229. Mai 20098.0-CURRENT nach der Änderung des
sx_init_flags()-KPI.
SX_ADAPTIVESPIN wurde
zurückgezogen und eine neue Option
SX_NOADAPTIVE wurde
eingeführt, um die umgekehrte Logik zu
behandeln.80009329. Mai 20098.0-CURRENT nach dem Hinzufügen von
mnt_xflag zu struct mount.80009430. Mai 20098.0-CURRENT nach dem Hinzufügen von
&man.VOP.ACCESSX.9;.80009530. Mai 20098.0-CURRENT nach der Änderung des
Polling-KPI. Die Polling-Handler liefern nun die Zahl
der verarbeiteten Pakete zurück. Die neue Option
IFCAP_POLLING_NOCOUNT wurde
weiter eingeführt, um anzugeben, dass der
Rückgabewert nicht von Bedeutung ist und das
Zählen der Pakete ausgelassen werden
soll.8000961. Juni 20098.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.
Beachten Sie, dass 2.2-STABLE sich nach dem
2.2.5-RELEASE manchmal als 2.2.5-STABLE
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.Etwas hinter die
bsd.port.mk-Anweisung schreibenSchreiben Sie bitte nichts hinter die .include
<bsd.port.mk>-Zeile. Normalerweise kann dies
vermieden werden, indem Sie die Datei
bsd.port.pre.mk irgendwo in der Mitte
Ihres Makefiles und
bsd.port.post.mk am Ende
einfügen.Sie dürfen entweder nur das
bsd.port.pre.mk/bsd.port.post.mk-Paar
oder bsd.port.mk alleine
hinzufügen; vermischen Sie diese Verwendungen
nicht!bsd.port.pre.mk definiert nur
einige Variablen, welche in Tests im
Makefile benutzt werden können,
bsd.port.post.mk definiert den
Rest.Hier sind einige wichtige Variablen, welche in
bsd.port.pre.mk definiert sind (dies ist
keine vollständige Liste, lesen Sie bitte
bsd.port.mk für eine
vollständige Auflistung).VariableBeschreibungARCHDie Architektur, wie von uname
-m zurückgegeben (z.B.
i386)OPSYSDer Typ des Betriebsystems, wie von uname
-s zurückgegeben (z.B.
FreeBSD)OSRELDie Release Version des Betriebssystems (z.B.,
2.1.5 oder
2.2.7)OSVERSIONDie numerische Version des Betriebssystems;
gleichbedeutend mit __FreeBSD_version.PORTOBJFORMATDas Objektformat des Systems
(elf oder aout;
beachten Sie, dass für moderne
Versionen von FreeBSD aout veraltet
ist).LOCALBASEDie Basis des local
Verzeichnisbaumes (z.B.
/usr/local/)PREFIXWo der Port sich selbst installiert (siehe Mehr Informationen über
PREFIX).Falls Sie die Variablen USE_IMAKE,
USE_X_PREFIX, oder
MASTERDIR definieren müssen, sollten
Sie dies vor dem Einfügen von
bsd.port.pre.mk machen.Hier sind ein paar Beispiele von Dingen, die Sie hinter
die Anweisung bsd.port.pre.mk schreiben
können:# lang/perl5 muss nicht kompliliert werden, falls perl5 schon auf dem System ist
.if ${OSVERSION} > 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
.endifSie haben sich daran erinnert Tabulator statt
Leerzeichen nach BROKEN= und
TCL_LIB_FILE= zu benutzen, oder?
:-).Benutzen Sie die exec-Anweisung in
Wrapper-SkriptenFalls 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 exec
dafür benutzen; zum Beispiel:#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"Die Funktion exec ersetzt den
Shell-Prozess mit dem angegebenen Programm. Falls
exec ausgelassen wird, verbleibt der
Shell-Prozess im Speicher während das Programm
ausgefährt wird und verbraucht unnötig
Systemressourcen.UIDs und GIDsDie aktuellen Listen von reservierten UIDs und GIDs sind
in ports/UIDs und
ports/GIDs zu finden.Falls Ihr Port einen bestimmten Benutzer auf dem zu
installierendem System benötigt, lassen Sie das
pkg-install-Skript den Aufruf von
pw machen, um ihn automatisch anzulegen.
Schauen Sie sich für ein Beispiel sysutils/symon an.
Ihr Port muss eine feste Benutzer/Gruppen-ID verwenden.
Sie müssen eine nicht benutzte UID
zwischen 50 und 999 benutzen und entweder in
ports/UIDs (für Benutzer) oder in
ports/GIDs (für Gruppen)
registrieren.Stellen Sie sicher, dass Sie keine UIDs verwenden,
welche schon vom System oder von einem anderen Port gebraucht
werden.Bitte fügen Sie einen Patch für diese beiden
Datei hinzu, falls für Ihren Port ein neuer Benutzer oder
Gruppe angelegt werden muss.Aufgaben vernünftig lösenDas Makefile 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
.if anstatt eines Shellkonstrukt
if zu verwenden, anstatt
do-extract neu zu definieren, dies
mit EXTRACT* machen, oder
GNU_CONFIGURE anstelle von
CONFIGURE_ARGS += --prefix=${PREFIX}
zu verwenden.Falls Sie sich in einer Situation wiederfinden, in der
Sie viel Code neu schreiben müssen, um etwas zu testen,
sollten Sie zuerst bsd.port.mk 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.Berücksichtigen Sie sowohl CC als
auch CXXDer Port sollte sowohl die CC- wie
auch die CXX-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.Falls der Port diese Variablen nicht
berücksichtigt, sollte NO_PACKAGE=ignores either
cc or cxx ins Makefile
eingefügt werden.Im Folgenden wird ein Beispiel eines
Makefiles gezeigt, welches die beiden
Variablen CC und CXX
berücksichtigt. Beachten Sie das
?=:CC?= gccCXX?= g++Nachfolgend ein Beispiel, welches weder
CC noch CXX
berücksichtigt:CC= gccCXX= g++Die Variablen CC und
CXX können auf FreeBSD-Systemen in
/etc/make.conf 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.Berücksichtigen Sie
CFLAGSDer Port sollte die Variable CFLAGS
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.Falls der Port diese Variablen nicht
berücksichtigt, sollte NO_PACKAGE=ignores
cflags ins Makefile
eingefügt werden.Im Folgenden wird ein Beispiel eines
Makefiles gezeigt, welches die Variable
CFLAGS berücksichtigt. Beachten Sie
das +=:CFLAGS+= -Wall -WerrorNachfolgend finden Sie ein Beispiel, welches die
CFLAGS-Variable nicht
berücksichtigt:CFLAGS= -Wall -WerrorDie Variable CFLAGS wird auf
FreeBSD-Systemen in /etc/make.conf
definiert. Im ersten Beispiel werden weitere Flags an die
Variable CFLAGS angehängt und somit
der bestehende Wert nicht gelöscht. Im zweiten Beispiel
wird die Variable ohne Rücksicht
überschrieben.Sie sollten Optimierungsflags aus
Makefiles Dritter entfernen. Die
CFLAGS des Systems beinhalten systemweite
Optimierungsflags. Ein Beispiel eines unveränderten
Makefiles:CFLAGS= -O3 -funroll-loops -DHAVE_SOUNDWerden nun systemweite Optimierungsflags verwendet so
würde das Makefile in etwa
folgendermaßen aussehen:CFLAGS+= -DHAVE_SOUNDThreading-BibliothekenDie Threading-Bibliothek muss mit Hilfe eines speziellen
Linker-Flags -pthread in die
Binärdateien unter &os; gebunden werden. Falls ein Port
auf ein direktes Verlinken gegen -lpthread
oder -lc_r besteht, passen Sie den Port
bitte so an, dass er die durch das Port-Framework
bereitgestellte Variable PTHREAD_LIBS
verwendet. Diese Variable hat üblicherweise den Wert
-pthread, kann aber auf einigen
Architekturen und &os;-Versionen abweichende Werte haben und
daher sollte nie -pthread direkt in Patches
geschrieben werden, sondern immer
PTHREAD_LIBS.Falls durch das Setzen von
PTHREAD_LIBS der Bau des Ports mit der
Fehlermeldung unrecognized option
'-pthread' abbricht, kann die Verwendung des
gcc als Linker durch setzen von
CONFIGURE_ENV auf
LD=${CC} helfen. Die Option
-pthread wird nicht direkt von
ld unterstützt.RückmeldungenBrauchbare Ä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.README.htmlNehmen Sie bitte keine README.html
in den Port auf. Diese Datei ist kein Bestandteil der
CVS-Sammlung sondern wird durch make readme
erzeugt.Einen Port durch BROKEN,
FORBIDDEN oder IGNORE als
nicht installierbar markierenIn 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 make,
die im Makefile des Ports genutzt werden
können. Der Wert der folgenden
make-Variablen wird dem Benutzer als Grund
für die Ablehnung der Installation des Ports
zurückgegeben. Bitte benutzen Sie die richtige
make-Variable, denn jede enthält eine
völlig andere Bedeutung für den Benutzer und das
automatische System, das von dem Makefile
abhängt, wie der
Ports-Build-Custer, FreshPorts und portsmon.VariablenBROKEN 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.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).Benutzen Sie BROKEN zum
Beispiel, wenn ein Port:nicht kompiliertbeim Konfiguration- oder Installation-Prozess
scheitertDateien außerhalb von
${LOCALBASE} installiertbeim 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)FORBIDDEN 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
FORBIDDEN 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 FORBIDDEN.IGNORE 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 IGNORE markiert sind,
erstellen. Verwenden Sie IGNORE zum
Beispiel, wenn ein Port:kompiliert, aber nicht richtig läuftnicht auf der installierten Version von &os;
läuft&os; Kernelquelltext zum Bauen benötigt,
aber der Benutzer diese nicht installiert hatein Distfile benötigt, welches aufgrund
von Lizenzbeschränkungen nicht automatisch
abgerufen werden kannnicht korrekt mit einem momentan installiertem
Port arbeitet (der Port hängt zum Beispiel von
www/apache21 ab,
aber www/apache13 ist
installiert)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
CONFLICTS.
CONFLICTS setzt
IGNORE dann
selbstständig.Um einen Port nur auf bestimmte
Systemarchitekturen mit IGNORE zu
markieren, gibt es zwei Variablen, die automatisch
IGNORE für Sie setzen:
ONLY_FOR_ARCHS und
NOT_FOR_ARCHS. Beispiele:ONLY_FOR_ARCHS= i386 amd64NOT_FOR_ARCHS= alpha ia64 sparc64Eine eigene IGNORE-Ausgabe kann
mit ONLY_FOR_ARCHS_REASON und
NOT_FOR_ARCHS_REASON festgelegt
werden. Für eine bestimmte Architektur sind
Angaben durch
ONLY_FOR_ARCHS_REASON_ARCH
und
NOT_FOR_ARCHS_REASON_ARCH
möglich.Wenn ein Port i386-Binärdateien
herunterlädt und installiert, sollte
IA32_BINARY_PORT gesetzt werden. Wenn
die Variable gesetzt ist, wird überprüft, ob
das Verzeichnis /usr/lib32 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 IGNORE automatisch
gesetzt.Anmerkungen zur ImplementierungZeichenketten 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:BROKEN= this port is unsupported on FreeBSD 5.xIGNORE= is unsupported on FreeBSD 5.xresultieren in den folgenden Ausgaben von
make describe:===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.===> foobar-0.1 is unsupported on FreeBSD 5.x.Kennzeichnen eines Ports zur Entfernung durch
DEPRECATED oder
EXPIRATION_DATEDenken Sie bitte daran, dass BROKEN
und FORBIDDEN nur als temporärer
Ausweg verwendet werden sollten, wenn ein Port nicht
funktioniert. Dauerhaft defekte Ports sollten komplett aus der
Ports-Sammlung entfernt werden.Wenn es sinnvoll ist, können Benutzer vor der
anstehenden Entfernung eines Ports mit
DEPRECATED und
EXPIRATION_DATE 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.Es ist möglich DEPRECATED ohne
EXPIRATION_DATE zu setzen (zum Beispiel, um
eine neuere Version des Ports zu empfehlen), aber das
Gegenteil ist sinnlos.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.Vermeiden Sie den Gebrauch des
.error-KonstruktesDer korrekte Weg eines Makefile
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 IGNORE auf einen nicht leeren
Wert zu setzen. Dieser wird dann formatiert und dem Benutzer
von make install ausgegeben.Es ist ein verbreiteter Fehler .error
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
/usr/ports/INDEX zu bauen auf (siehe
). Jedoch schlagen auch
trivialere Befehle wie make -V maintainer
in diesem Fall fehl. Dies ist nicht akzeptabel!Wie vermeidet man die Verwendung von
.errorNehmen Sie an, dass die Zeile
USE_POINTYHAT=yes in
make.conf enthalten ist. Der erste der
folgenden zwei Makefile-Schnipsel
lässt make index fehlschlagen,
während der zweite dies nicht tut..if USE_POINTYHAT
.error "POINTYHAT is not supported"
.endif.if USE_POINTYHAT
IGNORE=POINTYHAT is not supported
.endifVerwendung von sysctlVom Gebrauch von sysctl wird, außer in Targets,
abgeraten. Das liegt daran, dass die Auswertung aller
makevars, wie sie während
make index verwendet werden, dann den
Befehl ausführen muss, welches den Prozess weiter
verlangsamt.Die Verwendung von &man.sysctl.8; sollte immer durch die
Variable SYSCTL erfolgen, da diese den
vollständigen Pfad enthält und überschrieben
werden kann, so dies als notwendig erachtet wird.Erneutes Ausliefern von DistfilesManchmal ä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.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 distinfo aktualisieren.
Stellen Sie sicher, dass die Änderungen in Ihrem PR oder
Commit-Protokoll zusammengefasst sind, um zu
Gewährleisten, dass nichts Negatives passiert ist.Sie können auch mit den Autoren der Software in
Verbindung treten und sich die Änderungen bestätigen
lassen.Notwendige Abhilfen (Workarounds)Manchmal ist es nötig Fehler in Programmen, die mit
älteren Versionen von &os; ausgeliefert werden, zu
umgehen.Einige Versionen von &man.make.1; waren zumindest
auf &os; 4.8 und 5.0 in Bezug auf die Behandlung von
Vergleichen mit OSVERSION defekt. Dies
führte häufig zu Fehlern während
make describe (und damit auch
während des make index für
alle Ports). Abhilfe schafft hier, den bedingten Vergleich
in Leerzeichen einzuschließen, z.B.:
if ( ${OSVERSION} > 500023
) Beachten Sie, dass eine
Test-Installation eines Ports auf 4.9 oder 5.2 dieses
Problem nicht aufspürt.VerschiedenesDie Dateien pkg-descr und
pkg-plist sollten beide doppelt
kontrolliert werden. Wenn Sie einen Port nachprüfen und
glauben, dass man es besser machen kann, dann verbessern Sie
ihn bitte.Bitte kopieren Sie nicht noch mehr Exemplare der
GNU General Public License in unser System.Bitte überprüfen Sie alle gesetzlichen Punkte
gründlich! Lassen Sie uns bitte keine illegale Software
verbreiten!Beispiel eines MakefileHier ein Beispiel für ein
Makefile, welches als Vorlage für
einen neuen Port dienen kann. Alle zusätzlichen Kommentare
in eckigen Klammern müssen entfernt werden!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 Makefiles sollten Sie portlint verwenden.[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 <asami@FreeBSD.org>
#
# $FreeBSD$
[ ^^^^^^^^^ 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 "$FreeBSD$". 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 <bsd.port.mk>Auf dem Laufenden bleibenDie &os; Ports-Sammlung verändert sich ständig.
Hier finden Sie einige Informationen, wie Sie auf dem Laufenden
bleiben.
FreshPortsEiner der einfachsten Wege, um sich über
Aktualisierungen, die bereits durchgeführt wurden, zu
informieren, ist sich bei FreshPorts
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).Wenn Sie Fresh-Ports benutzen möchten,
benötigen Sie nur einen Account. Falls Sie sich mit einer
@FreeBSD.org E-Mailadresse registriert
haben, werden Sie den Anmeldelink am rechten Rand der Seite
finden. Diejenigen, die bereits einen FeshPorts-Account
haben, aber nicht Ihre @FreeBSD.org
E-Mailadresse benutzen, können einfach Ihre E-Mailadresse
auf @FreeBSD.org ändern, sich
anmelden, und dann die Änderung rückgängig
machen.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.Die Webschnittstelle zum Quelltext-RepositoryEs 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 CHANGES
dokumentiert. Solche, die nur bestimmte Ports betreffen, in
der Datei UPDATING.
Aber die maßgebliche Antwort auf alle Fragen liegt
zweifellos darin, den Quelltext von bsd.port.mk
und dazugehörige Dateien zu lesen.Die &os; Ports-MailinglisteWenn 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
CHANGES committet.Der Cluster zum Bauen von &os;-Ports auf pointyhat.FreeBSD.orgEine 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
package building
logs and errors finden.Alle Ports ausser denjenigen, die als
IGNORE markiert sind, werden gebaut. Ports,
die als BROKEN markiert sind, werden
dennoch ausprobiert, um zu sehen, ob das zugrunde liegende
Problem gelöst wurde (Dies wird erreicht, indem
TRYBROKEN an das
Makefile des Ports übergeben
wird).Die &os; Port-Distfile-PrüfungDer 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. Die FreeBSD
Ports Distfiles Prüfung 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.Das &os; Ports-Monitoring-SystemEine weitere praktische Ressource ist das FreeBSD
Ports-Monitoring-System (auch bekannt als
portsmon). 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.Als Ausgangspunkt können Sie alle Informationen
eines Ports mit Hilfe der Übersicht
eines Ports betrachten.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 portsmon 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.