Continuous Integration ·Programmierung

Zwischendateien bei GNU make

Beim Ausführen einer Makefile durch GNU make werden Zwischendateien generiert. Bei C++ können das z.B. .o-Dateien sein. Aber auch andere Zwischendateien sind möglich. Ich habe mich ein wenig mit Zwischendateien von Makefiles beschäftigt und möchte hier ein wenig was dazu aufschreiben.

Dazu habe ich hier mal ein Makefile erstellt, dass ich hier als Beispiel verwenden möchte:

INTERMEDIATE_NAME = aout
EXE = -o $(INTERMEDIATE_NAME)
FINALNAME = hallo
 
# hallo wird nur neu kompiliert, falls
# aout neuer ist als hallo
hallo: aout
        cp -v $(INTERMEDIATE_NAME) $(FINALNAME)
 
# aout wird erstellt falls main.cpp
# neuer ist als aout.
aout: main.cpp
        $(CXX) $(EXE) main.cpp
 
# löschen aller erstellten Dateien
clean:
        rm -vf hallo
        rm -vf a.out

Dieses Makefile erstllt zuerst eine ausführbare Datei namens aout, die später in eine neue Datei hallo kopiert werden soll. Dabei ist aout hier eine Zwischendatei. Natürlich hätte ich hier auch ein Beispiel mit .o-Dateien erstellen können, aber dieses Beispiel sollte auch genügen.

Nachdem man das Makefile ausgeführt hat, finden sich zwei ausführbare Dateien im Ordner: aout und hallo. Normalerweise werden Zwischendateien von make gelöscht, da es aber ein Ziel names aout in der Makefile gibt, wird die Datei aout hier nicht gelöscht.

Möchte man aber, dass auch erwähnte Zwischendateien am Schluss gelöscht werden, muss man noch das spezielle Ziel .INTERMEDIATE zu dem Makefile hinzufügen:

INTERMEDIATE_NAME = aout
EXE = -o $(INTERMEDIATE_NAME)
FINALNAME = hallo
 
# hallo wird nur neu kompiliert, falls
# aout neuer ist als hallo
hallo: aout
        cp -v $(INTERMEDIATE_NAME) $(FINALNAME)
 
# aout wird erstellt falls main.cpp
# neuer ist als aout.
aout: main.cpp
        $(CXX) $(EXE) main.cpp
 
# löschen aller erstellten Dateien
clean:
        rm -vf hallo
        rm -vf a.out
 
.INTERMEDIATE: aout

Während ich mit Zwischendateien rumgespielt habe, habe ich gemerkt, dass .INTERMEDIATE nur dann funktioniert, wenn drei Bedingungen vorhanden sind:

  1. Die Zwischendatei muss während des make-Prozesses erstellt werden. Existiert sie vorher schon, dann wird sie trotz .INTERMEDIATE-Zeile nicht gelöscht.
  2. Es muss ein Ziel geben mit dem Namen der Datei
  3. Das Ziel bzw. die Datei muss als Vorbedingung für das Ziel .INTERMEDIATE gesetzt werden.

Quellen