2 Stimmen

Wie man make dazu bringt, Abhängigkeiten korrekt zu erstellen, wenn generierte Header beteiligt sind

Ich versuche, make dazu zu bringen, automatisch einige generierte Header zu erstellen und dann die Depency ( .d ) Dateien automatisch. Ich bin mir jedoch nicht sicher, wie ich make dazu bringen kann, beide Ziele korrekt und in der richtigen Reihenfolge zu erfüllen.

Hier ist, was ich bis jetzt habe:

all: test

test: test.o
    g++ test.o -o test

test.o: test.cc test.d external-headers
    g++ test.cc -c -o test.o

test.d: test.cc external-headers
    g++ -MM -MT $@ $< -o $@

external/some_header.hh:
    mkdir -p external
    touch external/some_header.hh

.PHONY: external-headers

-include test.d

external-headers: external/some_header.hh

Wenn ich mir die Abhängigkeiten ansehe, scheint dies korrekt zu sein, denn ich muss den externen Header erstellen, bevor ich irgendetwas erstellen kann .d Akte. Auch wenn die externen Kopfzeilen fehlen, müssen sie neu erstellt werden. Allerdings führt dieses kleine Makefile dazu, daß GNU make in eine Endlosschleife gerät. Ich habe die Debugging-Option benutzt, um herauszufinden, warum das so ist.

Was ich sehen konnte, war, dass make sich jedes Mal neu startet, wenn es eine eingebundene Datei neu erstellt. Das ist in Ordnung und das, was ich erwarten würde. Bei jedem Neustart erstellt es jedoch die external-headers Ziel, weil es nicht echt ist. Auch wenn in den nachfolgenden Zielen nichts erstellt werden muss, bedeutet dies, dass ein abhängiges Ziel für die Includes seit dem letzten Aufruf neu erstellt wurde, so dass es seine Includes neu erstellt und dann neu startet.

Gibt es eine gute Lösung für dieses Problem? Die einfachste Idee, die ich hatte, war, die .d Dateien abhängig von der Kopfzeile external/some_header.hh direkt und überspringt das dazwischen liegende Ziel. Im Test funktioniert dies einwandfrei. Jedoch in der realen Situation, ich habe eine ganze Reihe von generierten Header, und ich möchte einfach in der Lage sein, alle von ihnen auf einmal neu zu erstellen.

Eine andere Idee, die ich hatte, war, irgendwo eine Datei hinzuzufügen, die eigentlich external-headers und berühren diese Datei jedes Mal, wenn dieses Ziel aufgerufen wird. Auf diese Weise könnte make speichern, wann es das Ziel das letzte Mal neu erstellt hat und müsste eigentlich nichts mehr tun.

Gibt es eine bessere Möglichkeit, so etwas zu handhaben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X