ар пьвз жч р ×
Transcription
ар пьвз жч р ×
FREIBURG ALBERT-LUDWIGS-UNIVERSITAT INSTITUT FUR INFORMATIK Lehrstuhl fur Mustererkennung und Bildverarbeitung Prof. Dr.-Ing. Hans Burkhardt Georges-Kohler-Allee Geb.052, Zi 01-029 D-79110 Freiburg Tel. 0761 - 203 - 8260 Kurzdokumentationen der Tools zum Softwarepraktikum SS 2001 30. April 2001 Inhaltsverzeihnis 1 Einleitung 3 2 3 g++ - GNU C++ Compiler 2.1 Kurzbeshreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Wihtigste Anwendungsvarianten . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.1 Programme, die nur die Standard-Bibliothek verwenden . . . . . . . 4 2.2.2 Einbinden von zusatzlihen Bibliotheken . . . . . . . . . . . . . . . 4 2.2.3 Erzeugen von eigenen Bibliotheken . . . . . . . . . . . . . . . . . . 5 2.2.4 Weitere Optionen fur den g++ . . . . . . . . . . . . . . . . . . . . . 6 2.2.5 Sonstige Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3 GNU make 7 3.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.2 Ein einfahes Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.3 Makefiles fur Fortgeshrittene . . . . . . . . . . . . . . . . . . . . . . . . 9 3.4 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1 4 Emas 11 4.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.2 Erste Shritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.3 Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.4 Konguration von Emas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.5 Nutzlihes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 5 GDB 13 5.1 Kurzbeshreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.2 Wihtigste Anwendungsvarianten . . . . . . . . . . . . . . . . . . . . . . . 13 5.2.1 Starten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.2.2 Kontrolle des Programmablaufs . . . . . . . . . . . . . . . . . . . . 14 5.2.3 Speiherkontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 5.2.4 Untersuhung von Programmabsturzen . . . . . . . . . . . . . . . . 15 5.3 GDB unter Emas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5.4 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 6 CVS 16 6.1 Was ist CVS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 6.2 Arbeiten mit CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.2.1 Vorbereitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.2.2 Arbeiten mit einem CVS-Repository . . . . . . . . . . . . . . . . . 18 6.2.3 CVS und Emas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2.4 CVS Home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.3 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 7 Doxygen 25 7.1 Kurzbeshreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 7.2 Wihtigste Anwendungsvarianten . . . . . . . . . . . . . . . . . . . . . . . 25 7.2.1 Setup und einfaher Aufruf . . . . . . . . . . . . . . . . . . . . . . . 25 7.2.2 Kommentieren der Souren . . . . . . . . . . . . . . . . . . . . . . . 26 7.2.3 Weitere Funktionalitat . . . . . . . . . . . . . . . . . . . . . . . . . 28 7.3 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2 1 Einleitung Wihtiges Lernziel des Softwarepraktikums ist Vertrautheit mit einigen Arten von Tools, die bei der Softwareentwiklung zum Einsatz kommen. In dieser Sammlung sollen einige Vertreter der wihtigsten dieser Werkzeuge kurz vorgestellt und die wesentlihen Anwendungsmoglihkeiten dargestellt werden. Referenzen auf ausfuhrlihere Anleitungen sind am Shlu der jeweiligen Abshnitte angegeben. 2 g++ - GNU C++ Compiler 2.1 Kurzbeshreibung Der g++ wird benotigt, um aus den C++ Quelldateien ausfuhrbare Programme zu erzeugen, oder um eigene Bibliotheken zu erstellen. Intern lauft die Compilierung eines Programms in vier Shritten ab, wovon man als Benutzer aber ubliherweise maximal zwei zu Gesiht bekommt. Diese Shritte sind: 1. "preproessing\ Im ersten Shritt werden die Praprozessor-Befehle1 interpretiert. Auerdem entfernt der Praprozessor Kommentare aus dem Soureode. Das Ergebnis ist ein vorverarbeiteter C++-Soure-Code. 2. "ompilation\ Die eigentlihe Ubersetzung des vorverarbeiteten C++-Soure-Codes in Assembler. Das Ergebnis ein Assembler-Soure-File, in dem die AssemblerBefehle im Klartext notiert sind. 3. "assembly\ Ubersetzung des Assembler-Soure-Files in Mashinen-Code. Das Ergebnis ist ein Objet-File, in dem sowohl der Mashinenode, als auh ein SymbolTable, also eine Tabelle, die im wesentlihen die Namen der enthaltenen Funktionen und ihrer Startadressen im Mashinenode enthalt. 2 4. "linking\ Zusammenhangen von mehreren Objet-Files, Anhangen eines Run" time\-Kopfes und der Standard-Bibliotheken, so da ein ausfuhrbares Programm entsteht. 1 Die bekanntesten Praprozessor-Befehle sind #inlude (um andere Dateien, ubliherweise HeaderDateien, an dieser Stelle einzufugen), #define (zum Denieren von Makros), sowie #if, #ifdef, #ifndef, #else und #endif (f ur die bedingte Compilierung, z.B. Debugging-Code ein und auszushalten, oder um den Soure-Code auf mehreren Arhitekturen ompilierbar zu mahen.) 2 Wihtig: Da bei C++ (im Gegensatz zu reinem C) mehrere Funktionen mit dem gleihen Namen, aber vershiedenen Parametern erlaubt sind, untershieden sih diese Symbol-Namen, je nahdem, ob das Programm mit einem C oder C++ Compiler ubersetzt wurde. Um eine mit einem reinen C-Compiler ubersetzte Funktion (z.B. aus einer C-Bibliothek) von C++ aus aufzurufen, ist es daher notig, den Funktionsprototyp innerhalb eines extern "C" f ... g Blok zu denieren. Bei den Standard-Bibliotheken ist dieser Blok immer shon im Header-File vorhanden. 3 2.2 Wihtigste Anwendungsvarianten 2.2.1 Programme, die nur die Standard-Bibliothek verwenden Zum Ubersetzen eines C++ Programms, da nur aus einem Soure-File besteht und das nur die Standard-Bibliotheken benutzt, reiht ein einfahes g++ example. -o example Dabei werden alle vier oben beshriebenen Shritte ausgefuhrt und es ensteht das ausfuhrbare Programm example\. Ist der Soureode uber mehrere Files verteilt (was auh shon bei " kleineren Projekten unbedingt anzuraten ist) kann man diese mit g++ example. lasses1. lasses2. -o example ubersetzen. Das wird ziemlih shnell sehr zeitaufwendig, da bei jeder kleinen Anderung alle drei Soure-Codes neu ubersetzt werden mussen. Es ist besser, das Ubersetzen und das Zusammenlinken zwei Shritten auszufuhren. Um den g++ anzuweisen, nur die ersten drei Shritte der Compilierung auszufuhren, mu man die Option -\ ubergeben: " g++ g++ g++ g++ - example. -o example.o - lasses1. -o lasses1.o - lasses2. -o lasses2.o example.o lasses1.o lasses2.o -o example Wenn nun z.B. eine Anderung in lasses1. vorgenommen wurde, so brauht nur der 2. und der 4. Befehl wiederholt zu werden. Die Entsheidung, welhe Teile neukompiliert werden mussen, kann einfah anhand des jeweiligen Dateidatums gefallt werden. Ein Programm, das einem diese Arbeit abnimmt gibt es naturlih auh (siehe make\ in " Kapitel 3). Wihtig: Ein Soure-Code mu naturlih auh dann neu kompiliert werden, wenn sih ein Header-File, da mit #inlude eingefugt wird, andert. 2.2.2 Einbinden von zusatzlihen Bibliotheken Bei fast allen Programmen wird man auf weitere Bibliotheken (auer den StandardBibliotheken) zugreifen wollen. Dafur mu sowohl dem Praprozessor gesagt werden wo er die Header-Files dazu ndet (wenn diese niht an der Unix-Standard-Position /usr/inlude zu nden sind) und dem Linker mu man die Namen der Bibliotheken ubergeben und evtl. auh das Verzeihnis, wenn diese Bibliothek niht in /lib oder /usr/lib liegt. Beispiel 1: Nutzung der ti-Bibliothek, die an der Standard-Position installiert ist: g++ g++ g++ g++ - example. -o example.o - lasses1. -o lasses1.o - lasses2. -o lasses2.o example.o lasses1.o lasses2.o -o example -ltiff 4 Beispiel 2: Nutzung der FFTW-Bibliothek3 , die man im eigenen Home-Verzeihnis installiert hat (in /home/ronneber/inlude/tw.h und /home/ronneber/lib/libtw.a): g++ g++ g++ g++ - -I/home/ronneber/inlude/ example. -o example.o - -I/home/ronneber/inlude/ lasses1. -o lasses1.o - -I/home/ronneber/inlude/ lasses2. -o lasses2.o -L/home/ronneber/lib example.o lasses1.o lasses2.o -o example -lfftw Wenn man mehrere Bibliotheken einbindet, mu man unbedingt auf die rihtige Reihenfolge ahten. Jede Bibliothek kann nur die Funktionen der weiter hinten denierten nutzen. Beispiel: Die tw threads\ - Bibliothek benotigt Funktionen aus der pthread\ " " Bibliothek. Dann mu man beim Linken -lfftw_threads -lpthreads angeben. Niht andersherum, dann ndet der Linker die Funktionen niht. Das dem so ist, ist ubrigens Absiht. Andernfalls ware es niht moglih nur einige Funktionen aus einer Bibliothek mit einer eigenen Bibliothek zu ubershreiben. 2.2.3 Erzeugen von eigenen Bibliotheken Spatestens im Rahmen des Softwarepraktikums wird man mehrere Programme entwikeln, die alle auf dieselben Funktionen zugreifen. Diese sollte man rehtzeitig in eigene Biblio theken legen, sonst konnen auh kleinste Anderungen shnell zur Tortur werden. Zum Erstellen einer Bibliothek benotigt man zusatzlih das Programm ar\ (arhive) und auf " manhen Arhitekturen ranlib\. Beispiel: Erstellen der Bibliothek hurz\ mit allen " " Funktionen aus lasses1. und lasses2.: g++ - lasses1. -o lasses1.o g++ - lasses2. -o lasses2.o ar -rv libhurz.a lasses1.o lasses2.o ranlib libhurz.a Das Programm ar\ hangt einfah die angegebenen Objet-Files zusammen und erstellt " einen Index, mit dem die Original-Files wieder hergestellt werden konnten. ranlib\ " extrahiert die Symbol-Tables der einzelnen Objet-Files und fat sie in einem groen Symbol-Table zusammen. Dies beshleunigt nahher das Linken, ist aber niht unbedingt notwendig. Zum Einbinden dieser eigenen Bibliothek gilt dasselbe wie im vorigen Kapitel, um also unser example-Programm nun zu erstellen, shreiben wir nur noh g++ -I/home/ronneber/hurz/inlude - example. -o example.o g++ -L/home/ronneber/hurz/lib example.o -o example -lhurz 3 Sie enthalt die Fastest Fourier Transform in the West\ (http://www.fftw.org) " 5 2.2.4 Weitere Optionen fur den g++ Weitere nutzlihe Kommandozeilen-Optionen fur den g++ sind -Wall zeigt alle Warnungen an. Diese Compiler Warnungen deuten auf moglihe -O2 optimiert das erzeugte Programm auf Geshwindigkeit. Dadurh wird es ubliherweise -g shreibt die Informationen, die der Debugger benotigt in die Objet-Files. Das -v (verbose) shreibt wahrend des Compilierens alle Zwishenshritte und die Ver- Programmierfehler hin, die aber niht einen Abbruh der Compilierung erzwingen. Pradikat: sehr sinnvoll! etwas groer und das Compilieren dauert langer, aber gerade bei einfahen Shleifen (wie sie ja in der Bildverarbeitung dauernd vorkommen) bringt diese Optimierung einen enormen Geshwindigkeitsgewinn. Auerdem kann der Compiler beim Optimieren noh weitere Fehler nden, die dann als Warnungen ausgegeben werden, wie z.B. variable xy might be used uninitialized\. Allerdings mu man sih beim " Debuggen von optimierten Programmen auf einige Uberrashungen gefat mahen, da der g auh z.B. die Reihenfolge der Befehle umtaushen kann. sind vor allem eine Tabelle, die fur jede Soureode-Zeile die Speiherposition des erzeugten Mashinen-Codes enthalt, aber auh die Speiherposition und Namen von Variablen, et. zeihnisse, in denen gesuht wird, heraus. Sehr sinnvoll, wenn man wissen will, woher die Bibliotheken nun eigentlih kamen... 2.2.5 Sonstige Utilities Im Zusammenhang mit dem g++ sollte auh noh kurz das Programm strip\ erwahnt " werden. Beispiel: mit strip example konnen nahtraglih alle uberussigen Symbol-Tables und Debugging-Informationen von einem Programm entfernt werden, wodurh es ubliherweise wesentlih kleiner wird. Man mu also niht neu kompilieren, nur um ein Programm ohne Debugging-Informationen zu haben. 2.3 Referenzen http://gnu.g.org (Homepage des g) man g (Manual-Seite, gute tabellarishe Auistung der Optionen) info g (info-Seite, f ur die, die es ganz genau wissen wollen) 6 3 GNU make Um den Quellode eines Programms in einen ausfuhrbaren Zustand | ausfuhrbare Binardatei | zu uberfuhren sind vershiedenste Shritte notwendig. Zunahst einmal mussen alle Quelldateien des Programms vom Compiler in einen Objektode uberfuhrt werden. Einige Objektdateien werden vielleiht zu Bibliotheken zusammengefuhrt. Shluendlih mussen alle Objektdateien und Bibliotheken zu einer Binardatei zusammengebunden (gelinkt) werden. Diese Arbeitsshritte sind je nah Umfang des Softwarepaketes reht komplex und zeitaufwendig. Siherlih lieen sih die Befehle statish in ein Skript odieren. Doh wurde der Zeitaufwand immer noh immens sein, wenn immer alle Quelldateien neu ubersetzt werden muten. Auh, wenn sih nur eine Quelldatei geandert hat. Sinnvoller und auh Ressouren sparender ware ein Werkzeug, das erkennt, welhe Quelldateien neu ompiliert, oder welhe Bibliotheken neu gebildet werden mussen. Genau dafur wurde das Werkzeug make4 entwikelt. Mit dem Programm make ist es moglih, Abhangigkeiten zwishen beliebigen Dateien (z.B. Quelldateien und Objektdateien) zu denieren und Abbildungsvorshriften anzugeben, die einen Dateityp in einen anderen uberfuhren (z.B. *. in *.o). In diesem Kapitel wird eine kurze Einfuhrung zu make gegeben. Es ist nur eine kurze Einfuhrung, da das make-Werkzeug von so groer Komplexitat ist, da eine ausfuhrlihe Beshreibung den Rahmen dieser Anleitung sprengen wurde. 3.1 Grundlagen Im allgemeinen erwartet make eine Datei mit dem Namen Makefile, die im aktuellen Arbeitsverzeihnis steht. In der Datei Makefile ist deniert, was make mahen soll. Beim Aufruf vom make liest das Programm das Makefile ein und interpretiert es. Soll make eine Datei mit einem anderen Name als Makefile nehmen, so lat sih make mit dem Parameter -f NameOfMakefile aufrufen. Damit make wei, was es mahen soll, sind in der Makefile-Datei Regeln deniert. Alle Regeln in einem Makefile mussen folgender Syntax genugen: Ziel ... : Abh angigkeiten ... <TAB>Befehl <TAB>... Demnah ist ein Ziel abhangig von seinen Abhangigkeiten. Wie das Ziel gebildet wird, steht in den Befehlszeilen darunter. Eine Regel kann auh nur aus Ziel und Abhangigkeiten bestehen. Ferner kann ein Ziel auh ohne Abhangigkeiten deniert sein, das nur Befehlszeilen beinhaltet. 4 Diese Beshreibung von make basiert auf GNU make und lehnt sih an die Dokumentation von GNU make an. Ahtung: Jedes Betriebssystem (z.B. Solaris, Irix, AIX) hat sein eigenes make, was selten vollkommen kompatibel zu GNU make ist. Um Arger bei Portierungen von Software aus dem Weg zu gehen, sollte GNU make verwendet werden, da GNU make fur alle gangigen Plattformen verfugbar ist. 7 Das Tabulatorzeihen zu Beginn jeder Befehlszeile ist obligatorish. Fehlt das Zeihen, wird sih make bitterlih beshweren und die Ausfuhrung des Makefiles abbrehen. Das Kommentarzeihen fur ein Makefile ist das #-Zeihen. Soll make nur ein Ziel erzeugen, mu make das Ziel in der Kommandozeile als Parameter mitgegeben werden. Ansonsten wird make versuhen, alle Regel zu befolgen. make untersheidet zwishen impliziten und expliziten Regeln. Implizite Regel sind Regeln, die make shon kennt und niht deniert werden mussen. Zum Beispiel kann make eine C-Quelldatei *. in eine Objektdatei *.o durh Compilation uberfuhren. Explizite Regeln sind in dem Makefile deniert. 3.2 Ein einfahes Makefile Fur mehr Klarheit soll das folgende Beispiel sorgen. Ein Programm myprg soll aus drei Quelldateien first., seond. und myprg. gebildet werden. Das dazugehorige Makefile sieht wie folgt aus: myprg : myprg.o first.o seond.o g++ myprg.o first.o seond.o -o myprg myprg.o : myprg. first.hh seond.hh basis.hh g++ - myprg. first.o : first. first.hh g++ - first. seond.o : seond. seond.hh g++ - seond. lean : rm -f myprg myprg.o first.o seond.o rebuild : lean myprg Nun soll make das Programm myprg erzeugen. Dafur wird make ohne Parameter aufgerufen. Das make-Programm liest das Makefile ein und interpretiert es. In Abhangigkeit existierender Dateien fuhrt es die Regeln aus. Zu Beginn gehen wir von der Existenz aller Quelldateien (*. und *.hh) aus. Die Objektdateien (*.o) und die Programmdatei myprg sollen noh niht erzeugt worden sein. In der ersten Regel des Makefiles ist deniert, wovon die Binardatei myprg abhangt und wie das Programm gebildet wird. Demnah mussen fur das Linken des Programms zunahst alle Objektdateien myprg.o, seond.o und first.o generiert werden. Um das zu erfullen suht make jetzt nah Regeln fur die Erzeugung der Objektdateien. In der zweiten bis vierten Regel ist deniert, wie make die Objektdateien, die fur das Ziel myprg notwendig sind, erzeugen kann. Zum Beispiel ist die Objektdatei myprg.o auf die 8 Quelldatei myprg. und den Headern first.hh, seond.hh und basis.hh angewiesen. An dieser Stelle kann make die erste Regel erfullen, da die Abhangigkeiten als Dateien existieren, und niht erst gebildet werden mussen. D.h. make fuhrt den Befehl g - myprg. -o myprg.o aus und erzeugt so die Objektdatei myprg.o. Sukzessive werden so alle Objektdateien naheinander | in der Reihenfolge wie es in der ersten Regel deniert ist | erzeugt. make wird nun die Befehlszeile der ersten Regel ausf uhren, da die Abhangigkeiten erfullt wurden. Mit der Befehlszeile werden alle Objektdateien zum Hauptprogramm myprg.o gelinkt und das ausfuhrbare Programm myprg ist erzeugt. Die vorletzte Regeln mit dem Ziel lean dient dem Aufraumen. Mohte man das Programm von Grund auf neu generieren, sorgt die Regel lean fur das Loshen aller Objektdateien und der Programmdatei. Der Aufruf der Regel erfolgt mit make lean. Um das Neuerzeugen noh weiter zu vereinfahen gibt es noh die Regel mit dem Ziel rebuild. Wird make mit dem Ziel rebuild aufgerufen, wird zunahst lean und dann myprg ausgefuhrt. Wir nun zum Beispiel die Quelldatei seond. geandert und anshlieend der makeBefehl aufgerufen, so passiert folgendes: make liest wiederum das Makefile ein und shaut, ob alle Ziele erfullt wurden. Bei der Regel mit dem Ziel seond.o bemerkt das make-Programm, da die Quelldatei seond. ein aktuelleres Datum als die Objektdatei seond.o hat. Ergo kann die Objektdatei niht von der aktuellen Version der Quelldatei stammen. Somit fuhrt make die zugehorige Befehlszeile aus und ompiliert seond. neu. Bis auf die erste Regel sind nun alle anderen Regeln erfullt. Am Shlu bindet make alle Objektdateien zu einer neuen Version von myprg zusammen und terminiert. Es wurde nur die Arbeit vollzogen, die notwendig war. 3.3 Makefiles fur Fortgeshrittene Das zuvor diskutierte Beispiel fur ein Makefile ist naturlih noh etwas unbeholfen. Und zwar deshalb, weil die Regeln fur das Erzeugen der Objektdateien explizit fur alle Dateien hingeshrieben wurde. Ferner wurden keinerlei Variablen verwendet. Soll z.B. der Compiler g ersetzt werden, oder ein zusatzliher Parameter zum Aufruf zugefugt werden, mussen alle betreenden Zeilen editiert werden. Generell lassen sih Variablen in einem Makefile mit VAR = WERT denieren. Verwendet werden Variablen in einem Makefile mit $(VAR). Im folgenden Beispiel werden Compiler (CXX), Compilerparameter (CXXFLAGS), Linker (CC) und Objektdateien (OBJS) in Variablen deniert und verwendet. Ferner werden die impliziten Regeln von make fur C++ Quellen (*.o:*.) verwendet: 9 OBJS = myprg.o first.o seond.o CXX = g++ CC = $(CXX) CXXFLAGS = -Wall all : myprg myprg : $(OBJS) myprg.o first.o : first.hh myprg.o seond.o : seond.hh myprg.o : basis.hh lean : rm -f myprg $(OBJS) rebuild : lean myprg Die Variablen CXX, CC und CXXFLAGS werden von den impliziten Regeln fur C++ Ubersetzung und Bindung verwendet. So teilt CXXFLAGS mit dem Flag -Wall dem Compiler mit, da wirklih alle Warnungen ausgegeben werden sollen. Beim Aufruf von make wird, wie shon zuvor erklart, versuht alle Regeln zu erfullen. Wie make eine Objektdatei generiert ist in der impliziten Regel fur *.o:*. erklart. Um eine Quelldatei in eine Objektdatei abzubilden fuhrt make den Befehl: $(CXX) - $(CPPFLAGS) $(CXXFLAGS) aus. Die Abhangigkeiten der Objektdateien von den Headern steht nah wie vor in dem Makefile. Allerdings sind die Abhangigkeiten diesmal zusammengefat. Das Linken der Objektdateien wird uber die folgende implizite Regel realisiert: $(CC) $(LDFLAGS) Objektdateien $(LOADLIBES) Die Verwendung von Variablen und impliziten Regeln fuhrt somit zu wesentlih kompakteren Makefiles. Einen Katalog der impliziten Regeln ndet man in der Anleitung zum GNU make (siehe Abshnitt Referenzen). 3.4 Referenzen OÆzielle Homepage zu GNU make: http://www.gnu.org/software/make/make.html Manuals zu GNU make: http://www.gnu.org/manual/make/index.html Info-Seiten f ur GNU make: info make 10 4 Emas 4.1 Einleitung Emas ist ein sehr leistungsfahiger und selbstdokumentierender Editor der aus einem LispInterpreter mit Funktionen zur Textverarbeitung besteht. Emas ist dadurh sehr exibel an vershiedene Benutzeranforderungen anpabar und kann nahezu unbegrenzt, und ohne die Notwendigkeit einer Neukompilation, erweitert werden. Ein wihtiges Grundkonzept von Emas sind Buer\. Dies sind voneinander getrennte " Arbeitsbereihe, in denen vollig untershiedlihe Dinge vor sih gehen konnen. Ein Buffer kann z.B. C++-Quellenode beinhalten, aber auh eine Verzeihnisstruktur\, eine " Shell\, einen Debugger\ oder einen Compiler\. " " " Die Buer sollten niht mit den vershiedene Frames\ (Fenstern) verwehselt werden. In " den Frames werden ein oder mehrere Buer angezeigt, was aber niht bedeutet, da ein Buer der niht angezeigt wird, niht mehr existiert. Ein weiteres wihtiges Grundkonzept sind die Modi, die es erlauben das Verhalten von Emas an vershiedenen Buerinhalte anzupassen. Im C++-Mode ist z.B. eine automatishe Einrukung des Quellenodes mit Tab und die xfarblih Hervorhebung von Shlusselwortern moglih. 4.2 Erste Shritte Vor dem Aufrufen mu in der Shell der Befehl module add emas ausgefuhrt werden. Aufgerufen wird Emas dann mit: emas filename, wobei filename niht mit angegeben werden mu. Fur Neubenutzer bietet das Tutorial, welhes mit C-h t (bei gedrukter Control-Taste die h-Taste druken und dann die t-Taste alleine druken) aufgerufen wird, einen shnellen Einstieg. 4.3 Dokumentation Zusatzlih zur im Tutorial beshriebenen Online-Hilfe (uber die man sih mit C-h ? eine Ubersiht vershaen kann) konnen mit C-h i die Info-Files konsultiert werden. Das komplette Handbuh kann unter http://www.gnu.org/manual/emas-20.3/emas.html gefunden werden. Eine einseitige Zusammenfassung der wihtigsten Befehle (die RefereneCard) steht unter http://www.refards.om/ zur Verfugung. 4.4 Konguration von Emas Die Konguration von Emas geshieht durh Editieren der Datei .emas im Homeverzeihnis des Users, die beim Aufstarten von Emas eingelesen wird. Wenn zum Beispiel die Funktion dabbrev-expand, die praktish ist um z.B. lange Variablenname nah Eingabe von ein paar Zeihen automatish zu komplettieren, mit S-iso-lefttab 11 (gleihzeitiges Druken der Shift- und der Tabulatortaste) anstatt des auf der deutshen Tastatur weniger praktishen M-/ aufgerufen werden soll, kann dies durh Eintragen der folgenden Zeile in .emas erreiht werden: (global-set-key [S-iso-lefttab℄ 'dabbrev-expand) 4.5 Nutzlihes Unbegrenztes Undo Mit C- konnen alle Anderungen in einem Buer rukgangig gemaht werden. Inkrementale Suhe Die nah C-s nah und nah eingegebenen Buhstaben werden bei der Suhe beruksihtigt. Dadurh ist es moglih mit weniger Shreibaufwand Zeihenketten zu nden. Kompilieren Ein C++-File kann mit M-x ompile kompiliert werden. Falls Fehler auftreten kann durh druken von Return (oder mit der mittleren Maustaste) in der entsprehenden Zeile des Kompilationsbuers direkt an die Stelle des Fehlers im Quellode gesprungen werden. Debuggen GDB kann durh M-x gdb in Emas aufgestartet werden und erlaubt eine komfortablere Bedienung als ein Aufruf in einer Shell. Einfugen von Kommentaren Mit Hilfe des urzungen deabbrev-mode konnen Abk niert werden die nah der Eingabe in einem Buer automatish ersetzt werden. Somit ist es z.B. moglih das Gerust\ einer Funktionsbeshreibung einmalig zu " erzeugen um es dann mit Hilfe der Abkurzung innerhalb des Quellodes shnell einzufugen. Navigieren im Quellode Mit Hilfe des Programmes etags konnen fur vershieden File-Typen tags (Markierungen) erzeugt werden. Diese tags konnen dann von Emas gelesen werden und erlauben den shnellen Zugri auf den Inhalt der Files (im Falle von C++-Files kann man z.B. so gezielt und shnell auf Funktionen zugreifen). "Retangle-Mode\ Das Kopieren, Ausshneiden, Einfugen und Fullen von rehtekigen Regionen ist mit dem retangle-mode\ moglih. Die Region kann mit der Maus " ausgewahlt werden (wobei Anfang- und Endpunkt die linke obere bzw. die rehte untere Eke festlegen). Die wihtigsten Befehle sind: C-x r k: kill retangle C-x r y: yank retangle C-x r t: string retangle und konnen z.B. zum Auskommentieren verwendet werden. 12 5 GDB 5.1 Kurzbeshreibung Ein Debugger ist ein Programm, das andere Programme ausfuhren kann und dem Benutzer Moglihkeiten zur Kontrolle und Untersuhung des Programmablaufs bietet. Insbesondere beinhalten diese Moglihkeiten kontrollierte shrittweise Abarbeitung des Programms und Anzeigen momentaner Variablen, Speiherzustande et. Auh ist es moglih, aufgetretene Programmabsturze nahtraglih zu untersuhen, und den Fehler so zu lokalisieren. Einige fortgeshrittenere Debugger bieten bequeme graphishe Darstellung ganzer Datenstrukturen und deren Abhangigkeiten oder Performaneanalysen, um bei der Optimierung zu unterstutzen. Der GNU-Debugger GDB ist der popularste Debugger fur UNIX-Systeme. Es ist ein Kommandozeilendebugger, der jedoh bequem durh Emas oder andere grashe Benutzeroberahen wie DDD bedient werden kann. 5.2 Wihtigste Anwendungsvarianten 5.2.1 Starten Voraussetzung fur das Debuggen eines Programms ist, da das Kompilat entsprehende Informationen und Bezuge zu den Quelldateien enthalt. Dies mu beim Compilierenaufruf explizit angegeben werden durh das Flag -g. Folgender Aufruf erzeugt z.B. eine solhe Datei. g++ -g myfile. -o myfile Auf ein solhes Programm kann der GDB sofort angewandt werden. Gestartet wird er via gdb, notwendige Kommandos, um das Programm zu debuggen sind le myle Dieser Befehl ladt die Debugging-Informationen aus der angegebenen Datei, und legt myle als auszufuhrendes Programm fest. Dieser Befehl ist insbesondere nah Neuompilieren des Codes erforderlih! run ommandparams [< inputle℄ [> outputle ℄ Dieser Befehl startet das zuvor festgelegt Programm mit den Kommandozeilenparametern ommandparams und den angegebenen Dateien als Quellen fur stdin/stdout. Weitere allgemeine Kommandos sind z.B. help Zeigt Hilfethemen an, bzw. durh Angabe eines konkreten Befehls dessen spezishe Hilfekommentare. 13 shell mdstring Fuhrt den angegebenen String in der zugrundeliegenden Shell aus. quit Beendet den gdb. 5.2.2 Kontrolle des Programmablaufs Die bisherigen Befehle bieten niht mehr Funktionalitat als ein direkter Aufruf des Programms aus einer Shell heraus. Wesentlihe Elemente zur Steuerung des Programmablaufs sind nun die Befehle zum Anhalten der Ausfuhrung an denierten Stellen (Breakpoints) und zum shrittweisen Ausfuhren: break [le:℄funtion, break [le:℄line Setzt einen Haltepunkt beim Eintritt in die angegebene Funktion, bzw. an der angegebenen Zeile im Quellode. info break Listet alle bisher denierten Haltpunkte auf. delete [n℄ Loshen aller Haltepunkte oder des denierten Haltepunkts mit Nummer n. step, s Ausfuhren der aktuellen Zeile des Programmodes. Ist dies ein Aufruf einer Funktion, wird an den Anfang von deren Quellode gesprungen. next, n Ausfuhren der aktuellen Zeile des Programmodes. Ist dies ein Aufruf einer Funktion, wird die gesamte Funktion abgearbeitet, und niht in diese Funktion hineingesprungen. up, down Springt in der Funktionsaufruf-Hierarhie eine Stufe nah oben bzw. unten, ermogliht hiermit Untersuhung der Funktionsaufrufe und deren Parameter, die zu einer bestimmten Programmstelle gefuhrt haben. nish Fuhrt das Programm bis zum Ende der aktuellen Funktion aus. ont, Fuhrt das Programm normal aus, bis der nahste Haltepunkt erreiht wird, oder das Programm terminiert. 14 5.2.3 Speiherkontrolle Weitere wesentlihe Funktionalitat eines Debuggers umfat Zugrismoglihkeiten auf den Speiher, d.h. Speiher auslesen bzw. Speiherinhalte manipulieren: print expr, p expr Wertet den C-Ausdruk expr (normalerweise eine Variable) einmalig aus, und stellt das Ergebnis dar. display expr Wertet den C-Ausdruk expr aus, und stellt das Ergebnis bei jedem folgenden Programmstop dar. undisplay n Losht den anzuzeigenden Ausdruk mit Nummer n von der Liste der wiederholt anzuzeigenden Ausdruke. set var = expr Wertet den Ausdruk expr aus, und setzt dies als neuen Wert der Variablen var. 5.2.4 Untersuhung von Programmabsturzen Auer kontrolliertem Ausfuhren von Programmen ermogliht GDB auh die Untersuhung vorangehender Programmabsturze auf Basis eines beim Absturz erzeugten Coreles. Die Erzeugung solher Files mu in der Shell zunahst eingestellt werden. Mit Hilfe von ulimit -a werden die Speihergrenzen fur diverse Groen angezeigt. Unter oredump muss ein positiver Eintrag stehen, damit Coredumps erzeugt werden. Dies kann (in den meisten Shells) via ulimit - oresize eingestellt werden, wobei oresize die gewunshte Groe in Bytes darstellt. Hat ein Fehlerhaftes Programm anshlieend ein Corele erzeugt, kann die Absturzstelle mit GDB ermittelt werden, indem nah normalem Starten von GDB und Festlegen des zu inspizierenden (abgesturzten) Programms mit le, das Corele geladen wird. hierzu dient der Befehl ore orele Der Programmablauf bendet sih exakt am Absturzpunkt. Ein Abarbeiten des Programms ist selbstverstandlih niht weiter moglih, jedoh lassen sih die Variablen weiter abfragen. 15 5.3 GDB unter Emas Speziell unter Verwendung von Emas lat sih der GDB bequem bedienen. Mit M-x gdb wird ein Fenster geonet, in dem GDB-Kommandos ausgefuhrt werden konnen. Indem man im Hauptprogramm einen Haltepunkt setzt und das Programm startet, teilt sih das aktuelle Fenster, und der Quellode ersheint. Emas interpretiert die Informationen von gdb, indem es die aktuelle Position im Sourele markiert, und dies auh beim shrittweisen Abarbeiten des Programms immer aktualisiert. Spezielle Tastenkombinationen ermoglihen einfahere Eingabe von Befehlen. u.a. C- C- Briht Programmablauf ab, springt an die aktuelle Stelle im Programm C-x SPC und ermogliht anshlieend shrittweise Abarbeitung. Fugt einen Haltepunkt in der Zeile der aktuellen Cursorposition ein. M-p, M-n Die Liste der bisher eingegebenen GDB-Kommandos wird abgelaufen, ermogliht so einfahes Wiederholen von Befehlen. 5.4 Referenzen Die angegebenen Varianten der Befehle sind nur ein Bruhteil aller moglihen. Fur ausfuhrlihere Beshreibungen siehe folgende Referenzen: Online-Handbuh: http://soures.redhat.om/gdb/onlinedos/gdb_to.html Referenz-Karte: http://www.s.prineton.edu/~benjasik/gdb/gdb.ps 6 CVS 6.1 Was ist CVS? Das Conurrent Versions System (CVS) dient zur Versionsverwaltung kompletter und ggf. mehrstuger Datei-Verzeihnisse, wie sie ubliherweise in groeren Software- oder Kongurationsprojekten entstehen. CVS baut intern auf das sogenannte Revision Control System (RCS) auf und benutzt eine ahnlihe Begriswelt wie RCS. Im Gegensatz zu RCS sind jedoh keine expliziten Sperren auf Dateien moglih, so da auh mehrere Personen die gleihe Datei andern (oder gar loshen) konnen. Etwaige Konikte, die bei den meisten Projekten erfahrungsgema jedoh selten auftreten, werden spater aufgelost. Die Grundidee bei CVS ist, da es ein zentrales Repository (auf deutsh: Lagerstatte) gibt, in dem der gesamte Dateibaum vershiedener Projekte mit den dazugehorigen Verzeihnissen, Dateien und deren Versionen abgelegt ist. Jeder Benutzer erzeugt mit Hilfe von CVS eine private Arbeitskopie (oder auh mehrere) eines zu einem Projekt gehorenden 16 Dateibaums. Hier kann er die Dateien beliebig andern, sowie neue Dateien und Verzeihnisse erzeugen oder auh veraltete Dateien und Verzeihnisse entfernen. Nahdem er seine Anderungen vorgenommen hat, mu er diese zunahst mit der Version im Repository abgleihen und anshlieend in das Repository eintragen, nahdem er ggf. Konikte mit den Anderungen anderer Benutzer aufgelost hat. Hilfreih ist hier oft, sih zunahst die eigenen Anderungen nohmals anzusehen, insbesondere, wenn mehrere Dateien betroen sind. Anmerkungen : CVS wird fast vollstandig durh den Befehl vs(1) gesteuert. Die eigentlihen Aktionen von CVS werden durh Kommandonamen gesteuert, die als erster Parameter auf der Kommandozeile dem Befehlswort vs folgen (s.u.). An vershiedenen Stellen werden Versionsnummern und Bezeihner benotigt und benutzt, auf die wir hier aber niht weiter eingehen. 6.2 Arbeiten mit CVS 6.2.1 Vorbereitungen module add vs | Programm in den Suhpfad laden Das Programm vs mu der Shell bekannt gemaht werden. Das geshieht in unserer Umgebung durh die Eingabe von idefix:~ $ module add vs vs init | Neues CVS-Repository anlegen Ein neues Repository wird angelegt, in- dem man (an beliebiger Stelle) ein Verzeihnis anlegt, die Environment-Variable CVSROOT darauf einstellt, in dieses wehselt und dann das Kommando init ausfuhrt: idefix:~ $ mkdir /sw-praktikum/vsroot idefix:~ $ d /sw-praktikum/vsroot idefix:~ $ setenv CVSROOT /sw-praktikum/vsroot idefix:/sw-praktikum/vsroot $ vs init vs import | Neues CVS-Projekt anlegen Man beginnt ein neues Projekt, indem man in einem beliebigen Verzeihnis work dir (niht in CVSROOT!) mindestens ein neues Verzeihnis anlegt, ggf. auh weitere Unterverzeihnisse des neuen Projekts. Anshlieend wehselt man wieder nah work dir und ruft dort das CVS-Kommando import auf. Dabei werden drei weitere Parameter notig: 1. Der Projektname (Verzeihnisname), unter dem das Projekt abgelegt werden soll. 17 2. Ein globaler Bezeihner fur die Version, der vor allem wihtig ist, wenn mehrere Versionen von Fremdsoftware mit verwaltet werden sollen (hier also niht). 3. Ein lokaler Bezeihner fur die Version. Die lokalen bzw. globalen Bezeihner sind fur uns in diesem Falle (neues Projekt) niht weiter von Interesse. Wir wahlen einfahe Bezeihner, die auf die Neuheit des Projektes verweisen: idefix:... $ mkdir my proj idefix:... $ d my proj idefix:.../my proj $ mkdir sr idefix:.../my proj $ mkdir inlude idefix:.../my proj $ vs import new proj start it developer 0 vs import: Importing $CVSROOT/new proj/sr vs import: Importing $CVSROOT/new proj/inlude -->$CVSEDITOR No onflits reated by this import 6.2.2 Arbeiten mit einem CVS-Repository vs hekout | Arbeitskopie erzeugen Nahdem man die Environment-Variable $CVSROOT auf den Pfad des Repositories eingestellt hat, kann man mit dem CVS-Kommando hekout im aktuellen Verzeihnis eine Kopie der aktuellen Version des Dateibaums von einem im Repository abgelegten Projekt erzeugen (hier z.B. test): idefix:~/... $ vs hekout test vs hekout: Updating test U test/file Nun konnen die bestehenden Dateien geandert (bzw. neue angelegt oder veraltete gelosht) werden: idefix:~/... $ d test idefix:~/.../test $ $EDITOR file 18 Anmerkung : CVS legt im Arbeitsverzeihnis (und in allen Unterverzeihnissen) zusatzlihe Verzeihnisse mit dem Namen CVS an. Diese und die darin enthaltenen Dateien durfen niht manipuliert werden! vs update | Eigene Anderungen mit dem Repository abgleihen Nah er- folgter Anderung werden die Dateien mit dem CVS-Kommando update mit der Version im Repository verglihen. Hierbei wird insbesondere gepruft, ob seit dem letzten Abgleih (oder hekout) Dateien durh andere Benutzer geandert wurden. Existieren solhe Anderungen, werden sie automatish in der eigenen Arbeitskopie nahgetragen. Falls dabei Konikte auftreten, z.B. weil zwei Benutzer an der gleihen Stelle einer Datei geandert haben, so mussen diese zunahst aufgelost werden. idefix:~/.../test $ vs update vs update: Updating . M file Es wird fur jede Datei, die von Anderungen betroen ist, ihr Name ausgegeben und ein Indikator (Buhstabe am Anfang der Zeile), der die Anderung beshreibt: Updated Anderungen aus dem Repository wurden in die Arbeitsdatei ubernommen. Es sind keine Konikte aufgetreten. Modied Die Arbeitsdatei wurde verandert. Anderungen konnen durh ein ommit ins Repository ubertragen werden. Conits Es gibt Konikte zwishen Anderungen in der Arbeitsdatei und Anderungen im Repository (s. Konikte auosen). Removed Die Arbeitsdatei wird (durh das ommit) auh im Repository gelosht. Added Die Arbeitsdatei wird (durh das ommit) als neue Datei ins Repository aufgenommen. ? Arbeitsdatei: Keine korrespondierende Datei im Repository vs ommit | Anderungen ins Repository eintragen Treten keine Konikte auf, bzw. sind diese behoben, so werden die Anderungen endgultig mit dem CVS-Kommando ommit ins Repository eingetragen. Dabei wird f ur die geanderten Dateien ein Editor (Environment-Variable $CVSEDITOR bzw. $EDITOR) geonet, in den man seine Anmer kungen zu den Anderungen eintragen kann: idefix:~/.../test $ vs ommit vs ommit: Examining . vs ommit: Committing . 19 -->$CVSEDITOR Cheking in file; $CVSROOT/test/file,v <-- file new revision: 1.2; previous revision: 1.1 done Ahtung : Wurden die Konikte nah einem update-Kommando niht aufgelost, so werden die Dateien mit Koniktmarkierungen (s. Konikte auosen) ins Repository ubertragen. Das Arbeitsverzeihnis bleibt durh den Befehl ommit erhalten, es kann einfah gelosht werden, falls es niht mehr gebrauht wird. vs add | Neue Dateien einfugen Hat man, z.B. mit dem Editor, eine neue Datei angelegt, so mu diese mit dem CVS-Kommando add beim Repository angemeldet werden. idefix:~/.../test $ $EDITOR newfile idefix:~/...;/test $ vs add newfile vs add: sheduling file `newfile' for addition vs add: use 'vs ommit' to add this file permanently Die endgultige Ubernahme erfolgt erst bei einem ommit: idefix:~/.../test $ vs ommit vs ommit: Examining . vs ommit: Committing . RCS file: $CVSROOT/test/newfile,v done -->$CVSEDITOR Cheking in newfile; $CVSROOT/test/newfile,v <-- newfile initial revision: 1.1 done vs remove | Dateien loshen Dateien bzw. Verzeihnisse konnen durh das CVSKommando remove aus dem Repository gelosht werden, wenn sie auh im Arbeits20 verzeihnis gelosht wurden (bei Verzeihnissen erst deren Dateien aus dem Repository loshen, ggf. rekursiv). idefix:~/.../test $ rm file idefix:~/.../test $ vs remove file vs remove: sheduling `file' for removal vs remove: use 'vs ommit' to remove this file permanently Auh hier erfolgt die endgultige Loshung erst durh ein ommit (Die Dateien werden niht wirklih im Repository gelosht, sondern nur als gelosht markiert, da man jederzeit eine alte Version des Projektes wieder herstellen konnen mu): idefix:~/.../test $ vs ommit vs ommit: Examining . vs ommit: Committing . -->$CVSEDITOR Removing file; $CVSROOT/test/file,v <-- file new revision: delete; previous revision: 1.2 done vs di | Anderungen betrahten Oft will sih der Benutzer vor einem ommit nohmals die Anderungen ansehen, die er vorgenommen hat. Hier gibt es das CVSKommando diff, das auf dem UNIX-Befehl diff(1) aufbaut und auh die gleihen Optionen hat. In diesem Fall werden Anderungen mit einem ! eingeleitet: idefix:~/.../test $ vs diff -b vs diff: Diffing . Index: file =================================================================== RCS file: $CVSROOT/test/file,v retrieving revision 1.1 diff -b - -r1.1 file *** file 1998/01/20 00:03:59 1.1 21 --- file 1998/01/21 08:15:21 *************** *** 3,9 **** # # test CVS -- history at end ! testfile # # Revision 1.4 2000/01/13 08:25:19 duda # Seitenfuss vereinheitliht # # Revision 1.3 2000/01/12 09:56:11 duda # ISA-->VS # # Revision 1.2 1998/07/01 09:35:28 asheman # Ruk-Verweis auf CVS-Hauptseite eingefuhrt # # Revision 1.1 1998/04/20 11:13:39 asheman # Initial revision # --- 3,10 ---# # test CVS -- history at end ! hanged one line ! to two lines! # # Revision 1.4 2000/01/13 08:25:19 duda # Seitenfuss vereinheitliht # # Revision 1.3 2000/01/12 09:56:11 duda 22 # ISA-->VS # # Revision 1.2 1998/07/01 09:35:28 asheman # Ruk-Verweis auf CVS-Hauptseite eingefuhrt # # Revision 1.1 1998/04/20 11:13:39 asheman # Initial revision # Konikte auosen Treten bei dem Kommando update Konikte auf, z.B. idefix:~/.../test $ vs update vs update: Updating . RCS file: $CVSROOT/test/newfile,v retrieving revision 1.1 retrieving revision 1.2 Merging differenes between 1.1 and 1.2 into newfile rsmerge: warning: onflits during merge vs update: onflits found in newfile C newfile die niht von CVS automatish aufgelost werden konnen (Dateien, die mit dem Indikator C gekennzeihnet sind), so passiert folgendes: 1. Die unmodizierte Datei, von der beide Versionen ausgegangen sind, wird als .#le.version im jeweiligen Arbeitsverzeihnis abgelegt. Dabei entspriht le dem Dateinamen und version der Versionsnummer. 2. Die eigentlihe Datei enthalt den kompletten Inhalt beider Versionen inkl. der Konikte. Bereihe, in denen Konikte aufgetreten sind, sind folgendermaen aufgebaut: <<<<<<< newfile Conflit from loal file! ======= Conflit from repository! 23 >>>>>>> 1.2 Die Konikte mussen dann in der Arbeitsdatei manuell aufgelost werden. Anshlieend mu die Datei (oder die Dateien) wieder mit den Befehlen update und ommit ins Repository ubertragen werden. 6.2.3 CVS und Emas Die meisten CVS Kommandos lassen sih komfortabel im Emas ausfuhren. Als Vorbereitung mu dafur (vor dem Start des emas) in der Shell der Befehl module add emas ausgefuhrt werden. Folgende Zeile ist auerdem in die Datei ~/.emas zu ubernehmen: (autoload 'vs-update "pl-vs" nil t) Der CVS-Modus kann dann durh den Emas-Befehl M-x vs-update aktiviert werden. Hilfe zu den verfugbaren Kommandos gibt anshlieend die Eingabe eines ?. Alternativ dazu kann auh der Menupunkt Tools!Version Control verwendet werden. 6.2.4 CVS Home CVS kann auh von einem Heimarbeitsplatzrehner verwendet werden. Zunahst muss man gewahrleisten, dass eine ordnungsgemae ssh-Verbindung vom Heimarbeitsplatz zu dem CVS-Server aufgebaut werden kann. Naheres dazu unter man ssh, man ssh-keygen. Weiterhin mussen folgende Variablen (auf dem Heimarbeitsplatz) gesetzt werden: heimrehner:~ $ setenv CVSROOT USERNAMESERVERNAME:/sw-praktikum/vsroot heimrehner:~ $ setenv CVS RSH ssh USERNAME steht f ur den Uni-Aount, als SERVERNAME kann miraulix.informatik.uni-freiburg.de eingesetzt werden. Anshlieend kann wie gewohnt durh den Befehl heimrehner:~ $ vs hekout test 24 eine Arbeitskopie erzeugt werden. 6.3 Referenzen Die hier beshriebene Kurzanleitung orientiert sih zu einem groen Teil an http://www.informatik.tu-darmstadt.de/VS/Rehner/Software/Cvs/Kurz.html Weitere Referenzen lassen sih ausgehend von http://www.vshome.org lesen. Weiterhin stehen im Labor die Handbuher ,,Version Management with CVS\, ,,User's Guide to pl-vs|the Emas Front-End to CVS\ und ,,CVS Quik Referene Card\ bereit. 7 Doxygen 7.1 Kurzbeshreibung Doxygen ist ein Dokumentationssystem fur C++, Java, IDL und C. Es kann auf 3 vershiedene Weisen eingesetzt werden: 1. Es kann auf Basis von kommentierten Quelldateien on-line Dokumentationen in HTML und/oder o-line Handbuher in LATEX erzeugen. Ausgabe in RTF (MSWord), PostSript, hyperlinked PDF, komprimiertem HTML und als Unix man pages werden ebenfalls unterstutzt. Die Dokumentation wird direkt aus den Quelldateien extrahiert, wodurh die Konsistenz von Programmode und Dokumentation sehr viel einfaher gewahrleistet werden kann. 2. Doxygen kann dazu verwendet werden die Programmstruktur aus unkommentierten Souren zu extrahieren. Dies kann sehr nutzlih sein, um sih shnell in groen Paketen von Quelldateien zu orientieren. Die Abhangigkeiten zwishen Dateien, die hierarhishen Beziehungen zwishen Klassen und die Komponenten von Klassen bzw. Strukturen werden durh Graphen visualisiert, die alle automatish generiert werden. 3. Doxygen kann durh seinen Befehlssatz (einshlielih einiger LATEX und HTMLKommandos) dazu mibrauht werden, gewohnlihe Dokumente zu erzeugen. 7.2 Wihtigste Anwendungsvarianten 7.2.1 Setup und einfaher Aufruf Um Doxygen benutzen zu konnen mussen zunahst entsprehende Softwarepakete eingebunden werden. Dies geshieht durh die shell-Kommandos module add doxygen module add gv 25 Die gesamten Optionen zur Funktionsweise von Doxygen mussen in einem Kongurationsle angegeben werden, das ahnlihe Struktur wie ein Makele hat. Ein solhes Default-Kongurationsle wird erzeugt, indem Doxygen mit der -g Option aufgerufen wird: doxygen -g <onffile> Anshlieend kann die Datei <onffile> mit einem beliebigen Editor bearbeitet werden, oder man verwendet die grashe Oberahe doxywizard, die uber nutzlihe Hilfekommentaren zu den einzelnen Eintragen verfugt. Die minimal anzugebenden Optionen sind INPUT,FILEPATTERNS: die zu durhsuhenden Dateien festlegen HAVE_DOT: Erzeugen der diversen Graphen GENERATE_HTML,GENERATE_RTF,GENERATE_LATEX, GENERATE_XML,GENERATE_MAN: Festlegen der Ausgabeformate. Ohne weitere Angaben wird fur die entsprehenden Ausgabeformate jeweils ein defaultVerzeihnis angelegt, in das die Ausgabe erfolgt. Weitere nutzlihe Optionen sind OUTPUT_LANGUAGE: Ausgabesprahe festlegen HTML_HEADER,HTML_FOOTER: Festlegen der HTML-Files, die in der HTML-Dokumenta- tion als Kopf bzw. Fu jeder Seite eingefugt werden. 7.2.2 Kommentieren der Souren Fur sinnvolle Aussagen aus der durh Doxygen erzeugten Dokumentation ist ein vorgeshriebener Dokumentationsstil der Quelldateien notwendig. Durh einen Kommentarblok der Form /*! text */ bzw. die Einzelzeilenvariante //! text konnen Kommentarbloke deniert werden, die von Doxygen bearbeitet werden. Innerhalb dieser Bloke kann beliebiger freier Text und eine Vielzahl von Shlusselworter verwendet werden. Fur alle Bestandteile wie Dateien, Klassen, Methoden, Variablen, Funktionen et. ist eine solhe Dokumentation moglih und sinnvoll. Grundsatzlih ist fur jedes dieser Objekte eine Kurzdokumentation (durh die Einzeilenvariante) und eine detailliertere Dokumentation (durh einen Kommentarblok) moglih. Ist eine Kurzdokumentation langer als eine Zeile, mu diese innerhalb des Detaildokumentationsbloks durh das Kommando \brief deniert werden. Der gesamte Text bis zur nahsten Leerzeile wird dabei als Kurzdokumentation aufgefat. Die Kommentarbloke stehen grundsatzlih vor den Denitionen oder Deklarationen. In Einzelfallen ist eine andere Position sinnvoll. Eine Referenz auf das vorhergehenden Objekt kann z.B. durh die Einzeilenvariante via //!< text hergestellt werden. Dies maht bei Variablen Sinn, die nur einer kurzen Erlauterung bedurfen, ein Beispiel folgt unten. 26 Will man einen Kommentarblok vollkommen von der Denition oder der Deklaration eines Objektes losen, mu der Bezug des Bloks zu dem Objekt hergestellt werden mittels dem entsprehenden Shlusselwort \lass, \strut, \union, \enum, \fn, \var, \def, \file oder \namespae und anshlieendem Objektnamen. Grundsatzlih sollen publi-Komponenten in den Header-Dateien dokumentiert werden, private-Komponenten stattdessen in den zugehorigen Quelldateien. Einige Shlusselworter, die in den Bloken verwendet werden sollen, sind: \param <parname> <desription>: Dokumentation von Funktionsparametern. \exeption <exname> <desription>: Dokumentation mogliher Exeptions. \return <desription> : Dokumentation des R ukgabewertes einer Funktion. Nun wird ein Beispiel fur eine solhe kommentierte Datei angegeben. Man beahte, da die 'Kommentarsternhen' von Doxygen sinnvollerweise niht als Textbestandteile ubernommen werden. /*! *************************************************************** ** ** \file dummylass.hh ** \brief provides dummy lass for demonstration of ** doxygen-funtionality. ** ****************************************************************/ #inlude <parentlass.hh> //! brief desription of Dummylass. /*! More detailed desription an be longer. */ lass DummyClass : publi ParentClass { publi: /*! * * * * * * * * * */ \brief a brief desription an also last over several lines as shown in this example of a onstrutor. detailed desription of the onstrutor: reates new Dummylass Instane. \param \param param1 name some initialization parameter name of the instane. \exeption DummyClassExeption the possible exeptions DummyClass(onst int param1, onst har *name); //! /*! * * alulation of some reasonable value. \param param1 some neessary parameter for alulation 27 * \return */ the result of the alulation int al_something(onst int param1); /*! */ }; a publi variable ontaining one property. int property1; float property2; //!< this is a bakward-referene doumentation line. 7.2.3 Weitere Funktionalitat Die bisher angegebenen Shlusselworter sind nur ein geringer Ausshnitt aller moglihen. Unter anderem sind viele HTML und LATEX Kommandos moglih, fur Details hierzu und zu den vielfaltigen Eintragen in den Kongurationsles siehe unterstehende Referenz. 7.3 Referenzen Doxygen Homepage: http://www.stak.nl/~dimitri/doxygen/index.html 28