Möchte man einen FreeBSD Port erstellen oder aktualisieren, so können verschiedene Aufgaben mit porttools vereinfacht werden. Zuerst müssen die porttools installiert werden. Diese findet man im FreeBSD Portbaum unter ports-mgmt/porttools:
# cd /usr/ports/ports-mgmt/porttools && make install clean
Ruft man die porttools das erste Mal auf, wird die .porttools Konfigurationsdatei angelegt, und die verfügbaren Module der porttools angezeigt:
# port
===> Generating /home/beat/.porttools configuration file
FreeBSD Port Tools 0.77
Usage: port <command> [<options>]
Available commands:
commit - commit a port into the FreeBSD Ports CVS Repository
create - create new port from template using newfile(1)
diff - generate diff against original port version
fetch - fetch distfile(s) of new port version
getpr - get patch/shar from a PR
help - display this command summary
install - install a port
submit - submit Problem Report with new port, or port change/update
test - test port (build, install, package, deinstall)
upgrade - upgrade a port
In der angelegten ~/.porttools Datei können nun Variablen gesetzt werden, welche von den porttools verwendet werden. Für was die Variablen verwendet werden, findet man in der Manpage porttools(5).
# FreeBSD Port Tools configuration file - see porttools(5)
# vim: ft=sh
EMAIL="beat@chruetertee.ch"
FULLNAME="Beat Gätzi"
ORGANIZATION=""
BUILDROOT="/tmp"
ARCHIVE_DIR=""
DIFF_MODE="CVS"
DIFF_VIEWER="more"
PORTLINT_FLAGS="abct
Um einen neuen Port zu erstellen, wechselt man in das Verzeichnis, in dem man den Port erstellen möchte und erstellt den Port mit Hilfe des create-Modules:
# cd /tmp
# port create portsopt
Es wurde nun ein Verzeichnis für den Port angelegt und eine Vorlage vom Makefile, pkg-descr und der pkg-plist erstellt:
# ls portsopt
Makefile pkg-descr pkg-plist
Jetzt können im Makefile die Variablen CATEGORIES, COMMENT, PORTVERSION, und MASTER_SITES gesetzt werden. Gegebenenfalls müssen die restlichen Variablen auch noch gesetzt werden, damit der Quellcode des Ports heruntergeladen werden kann:
# cd portsopt
# cat Makefile
# New ports collection makefile for: portsopt
# Date created: 2008-05-03
# Whom: Beat Gätzi <beat@chruetertee.ch>
#
# $FreeBSD$
#
PORTNAME= portsopt
PORTVERSION= 1.4
#PORTREVISION= 0
#PORTEPOCH= 0
CATEGORIES= ports-mgmt
MASTER_SITES= http://www.chruetertee.ch/files/download/
#MASTER_SITE_SUBDIR=
#PKGNAMEPREFIX=
#PKGNAMESUFFIX=
#DISTNAME=
#EXTRACT_SUFX=
#DISTFILES=
#DIST_SUBDIR= ${PORTNAME}
#EXTRACT_ONLY=
MAINTAINER= beat@chruetertee.ch
COMMENT= Shows WITH(OUT)-knobs of a port makefile
.include <bsd.port.pre.mk>
.include <bsd.port.post.mk>
Nicht benötigte Variablen können aus dem Makefile entfernt werden. Nun kann mit Hilfe des porttools der Quellcode heruntergeladen werden. Die Prüfsummen des Ports werden automatisch erstellt. Diese müssen noch mit den offiziellen Prüfsummen verglichen werden:
# port fetch
=> portsopt-1.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://www.chruetertee.ch/files/download/.
portsopt-1.4.tar.gz 100% of 1126 B 1348 kBps
# cat distinfo
MD5 (portsopt-1.4.tar.gz) = 9062b0fa280e98750dc29a13c41617e3
SHA256 (portsopt-1.4.tar.gz) = 845d6518ff2369fc6f17b6fa0299cba6e3251c7d2568b34c78e603d1a3d556f7
SIZE (portsopt-1.4.tar.gz) = 1126
Nun müssen die restlichen Variablen und make-Targets erstellt werden, die zum Bauen des Ports benötigt werden. Damit auch alle installierten Dateien beim Deinstallieren des Portes wieder entfernt werden, müssen alle Dateien in der Datei pkg-plist aufgelistet werden. Welche Dateien alles installiert werden, kann zum Beispiel mit ftrace herausgefunden werden. Werden nur wenige Dateien oder Verzeichnisse erstellt, können diese auch im Makefile unter PLIST_FILES und PLIST_DIRS aufgeführt und die Datei pkg-plist kann gelöscht werden. Wie die pkg-plist aufgebaut ist, findet man im Porters Hanbook. In der Datei pkg-descr muss nun noch eine Beschreibung des Programms erstellt und die URL zur offiziellen Seite des Programms eingefügt werden. Ist der Port fertig, kann er mit port test getestet werden. Der Port wird dabei standardmässig nach /tmp installiert:
# port test
===> Validating port with portlint
WARN: Makefile: only one MASTER_SITE configured. Consider adding additional mirrors.
0 fatal errors and 1 warning found.
===> flags: PREFIX=/tmp/portsopt-1.4 NO_DEPENDS=yes PKG_DBDIR=/tmp/pkg_db.ud9qtv5I
===> Cleaning workspace before port test
===> Cleaning for portsopt-1.4
===> Extracting for portsopt-1.4
=> MD5 Checksum OK for portsopt-1.4.tar.gz.
=> SHA256 Checksum OK for portsopt-1.4.tar.gz.
===> Patching for portsopt-1.4
===> Configuring for portsopt-1.4
===> Installing for portsopt-1.4
===> Generating temporary packing list
===> Checking if ports-mgmt/portsopt already installed
install -o root -g wheel -m 555 /usr/ports/ports-mgmt/portsopt/work/portsopt-1.4/portsopt /tmp/portsopt-1.4/sbin
===> Registering installation for portsopt-1.4
===> Building package for portsopt-1.4
Creating package /usr/ports/packages/All/portsopt-1.4.tbz
Registering depends:.
Creating bzip'd tar ball in '/usr/ports/packages/All/portsopt-1.4.tbz'
===> Checking pkg_info
portsopt-1.4 Shows WITH(OUT)-knobs of a port makefile
===> Checking shared library dependencies
===> Deinstalling for ports-mgmt/portsopt
===> Deinstalling portsopt-1.4
===> Extra files and directories check
===> Cleaning up after port test
===> Cleaning for portsopt-1.4
===> Removing existing /tmp/portsopt-1.4 dir
===> Done.
Treten beim Testen keine Fehler auf, kann der Port mittels einem Problem Report eingesandt werden. Dazu kann einfach port submit im Port-Verzeichnis eingegeben werden:
# port submit
Nun wird ein Editor mit dem Problem Report geöffnet. Die wichtigsten Teile des Problem Reports sind bereits ausgefüllt. Auch ist der neue Port als shar-Archiv bereits angehängt. Speichert man den Problem Report und schliesst den Editor, wird nachgefragt, was man damit machen möchte. Um den Problem Report abzusenden kann s gedrückt werden:
s)end, e)dit or a)bort? s
Den Problem Report findet man nach einiger Zeit im GNATS und wird danach von einem FreeBSD-Commiter in den Portbaum aufgenommen.
Mit den porttools lassen sich nicht nur Ports erstellen, sondern auch bestehende Ports aktualisieren. Dazu sichert man zuerst den aktuellen Port:
# cd /usr/ports/www
# cp -Rp fluxcms fluxcsm.orig
Nun können alle Änderungen am Port durchgeführt werden. Die Änderungen können danach auch wieder mit port test geprüft werden. Möchte man die gemachen Änderungen anschauen, kann dazu port diff verwendet werden. Hat der originale Port den Suffix .orig, kann dies den porttools mit der -d Option übergeben werden:
# ls -d /usr/ports/www/fluxcms*
/usr/ports/www/fluxcms/ /usr/ports/www/fluxcms.orig/
# cd /usr/ports/www/fluxcms
# port diff -d .orig
Sind alle Änderungen abgeschlossen, können diese wieder mit einem Problem Report eingesandt werden. Auch hier wird der Patch automatisch von den porttools erstellt. Dazu muss auch wieder der Suffix des originalen Portverzeichnisses mit -d übergeben werden. Der Problem Report wird standardmässig als "non-critical" und der Dringlichkeit low eingesandt. Das kann, wenn nötig, mit der -s und der -s Option, zum Beispiel bei einem Sicherheitsupdate ,überschrieben werden. Gültige Werte bei -s sind non-critical, serious oder critical, bei -p low, medium oder high.
# port submit -d .orig
Nun müssen im Editor noch in der Zeile Synopsis der Platzhalter [SUMMARIZE CHANGES] durch einen kleine Beschreibung der Änderung ersetzt werden. Bei Description sollte der Platzhalter [DESCRIBE CHANGES] durch eine ausführlichere Beschreibung der Änderungen ersetzt werden. Beim Beenden des Editors muss das Versenden des Problem Reports wieder bestätigt werden.
Mehr Informationen wie man FreeBSD Ports erstellt oder aktualisiert findet man im FreeBSD Porter's Handbook. Mehr Informationen zu den porttools findet man in der Manpage port(1) .
Vielen Dank an Martin für seine hilfreichen Anregungen beim Erstellen dieses Artikels.