Poul-Henning Kamp Beigesteuert von Vorgaben und Richtlinien für das Quelltextverzeichnis Dieses Kapitel dokumentiert verschiedene Vorgaben und Richtlinien für das FreeBSD-Quelltextverzeichnis. <makevar>MAINTAINER</makevar> eines Makefiles Ports Maintainer Wenn ein bestimmter Bereich der FreeBSD-Distribution von einer Person oder Gruppe gepflegt wird, kann dies durch Hinzufügen der Zeile MAINTAINER= email-addresses im Makefile der Öffentlichkeit mitgeteilt werden. Dies bedeutet folgendes: Der Maintainer ist verantwortlich für diesen Code. Dies bedeutet, dass er einerseits für die Behebung von Fehlern und das Beantworten von Problemberichten für diesen Code die Verantwortung trägt, andererseits, falls es sich um beigesteuerte Software handelt, er neue Versionen verfolgt und diese bereitstellt. Änderungen an Verzeichnissen, welcher ein Maintainer definiert hat, sollten an den Maintainer für eine Überprüfung gesendet werden, bevor diese committed werden. Nur wenn der Maintainer in einer inakzeptablen Zeitspanne auf mehrere E-Mails nicht antwortet, können die Änderungen durch den Commit, auch ohne Überprüfung des Maintainers, vollzogen werden. Dennoch wird vorgeschlagen, dass die Änderungen, falls möglich, durch jemand anderen überprüft werden. Es ist natürlich nicht akzeptabel einer Person oder Gruppe den Status eines Maintainers zu geben, so lange dieser Pflicht nicht zugestimmt wurde. Andererseits muss es kein Committer und auch eine eine Gruppe von Menschen ist selbstverständlich legitim. Poul-Henning Kamp Beigesteuert von David O'Brien Beigesteuerte Software Beigesteuerte Software Einige Teile der FreeBSD-Distribution enthalten Software, welche aktiv ausserhalb des FreeBSD-Projektes gepflegt wird. Aus historischen Gründen nennen wir dies contributed Software. Beispiele dazu sind sendmail, gcc und patch. Über die Jahre wurden verschiedenen Methoden genutzt, um diese Art der Software zu handhaben, und alle haben Vorteile wie auch Nachteile. So gibt es keinen klaren Gewinner. Es wurde viel über diesen Umstand debattiert und so wurde eine Methode als die offizielle Methode gewählt, um in Zukunft diese Art der Software zu importieren. Ferner wird es dringend vorgeschlagen, dass existierende, beigesteuerte Software sich diesem Modell nähert, da es signifikante Vorteile gegenüber der alten Methode gibt. Beispielsweise die Leistungsfähigkeit einfach Diffs von der offiziellen Version zu beziehen und das für jedermann (auch ohne CVS-Zugang). Dies wird es deutlich einfacher machen Änderungen an die Hauptentwickler zurüfliessen zu lassen. Letztendlich kommt es auf die Menschen an, welche die Arbeit leisten. Wenn die Nutzung dieses Modells teilweise nicht möglich ist, so k¨nnen Ausnahmen von diesen Regeln gewährt werden, diese müssen aber durch das Core Team und mit Übereinstimmung der anderen Developer genehmigt werden. Die Fähigkeit dieses Paket auch in Zukunft pflegen zu können ist eine der Schlüsselfragen bei dieser Entscheidung. Durch einige bedauernswerte Einschränkungen beim Design des RCS-Dateiformates und wie CVS Vendor Branches nutzt, sind kleine und/oder kosmetische Änderungen sehr entmutigend bei Dateien, welche den Herstellerzweig verfolgen. Sprechende Fehlerbehebungen sind explizit unter der kosmetischen-Kategorie vorhanden und sollten bei Dateien mit einer 1.1.x.x-Revision verhindert werden. Das Repository kann sich durch Änderungen an einzelnen Zeichen dramatisch aufblähen. Die eingebettete Tcl-Programmiersprache soll als Beispiel dienen, wie dieses Modell funktioniert: src/contrib/tcl enthält den Quelltext wie vom Maintainer dieses Paketes bereitgestellt. Teile, welche unter FreeBSD nicht nutzbar sind, können entfernt werden. Im Fall von Tcl wurden die Unterverzeichnisse mac, win und compat vor dem Import entfernt. src/lib/libtcl enthält nur ein Makefile im bmake-Stil, welches die Regeln des Standard-Makefile bsd.lib.mk nutzt, um die Bibliothek zu erstellen und die Dokumentation zu installieren. src/usr.bin/tclshenthält nur ein Makefile im bmake-Stil, welches das tclsh-Programm erstellt und installiert, ebenso die dazugehörigen Manualpages, welche die Regeln von bsd.prog.mk nutzen. src/tools/tools/tcl_bmake enthält einige Shellskripte, welche hilfreich sein können, wenn die tcl-Software aktualisiert werden soll. Diese sind nicht Teil des Erstellens und der Installation der Software. Das Entscheidende ist hier das src/contrib/tcl-Verzeichnis, welches durch die entsprechenden Regeln erstellt wird: Es wird unterstellt, dass der Quelltext im Original vorhanden ist (ohne RCS-Schlüsselworte und im korrekten CVS-Herstellerzweig) mit so wenig wie möglich FreeBSD-spezifischen Änderungen. Sollte es Zweifel geben, wie hier zu verfahren ist, ist es selbstverständlich zuerst nachzufragen und nicht auf gut Glück etwas zu probieren in der vagen Hoffnung, dass es irgendwie tut. CVS vergibt keine Fehler beim Importieren und ein hoher Arbeitsaufwand wäre die Folge, um diesen grossen Fehler wieder wettzumachen. Durch die Eingangs schon erwähnten Einschränkungen durch das Design beim CVS-Herstellerzweig, ist es erforderlich, dass offizielle Fehlerbehebungen vom Hersteller bei den Originalquellen der Distribution einfliessen und als Resultat wird dies in den Herstellerzweig reimportiert. Offizielle Fehlerbehebungen sollten nie direkt in FreeBSD eingepflegt und committed werden, da dies den Herstellerzweig zerstören würde und der Import von zukünftigen Versionen wäre um ein Vielfaches schwerer, da es zu Konflikten kommen würde. Da einige Pakete Dateien enthalten, die zur Kompatibilität mit anderen Architekturen und Umgebungen wie FreeBSD gedacht sind, ist es zulässig diese Teile zu löschen, wenn sie für FreeBSD nicht von Interesse sind, da dadurch Speicherplatz gespart wird. Dateien welche ein Copyright enthalten und eine Art von Release-Informationen zu den vorhandenen Dateien, sollten nicht gelöscht werden. Falls es einfacher erscheint können die bmake-Makefiles vom Verzeichnisbaum durch einige Dienstprogramme automatisch erstellt werden, was es hoffentlich sogar noch einfacher macht auf eine Version zu aktualisieren. Ist dies geschehen, so stellen Sie bitte sicher diese Werkzeuge in das Verzeichnis src/tools mit dem Port an sich einzuchecken, so dass es für zukünftige Maintainer vorhanden ist. Im Verzeichnis src/contrib/tcl sollte eine Datei mit dem Namen FREEBSD-upgrade hinzugefügt werden und sollten den Stand wie folgt anzeigen: Welche Dateien wurden ausgelassen. Von wo die Original-Distribution stammt und/oder wo die offizielle Masterseite zu finden ist. Wohin Fehlebereinigungen an den Originalautor gesendet werden können. Möglicherweise eine Übersicht welche FreeBSD-spezifischen Änderungen vorgenommen wurden. Importieren Sie jedoch FREEBSD-upgrade nicht mit den beigesteuerten Quelldateien. Stattdessen sollen Sie cvs add FREEBSD-upgrade ; cvs ci nach dem initialen Import nutzen. Ein Beispiel von src/contrib/cpio sehen Sie hier: This directory contains virgin sources of the original distribution files on a "vendor" branch. Do not, under any circumstances, attempt to upgrade the files in this directory via patches and a cvs commit. New versions or official-patch versions must be imported. Please remember to import with "-ko" to prevent CVS from corrupting any vendor RCS Ids. For the import of GNU cpio 2.4.2, the following files were removed: INSTALL cpio.info mkdir.c Makefile.in cpio.texi mkinstalldirs To upgrade to a newer version of cpio, when it is available: 1. Unpack the new version into an empty directory. [Do not make ANY changes to the files.] 2. Remove the files listed above and any others that don't apply to FreeBSD. 3. Use the command: cvs import -ko -m 'Virgin import of GNU cpio v<version>' \ src/contrib/cpio GNU cpio_<version> For example, to do the import of version 2.4.2, I typed: cvs import -ko -m 'Virgin import of GNU v2.4.2' \ src/contrib/cpio GNU cpio_2_4_2 4. Follow the instructions printed out in step 3 to resolve any conflicts between local FreeBSD changes and the newer version. Do not, under any circumstances, deviate from this procedure. To make local changes to cpio, simply patch and commit to the main branch (aka HEAD). Never make local changes on the GNU branch. All local changes should be submitted to "cpio@gnu.ai.mit.edu" for inclusion in the next vendor release. obrien@FreeBSD.org - 30 March 1997 Belastende Dateien Es dürfte bisweilen notwendig sein belastende Dateien in den FreeBSD-Quelltextbaum zu integrieren. Zum Beispiel braucht ein Gerät ein Stück binären Code, welcher zuerst geladen werden muss, damit das Gerät funktioniert, und wir haben keine Quellen zu diesem Code, dann wird die binäre Datei als belastend bezeichnet. Die folgenden Richtlinien sind beim Aufnehmen von belastenden Dateien in den FreeBSD-Quelltext zu beachten. Jede Datei, die durch die System-CPU(s) ausgeführt wird und nicht im Quellformat vorliegt, ist belastend. Jede Datei, deren Lizenz restriktiver ist als die BSD- oder GNU-Lizenz, ist belastend. Eine Datei, welche herunterladbare binär Daten enthält, ist nicht belastend, ausser wenn (1) oder (2) hierfür gelten. Es muss in einem ASCII-Format gespeichert werden welches Architekturneutral ist (file2c oder uuencoding wird empfohlen). Jede belastende Datei braucht eine spezielle Genehmigung vom Core Team, bevor diese in das CVS-Repository aufgenommen werden darf. Belastende Dateien liegen unter src/contrib oder src/sys/contrib. Das komplette Modul sollte zusammen aufbewahrt werden. Es gibt keinen Grund dieses zu teilen, ausser es gibt einen Code-Austausch mit Quelltext, der nicht belastend ist. Objekt-Dateien sind arch/filename.o.uu> . Kernel-Dateien: Sollten immer nach conf/files.* verweisen (um den Bau einfach zu halten). Sollten immer in LINT sein, aber das Core team entscheidet je nach Fall, ob es auskommentiert wird oder nicht. Das Core Team kann sich zu einem späteren Zeitpunkt immer noch anders entscheiden. Der Release Engineer entscheidet, ob es in ein Release aufgenommen wird, oder nicht. Userland-Dateien: Core Team Das Core Team entscheidet, ob der Code Teil von make world wird oder nicht. Release Engineer Der Release Engineer entscheidet, ob es in das Release aufgenommen wird, oder nicht. Satoshi Asami Beigesteuert von Peter Wemm David O'Brien Shared-Libraries Sollten Sie den Support für Shared-Libraries bei einem Port oder einem Stück Software, welches dies nicht hat, hinzufügen, die Versionsnummer sollten diesen Regeln folgen. Im Allgemeinen hat die sich daraus resultierende Nummer nichts mit der Release-Version der Software zu tun. Die drei Grundsätze von Shared-Libraries sind: Starten Sie von 1.0. Gibt es eine Änderung die rückwärtskompatibel ist, so springen Sie zur nächsten Minor-Nummer (beachten Sie dass ELF-Systeme die Minor-Nummer ignorieren). Gibt es eine imkompatible Änderung, so springen Sie bitte zur nächsten Major-Nummer. Zum Beispiel hinzufügen von Funktionen und Fehlerbehebungen so wird zur nächsten Minor-Nummer gesprungen, beim Löschen einer Funktion, dem Ändern von Funktionsaufrufen usw., wird sich die Major-Nummer ändern. Bleiben Sie bei Versionsnummern in der Form major.minor (x.y). Unser dynamischer Linker a.out kann mit Versionsnummern in der Form x.y.z nicht gut umgehen. Jede Versionsnummer nach dem y (die dritte Zahl) wird völlig ignoriert, wenn Versionsnummern der Shared-Libraries verglichen werden, um zu sehen, welche Bibliothek hiermit verlinkt. Sind zwei Shared-Libraries vorhanden, die sich nur in der micro-Revision unterscheiden, so wird ld.so zu der höheren verlinken. Dies bedeutet: Wenn Sie mit libfoo.so.3.3.3 verlinken, dass der Linker nur 3.3 in den Header aufnimmt und linked alles, was mit libfoo.so.3 .(alles >=3).(höchste verfügbare Nummer). ld.so wird immer die höchste minor-Revision nutzen. Beispielsweise wird es die libc.so.2.2 bevorzugen statt der libc.so.2.0, auch dann, wenn das Programm ursprünglich mit libc.so.2.0 verlinkt war. Unser dynamischer ELF-Linker kann kejne Minor-Versionen handhaben. Dennoch sollten die Major- und Minor-Nummern genutzt werden, da unsere Makefiles damit umgehen können basierend auf dem entsprechenden System. Für non-port-Bibliotheken ist es auch unsere Richtlinie, die Shared-Library-Versionsnummer nur einem zwischen den Releases zu ändern. Es ist unsere Richtlinie die Major Nummer der Shared-Libraries nur bei Major OS-Releases zu ändern (beispielsweise von 3.0 auf 4.0). Wenn Sie also eine Änderunge an einer Systembibliothek vornehmen, welche eine neue Versionsnummer benötigt, überprüfen Sie die Commit-Logs des Makefiles. Es liegt in der Verantwortung des Committers, dass eine solche Änderungen seit dem letzten Release im Makefile der Shared-Library erscheint.