Linux-Magazin-Logo Die Zeitschrift für Linux-Professionals

Software entwickeln unter Linux

Tricks mit C

Michael Schilli

Wenn Entwickler die volle Übersicht über ihre Software behalten wollen, speichern sie die Versionen der Quelldateien in ihren Binaries. CVS übernimmt diese Aufgabe automatisch - weitgehend.

Inhalt

96 | Verteilt kompilieren
Wer oft Software kompiliert, verbringt viel Zeit mit Warten. Verteilte Compiler schaffen Abhilfe, indem sie Jobs auf andere Rechner auslagern.

102 | Feder-Lesen
Von Java aus Tcl-Code benutzen und von Tcl aus auf Java-Objekte zugreifen. Das Tcl/Java-Projekt entwickelt die passenden Erweiterungen.

108 | Perl-Snapshot
Mit Glade klicken Programmierer ihre GTK-GUIs einfach zusammen. Ein Netzwerkschnüffler mit grafischer Oberfläche ist damit schnell programmiert.

112 | Coffee-Shop
PDF-Dokumente in Java erstellen muss nicht umständlich sein: Die Bibliothek I-Text bietet die nötigen Routinen, inklusive Hyperlinks und Verschlüsselung.

Bei komplexer Software ist es gar nicht so einfach herauszufinden, welche Version gerade installiert ist. Zwar zeigen viele Programme mit der Option »-v« ihre Versionsnummer an, doch bei den CVS-Versionen hilft das nicht. Denn Binaries sind oft aus hunderten oder tausenden Source-Dateien zusammengebastelt. Die CVS-Version dieser Dateien in Erfahrung zu bringen ist vor allem für Entwickler wichtig.

Hier hilft ein einfacher Trick: Im Programmcode am Kopf jeder Datei platziert der Programmierer den String:

static char *RCSID = "@(#) $Header$";

Checkt ein Entwickler nun die 42ste Version mit RCS oder CVS in das Repository ein, expandiert »$Header$« zu etwas wie »$Header: /pfad/myfile.c,v 1.42 2004/09/11 18:50:51 mschilli Exp $« und der Compiler nimmt diesen Wert von jeder Quelldatei in das BSS-Segment des ausführbaren Programms auf.

Aus einem Binary lässt sich dieses Lesezeichen dann mit dem »strings«-Kommando extrahieren:

strings myprogram | grep '@(#)'

Da die Zeichenfolge »@(#)« sonst wohl kaum in den von »strings« aufgestöberten druckbaren Zeichensequenzen vorkommt, lässt sich genau feststellen, aus welchen Quelldatei-Versionen das Programm besteht, wer die einzelnen Komponenten eingecheckt hat und wann das geschehen ist. Wer will, hält sogar das Datum und den Zeitpunkt der Kompilierung im endgültigen Binary fest:

static char *RCSID = "@(#) $Header$ " __DATE__ " " __TIME__;

»__DATE__« und »__TIME__« sind Makros, die der Präprozessor durch Datum und Uhrzeit ersetzt, bevor der Compiler die aneinander gereihten Strings zu einem einzigen verbindet. »gcc -E myfile.c« oder »cpp myfile.c« zeigen den Zwischenschritt an. (mwe/fjl)

Programmierer-Software