1) Einleitung und Vorstellung von DarwinPorts DarwinPorts bietet eine Infrastruktur für die einfache Installation von frei verfügbarer Software auf Apple's Mac OS 10.2 (Jaguar) und Darwin 6.0.x. DarwinPorts gehört zu den Projekten die von Opendarwin.org gehostet werden. Ebenso wie das FreeBSD Ports-System automatisiert DarwinPorts das Lokalisieren, Herunterladen, Konfigurieren, Patchen, Kompilieren und Installieren von 3rd-party Software. Wie bei anderen Ports-Systemen werden dabei Abhängigkeiten zwischen Software-Paketen selbständig aufgelöst. Implementiert ist DarwinPorts in portablem Tcl, zusätzlich gibt es ein paar, in C geschriebener, Tcl-Erweiterungen. Das Vorhandensein eines Tcl-Interpreters ist daher notwendig (dieser ist bei Mac OS 10.2 und Darwin 6.0.x bereits dabei). 2) Herunterladen von DarwinPorts via CVS Bisher besteht die einzige Möglichkeit DarwinPorts zu beziehen via CVS das Projekt 'darwinports' aus dem OpenDarwin-Repository auszuchecken. $ cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od login $ cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od co -P darwinports Die Anfrage des Servers nach dem Passwort, einfach mit 'enter' bestätigen, das Passwort ist leer. Um in Zukunft den DarwinPorts-Checkout zu aktualisieren, in das durch den Checkout enstandene Verzeichnis wechseln und dann CVS mit dem Update Parameter aufrufen. $ cvs up -PAd Ein mehrmals täglich aktualisierter Snapshot des CVS findet sich unter http://www.opendarwin.org/~fkr/ . Der Snapshot beinhaltet alle CVS-Verzeichnisse, kann also auch mittels 'cvs up -PAd' aktualisiert werden. 3) Installation der DarwinPorts-Umgebung DarwinPorts selbst ist in zwei Teile aufgesplittet. Zum einem in die DarwinPorts-Infrastruktur, die im base/-Verzeichnis liegt und den einzelnen Ports die unter dports/ zu finden sind. DarwinPorts wurde bereits auf FreeBSD portiert, so dass es auch auf dieser Plattform installiert werden kann. Allerdings unterstützt nur ein Teil der Ports FreeBSD. Damit Ports installiert werden können, muss zuerst die Infrastruktur von DarwinPorts installiert werden. Dies geschieht mittels 'make'. Dazu wird zuerst in das Verzeichnis das durch den CVS-Checkout entstanden ist gewechselt und dort 'make' aufgerufen, $ cd darwinports/ $ make und schliesslich (als root oder mittels sudo) durch $ sudo make install die Umgebung installiert. Per default wird das Zielverzeichniss auf /opt/local gesetzt. Um dies zu ändern kann man 'make' mit einem entsprechenden Parameter aufrufen: $ make PREFIX=/usr/local In diesem Fall wäre das Zielverzeichniss auf /usr/local gesetzt. In $PREFIX/bin/ liegt das Kommandozeilen-Tool 'port' und unter $PREFIX/share/darwinports die Tcl-Bibliotheken. Die Konfiguration der Ports-Umgebung erfolgt durch die Dateien ports.conf und sources.conf in /etc/ports. Die Datei ports.conf wird benutzt um die default-Einstellung zu überschreiben. sources_conf - gibt den Pfad zu der Datei sources.conf an portdbpath - das Status-Verzeichnis, unterhalb dieses Verzeichnises landen auch von 'port' heruntergeladene Source-Pakete prefix - hier kann der prefix angegeben werden, unter dem Ports installiert werden Folgende Einstellungen sind hauptsächlich für Entwickler interessant: ports_debug - wird dies auf 'yes' gesetzt, gibt 'port' Debug-Nachrichten aus ports_verbose - falls auf 'yes' gesetzt, werden von 'port' zusätzliche Informationen ausgegeben. Die in der ports.conf angegebene Datei sources.conf beinhaltet Adressen zu den Ports-Repositories. Ein Port-Repository ist das dports/ Verzeichnis was bei dem Checkout von DarwinPorts erstellt wird. Per default, sucht 'port' relativ zum aktuellen Verzeichnis nach einem Repository. In der sources.conf kann aber das lokale Repository angegeben werden, so dass 'port' von überall aus aufgerufen werden kann. Auf meinem System sieht der Eintrag in der /etc/sources.conf wie folgt aus: file:///Users/fkr/develope/opendarwin/darwinports/dports Damit installierte Software von der Shell gefunden wird, muss $PREFIX (per default ist dies /opt/local) der path-Variable hinzugefügt werden. Für die Zukunft ist es vorgesehen auch auf "remote repositories" zugreifen zu können. 4) Ports installieren mit dem Kommandozeilen-Tool 'port' 'port' ist das Kommandozeilen-Tool zum Installieren und Deinstallieren von Ports. 'port' versteht verschiedene Parameter und 'targets'. Mit $ port install ncftp wird der Port von 'ncftp' installiert. Um einen Port wieder zu deinstallieren, wird 'port' (statt mit install) mit uninstall aufgerufen. Um festzustellen, ob ein bestimmer Port vorhanden ist, kann man mittels 'port' danach suchen: $ port search ncftp sucht im port-Repository nach 'ncftp'. 5) Interne Struktur eines Ports Ein Port besteht aus dem sogenannten 'Portfile' und möglichen Patches für die Original-Quellen. Anders als bei den Ports-Systemen der anderen BSDs (FreeBSD, OpenBSD, NetBSD) ist das Portfile kein Makefile, sondern Tcl-Code. Für den Port von 'abook' sieht das Portfile wie folgt aus: --- PortSystem 1.0 name abook version 0.4.17 categories mail description Address book with mutt support platforms darwin maintainers fkr@opendarwin.org master_sites http://us.dl.sourceforge.net/abook/ \ http://eu.dl.sourceforge.net/abook/ \ [...] ftp://ftp.chg.ru/pub/sourceforge/abook checksums md5 ec1cbee2c10b677ecbeb36a144c5eaf0 contents bin/abook \ man/man1/abook.1 \ man/man5/abookrc.5 --- 'PortSystem' steht für die Versionsnummer des Ports-Framework. 'name' ist der Name des Ports, 'version' steht für die Upstream-Version des Ports. Falls es nicht die erste Revision des Ports ist, wird die Revisionsnummer durch revision angegeben. Die Kategorie wird mittels 'categories' angegeben, falls mehrere Kategorien angegeben werden, ist die erste die primäre Kategorie. Eine kurze Beschreibung der Software wird mittels 'description' angegeben. Für längere Beschreibungen gibt es die 'long_description'. Einige der Ports können auch unter FreeBSD installiert werden. In diesem Fall ist bei 'platforms' nicht nur 'darwin' sondern auch noch 'freebsd' angegeben. Die Quellen der Source-Pakete sind unter master_sites zu finden. Damit die Source-Pakete auf Korrektheit überprüft werden können, muss das 'checksums' Feld auf die entsprechende Prüfsumme gesetzt werden. 'port' verifiziert nach dem Herunterladen (was mittels 'curl', einem Programm zum Transfer von Dateien, geschieht) die Summe des Source-Paketes mithilfe der im Portfile angegebenen Prüfsumme. Die von dem Port installierten Dateien werden (ohne das $PREFIX) im Portfile unter 'contents' aufgelistet. Installiert ein Port eine grössere Menge von Dateien, wird eine separate Datei 'contents' angelegt, in der die Dateien aufgelistet sind: contents { pfad/datei1 pfad/datei2 } Diese Datei wird dann im Portfile mit 'include contents' eingebunden. Müssen die Originalquellen des Ports vorm Installieren angepasst werden, so liegt für jede zu patchende Datei ein entsprechender Patch im files/-Verzeichnis des Ports. Die Patches werden im Portfile mit 'patchfiles' angegeben: patchfiles patch1 patch2 patch3 Die Patches sind so erstellt, das sie mit dem '-p0' Parameter von 'patch' funktionieren. Das Installieren eines Port besteht aus mehreren Phasen: fetch extract configure build install fetch - in dieser Phase wird das Quell-Paket von der in master_sites angebenen Stelle mit 'curl' heruntergeladen. Die Quell-Pakete werden von 'port' in ${portdbpath}/distfiles abgelegt. ${portdbpath} entspricht dem Parameter in der ports.conf. Vor dem Entpacken des Quellpaketes in der extract-Phase, findet ein Vergleich der Prüfsumme statt. Unterstützt die Software die Verwendung von './configure', wird das configure-Script in der configure-Phase ausgeführt. Dem ./configure-Script wird von 'port' automatisch der Parameter '--prefix=${prefix}' (wobei ${prefix} dem in der ports.conf angegeben Parameter prefix entspricht) übergeben. Sind weitere Parameter notwendig, so können diese im Portfile mit 'configure.env' angegeben werden. configure.env '-I${prefix}/include -L${prefix}/lib' Nach der configure-Phase wird in der build-Phase die Software kompiliert. Auch hier können zusätzliche Parameter über das Portfile mittels 'build.env' gesetzt werden. In der abschliessenden Phase 'install' wird dann die Software unter $PREFIX installiert. Jede der Phasen kann im Portfile überschrieben werden. Unterstützt ein Port kein ./configure-Script so kann dies durch das Überschreiben dieser Phase im Portfile übersprungen werden: configure {} Falls der Port keine eigene Installations-Routine hat, kann diese durch das Überschreiben der install-Phase angelegt werden: install { system "cd '${worksrcpath}' && install '${name}' '${prefix}'/bin" } Zuerst wird in das Verzeichnis der zu installierenden Software gewechselt, welches im Verzeichniss des Ports unterhalb von work/ liegt, dann wird 'install' aufgerufen, dies installiert die angegbene Datei (oder Verzeichnis) in ein angegebens Zielverzeichnis. In diesem Fall wird nur das Binary (welches genauso lautet, wie der Port-Name, weswegen hier '${name}' verwendet wird) nach ${prefix}/bin kopiert. Noch gibt es keine Möglichkeit aus den Ports vorkompilierte Packages zu erzeugen, dieses Feature ist aber geplant. 6) dp-cocoa Mit 'dp-cocoa' gibt es bei OpenDarwin ein eigenes Projekt, welches sich mit der Programmierung einer grafischen Benutzungoberfläche für DarwinPorts beschäftigt. Noch ist dp-cocoa sehr rudimentär, die Entwicklung verläuft zur Zeit aber sehr schnell. 7) Fink Neben DarwinPorts gibt es noch zwei weitere Projekte die sich mit dem portieren von Unix-Software auf Mac OS X / Darwin beschaeftigen, Fink und GNU-Darwin. Fink benutzt das von Debian bekannte dpkg-Packagement Tool, mit den dazugehörigen Infrastrukturprogrammen 'apt-get' und 'dselect'. Anders als DarwinPorts besteht Fink nicht aus einer Sammlung von Metadaten die das Installieren von Software automatisiert, sondern stellt Binärpakete für OS X zur Verfügung. 7) Weiterführende Informationen zu DarwinPorts Es gibt zwei Mailing-Listen die sich mit DarwinPorts beschäftigen. darwinports@opendarwin.org ist die Liste für Diskussionen rund um DarwinPorts. Verbesserungsideen, Patches und neue Ports werden an diese Liste geschickt. Zusätzlich gibt es cvs-darwinports-all@opendarwin.org, eine Liste an die die CVS-Commits geschickt werden. Informationen zu den Mailinglisten finden sich auch unter: http://www.opendarwin.org/mailman/listinfo/darwinports http://www.opendarwin.org/mailman/listinfo/cvs-darwinports Ein Treffpunkt der Opendarwin-Entwickler ist der IRC-Channel #opendarwin im Openprojects-IRC-Netzwerk. IRC-Server: irc.openprojects.net Links: OpenDarwin: http://www.opendarwin.org/ DarwinPorts: http://www.opendarwin.org/projects/darwinports dp-cocoa: http://www.opendarwin.org/cgi-bin/cvsweb.cgi/proj/dp-cocoa/ Fink: http://fink.sourceforge.net/ GNU-Darwin: http://www.gnu-darwin.org/