# Ports (Paketverwaltung)

Mit Ports werden Software-Paketverwaltungssysteme in der Welt der Unix-Derivate, speziell der BSD-Betriebssysteme bezeichnet. Ein Port bezeichnet meist ein Verzeichnis, in dem sich alle für die Installation benötigten Dateien sowie das Makefile („Kochrezept“) befinden.

## Geschichte und Verbreitung

Das erste Portsframework wurde von Jordan K. Hubbard 1994 für FreeBSD entwickelt. Später wurde die Idee von OpenBSD, NetBSD (unter dem Namen pkgsrc) und Darwin übernommen. Ports hielten auch Einzug in die Linuxwelt. So haben Gentoo, CRUX und Arch Linux ports-ähnliche Paketverwaltungssysteme namens Portage, pkgutils und Arch Build System.

## Technische Funktionsweise

Beim Installieren über das Portssystem wird die Software (wenn möglich) automatisch aus dem Internet heruntergeladen und installiert. Das Portssystem besteht lediglich aus Informationen, woher man die Software bekommt, welche Anpassungen für das jeweilige System notwendig sind und wie die Software zu installieren ist. Außerdem werden alle Dateien, die ein Softwarepaket installiert, aufgezeichnet, so dass das Paket auch wieder deinstalliert werden kann. Ein Paket kann durchaus von mehreren Paketen abhängen, die allesamt nach dem Herunterladen kompiliert, evtl. konfiguriert und dann installiert werden. Dies geschieht nahezu automatisch, evtl. mit benötigten Zusatzangaben des Nutzers. Zunächst wird ein Archiv, das die Dateien der aktuellen Ports enthält, von einem Server geladen und entpackt. Dieses startet automatisch einen Vorgang zur Installation des Ports und dieser kann anschließend verwendet werden.
Ursprünglich waren die Ports eine Sammlung von Makefiles mit Zielformaten (targets) für das automatische Herunterladen, Auspacken, Patchen, Kompilieren und Installieren von Softwarepaketen. Ein weiteres target dient dem Erzeugen eines Binärpakets. Es können auch andere Skriptsprachen wie Python bei Gentoo Linux oder Tcl bei MacPorts verwendet werden.

### FreeBSD-Ports

Unter FreeBSD befindet sich der sogenannte Portstree standardmäßig unter /usr/ports. Der Portstree besteht aus Verzeichnissen, in denen sich Installationsanleitungen, in Kategorien gegliedert, befinden. Unter /usr/ports/Mk liegen verschiedene Makefiles, die von den einzelnen Ports eingebunden werden. bsd.port.mk ist das Hauptmakefile, es enthält die vordefinierten targets, so dass die Portmakefiles meist nur einzelne Variablen setzen müssen. Informationen über installierte Ports findet man standardmäßig unter /var/db/pkg.
Um die Ports hat sich ein kleines Ökosystem an Werkzeugen gebildet, die das Installieren von Ports stark vereinfachen. Nennenswert sind portsnap, das automatisch den Portstree aktualisiert, portmaster, ein Programm, das ähnlich einem Linux-Paketverwaltungswerkzeug zu bedienen ist und das Installieren und Updaten von Ports noch weiter vereinfacht als es sowieso schon ist, pkg_cutleaves, das nicht weiter benötigte Ports finden und deinstallieren kann (beispielsweise Bibliotheken, von denen kein installierter Port mehr abhängt) oder portupgrade, das ähnliche Aufgaben wie portmaster übernimmt. Die Portwerkzeuge selbst finden sich im Portstree im Subtree ports-mgmt/.

### OpenBSD-Ports

OpenBSD stellt, wie FreeBSD, ein Portsystem zur Verfügung. Normalerweise werden die dafür nötigen Dateien wie bei FreeBSD unter /usr/ports abgelegt. Ports sind, wie bei den anderen Portsystemen, in Untergruppen untergliedert, um die Suche nach geeigneter Software zu erleichtern. Sollte man dennoch nicht fündig werden, so hilft OpenBSD, in dem man in das Verzeichnis wechselt, in dem die Ports gespeichert sind (in unserem Beispiel also /usr/ports) und dort „make search key=SUCHBEGRIFF“ eingibt. Dabei reicht der Suchbegriff von „http“ bis zu präzisen Namen der Pakete. Sollte man den Namen einer Software bereits wissen, aber nicht mehr wissen, wo man sie findet, so kann man „make search name=NAME_DER_SOFTWARE“ eingeben und bekommt alle möglichen Varianten („FLAVORs“) dieser Software.
Da gewisse Software Module beinhalten kann, reagiert OpenBSD darauf mit sogenannten FLAVORs. Ein FLAVOR ist nichts anderes als eine Art Compilerflag. Möchte man beispielsweise eine Software mit PostgreSQL-Unterstützung kompilieren (z. B. PHP), so kann man dies mit dem Aufruf „env FLAVOR=postgresql make install“ tun (wobei „postgre“ üblicherweise durch psql abgekürzt wird) oder die Änderung permanent in dem Makefile des betreffenden Ports anpassen.
Auch OpenBSD kennt ein globales Makefile, wobei man zwischen dem Makefile für das Betriebssystem (/etc/mk.conf) und dem für das Port-System (/usr/ports/infrastructure/mk/bsd.port.mk) unterscheiden muss.
Generell sorgt das OpenBSD-Portsystem für eine automatische Installation, die Nachinstallation von benötigter Software (sog. dependencies, dt. Abhängigkeiten), die Übersetzung der Software aus dem Quellcode, die anschließenden Erstellung eines Binärpakets und das Ablegen dieses Paketes in /usr/ports/packages/ . Installierte Pakete werden entweder mittels pkg_info aufgelistet oder sind wie bei FreeBSD unter /var/db/pkg aufgeführt.
Ein Unterschied zu den FreeBSD-Ports ist, dass die Ports nicht direkt installiert werden. Stattdessen werden, da OpenBSD eigentlich (binär-)paketorientiert ist, also eigentlich vorkompilierte Pakete genutzt werden, beim Installieren eines Ports implizit Pakete gebaut (bei OpenBSD .tar.gz-Dateien) und diese dann (ebenfalls implizit) mit pkg_add installiert. Mit make package wird dabei nur das Paket gebaut. Der Portstree wird bei OpenBSD vorrangig von Entwicklern oder Administratoren größerer Netzwerke genutzt, um die unter OpenBSD üblichen Binärpakete zu bauen.

### NetBSD pkgsrc

NetBSD verwendet den Begriff „Port“ für die Portierung von NetBSD auf eine Hardwareplattform, weshalb NetBSD seinen Fork der FreeBSD ports „pkgsrc“ genannt hat. NetBSDs pkgsrc wurde mittlerweile auch auf verschiedene andere Betriebssysteme portiert, unter anderem Linux, Solaris und Mac OS X.

### MacPorts

MacPorts für OS X (ehemals DarwinPorts) verwendet statt des Programms make das Tcl-Skript port.

### Gentoo Linux Ebuilds

Ebuild ist ein Skript, welches automatisiert Installationsprozeduren für Software-Pakete zusammenstellt. Es wurde vom Gentoo-Linux-Projekt für den Einsatz in der Portage-Software-Management-System erstellt.