next up previous contents
Nächste Seite: Zusammenfassung Aufwärts: Werkzeuge zur Programmerstellung Vorherige Seite: Werkzeuge zur Programmerstellung   Inhalt


Makefile

Beim Aufruf von make ohne Angabe der Option -f wird im aktuellen Verzeichnis nach einer Datei mit Namen Makefile oder makefile gesucht. Diese Datei beschreibt alle Ziele, Abhängigkeiten und Aktionen.

Ein Makefile kann folgende Einträge besitzen:

Kommentare
Makrodefinitionen
Explizite Regeln
Implizite Regeln

Kommentare werden durch # eingeleitet und gelten bis zum Ende der Zeile.

Makrodefinitionen sind mit Umgebungsvariablen bzw. Variablendefinitionen in Programmiersprachen vergleichbar. Einem beliebig gewählten Makronamen wird ein Wert zugewiesen. Auf den Wert oder Inhalt eines Makros kann dann mittels $(Makroname) (lesend) zugegriffen werden.

Explizite Regeln geben immer eine Zieldatei und, getrennt durch einen Doppelpunkt, deren Abhängigkeiten an, wobei die Abhängigkeiten auch leer sein dürfen. Die Syntax hierfür lautet:

   Ziel:Abh"angigkeiten
   [TAB] Aktion
wobei einen Tabulatorschritt bezeichnet. Ob dieser notwendig ist, oder aber einfache Leerzeichen genügen, hängt von der verwendeten Version von make ab.

Implizite Regeln sollen hier nicht weiter behandelt werden.

Wir stellen nun ein kurzes Beispiel-Makefile vor:

  # Das ist ein Kommentar
  #
  # (1)
  COMPILER = f95
  FLAGS    = -c

  # (2)
  poly.out: main.o up_1.o up_2.o up_3.o  
  [TAB] $(COMPILER) main.o up_1.o up_2.o up_3.o -o prog.out

  # (3)
  main.o: main.f95
  [TAB] $(COMPILER) $(FLAGS) main.f95

  # (4)
  up_1.o: up_1.f95
  [TAB] $(COMPILER) $(FLAGS) up_1.f95

  # (5)
  up_2.o: up_2.f95
  [TAB] $(COMPILER) $(FLAGS) up_2.f95

  # (6)
  up_3.o: up_3.f95
  [TAB] $(COMPILER) $(FLAGS) up_3.f95

  # (7)
  clean:
  [TAB] rm *.o
  [TAB] rm prog.out
Alle Zeilen, die mit einem #-Zeichen geginnen, sind Kommentarzeilen und haben keinen Einfluss auf die Ausführung von make.

Unter Punkt (1) werden zwei Makros definiert. Das Programm make substituiert bei der Ausführung ein gefundenes Makro mit dem Wert des Makros.

Die Punkte (2) bis (7) stellen explizite Regeln dar.

(2) beschreibt das Ziel poly.out. Diese Datei hat eine Reihe von Abhängigkeiten, nämlich main.o, up_1.o, up_2.o und up_3.o. Sind alle diese Abhängigkeiten erfüllt, d.h. liegen alle diese Dateien in einer aktuellen Version vor, so wird die Aktion $(COMPILER) main.o up_1.o up_2.o up_3.o -o prog.out ausgeführt, wobei hier $(COMPILER) durch f95 ersetzt wird.

Die Punkte (4) bis (6) enthalten als Ziele Objektdateien und als Abhängigkeiten jeweils die Quelldatei. Die Aktion ist jeweils eine Übersetzung der Quelldatei in eine Objektdatei.

Unter (7) sieht man das häufig eingesetztes Ziel clean. Durch den Aufruf von make clean werden alle Dateien mit der Endung .o sowie die Datei prog.out im aktuellen Verzeichnis gelöscht.

Beim Aufruf von make kann ein Ziel als Argument angegeben werden, ansonsten wird das erste Ziel im Makefile generiert. Für das obige Beispiel würde also ein Aufruf von make ohne Argumente das Ziel prog.out erzeugen. Da dieses Ziel jedoch eine Reihe von Abhängigkeiten besitzt, die selbst wieder Ziele sind, prüft make alle diese Ziele rekursiv. D.h. es werden unter Umständen alle Ziele unter (3) bis (6) erzeugt.

Ein Aufruf von make clean für obiges Beispiel würde hingegen nur alle *.o-Dateien und prog.out löschen.


next up previous contents
Nächste Seite: Zusammenfassung Aufwärts: Werkzeuge zur Programmerstellung Vorherige Seite: Werkzeuge zur Programmerstellung   Inhalt
Lars Tornow 2003-04-02