---
title: Kapitel 9. Ihren Port testen
prev: books/porters-handbook/pkg-files
next: books/porters-handbook/port-upgrading
showBookMenu: true
weight: 9
params:
  path: "/books/porters-handbook/testing/"
---

[[testing]]
= Ihren Port testen
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 9
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[make-describe]]
== `make describe` ausführen

Einige der FreeBSD-Werkzeuge zur Pflege von Ports, wie zum Beispiel man:portupgrade[1], verwenden eine Datenbank names [.filename]#/usr/ports/INDEX#, welche Eigenschaften, wie z.B. Port-Abhängigkeiten, verfolgt. [.filename]#INDEX# wird vom Makefile der höchsten Ebene, [.filename]#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 [.filename]#INDEX# nicht generiert werden und schnell werden viele Leute darüber unzufrieden sein.

[NOTE]
====
Es ist wichtig diese Datei erzeugen zu können, unabhängig davon, welche Optionen in [.filename]#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 crossref:porting-dads[dads-dot-error,Vermeiden Sie den Gebrauch des `.error`-Konstruktes]).
====

Wenn `make describe` eine Zeichenkette anstatt einer Fehlermeldung erzeugt, sind Sie wahrscheinlich auf der sicheren Seite. Vergleichen Sie die erzeugte Zeichenkette mit [.filename]#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.

[[testing-portlint]]
== Portlint

Bitte überprüfen Sie Ihre Arbeit stets mit <<porting-portlint,`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 {freebsd-ports} nach.

[[testing-porttools]]
== Port Tools

Das Programm package: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 <<testing-portlint,`portlint`>>-Überprüfung, durchgeführt werden. Dieser Befehl spürt ausserdem alle nicht in [.filename]#pkg-plist# enthaltenen Dateien auf und gibt eine Liste dieser aus. Hier ein Beispiel:

[source,shell]
....
# port test /usr/ports/net/csup
....

[[porting-prefix]]
== `PREFIX` und `DESTDIR`

`PREFIX` bestimmt, an welche Stelle der Port installiert werden soll. In der Regel ist dies [.filename]#/usr/local# oder [.filename]#/opt#, was jedoch anpassbar ist. 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 [.filename]#/# 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 [.filename]#/usr/local#). Falls `USE_LINUX_PREFIX` gesetzt ist, wird `PREFIX LINUXBASE` annehmen (Standard ist [.filename]#/compat/linux#).

Die Vermeidung der hart kodierten Angaben von [.filename]#/usr/local# oder [.filename]#/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 [.filename]#/usr/local# (oder [.filename]#/usr/X11R6# für X-Ports, die nicht imake benutzen) in den verschiedenen [.filename]##Makefile##s 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 [.filename]#/usr/local# an Stelle von `PREFIX` installiert. Um dies festzustellen, können Sie folgendes machen:

[source,shell]
....
# 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 [.filename]#/var/tmp/`make -V PORTNAME`# würde dies erledigen.

Die Variable `PREFIX` kann in Ihrem [.filename]#Makefile# oder der Umgebung des Benutzers neu gesetzt werden. Allerdings wird für einzelne Ports dringend davon abgeraten diese Variable in den [.filename]##Makefile##s 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: 

[.programlisting]
....
-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 [.filename]#/usr/local#-Baum an eine andere Stelle verschoben hat.

[[testing-tinderbox]]
== Die Tinderbox

Wenn 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 <<build-cluster,Pointyhat>> verwendet werden. Sie können Tinderbox installieren, indem Sie den Port package: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 http://tinderbox.marcuscom.com/[Tinderbox Homepage].
