abhängig von Verzeichnissen in make [duplizieren]

8

Dies ist ein Follow-up zu meiner früheren Frage: SO 4403861 , weil die vorgeschlagenen Lösungen die Abhängigkeiten durchbrochen haben Makefile nutzlos machen. Ich kann nicht herausfinden warum.

Ich benutze gnu make 3.82 Ich habe eine Regel, die funktioniert, wenn das Verzeichnis obj erstellt wurde:

%Vor%

Wenn jedoch das Verzeichnis obj nicht vorhanden ist, schlägt make fehl. Ich wollte, dass make automatisch ../obj on demand erstellt, also fügte ich hinzu, was ich für sehr einfach hielt:

%Vor%

Wenn ich dies tue, erzwingt make immer das Kompilieren jedes Mal. Warum? Das mkdir sollte nicht passieren, wenn es kein Verzeichnis gibt? Warum werden Abhängigkeiten durch diese einfache Änderung zerstört?

    
Dov 14.12.2010, 15:02
quelle

4 Antworten

2

Wie bereits beantwortet, können Sie ein Verzeichnis mit Ausgabedateien nicht als Abhängigkeit festlegen, da es jedes Mal aktualisiert wird.

Eine Lösung (oben erwähnt) ist, vor jedem Build ein mkdir -p zu setzen, wie folgt:

%Vor%

Aber ich mag diese Lösung nicht, weil sie das Ausführen eines zusätzlichen Prozesses sehr oft erzwingt. Wenn man jedoch den Grund für den Fehler kennt, gibt es einen anderen Weg:

%Vor%

Fügen Sie im primären Ziel, das die ausführbare Datei erstellt, einfach ein Zielverzeichnis vor den Objekten ein. Da es in der richtigen Reihenfolge getroffen wurde:

%Vor%

und dies wird nur einmal für den gesamten Build und nicht einmal pro Datei durchgeführt.

    
Dov 14.12.2010, 18:07
quelle
21

Sie können auch mit Nur-Bestell-Voraussetzungen link

Es ist ein ähnliches Beispiel Ihrer Frage verfügbar.

%Vor%     
Bhavik 19.12.2010 06:45
quelle
11

Wie bereits erwähnt, besteht das Problem darin, dass ein Verzeichnis immer dann als "geändert" betrachtet wird, wenn Verzeichnismitglieder hinzugefügt oder entfernt werden. make sieht, dass sich Ihr Ausgabeverzeichnis ständig ändert und wiederholt alle Kompilationen, von denen Sie gesagt haben, dass sie davon abhängen das Ausgabeverzeichnis.

Als Alternative zu den von anderen beschriebenen Umgehungen haben neuere GNU make-Versionen die Unterstützung für "Nur-Bestell-Voraussetzungen". Die Beschreibung der reinen Bestellvoraussetzungen im Handbuch enthält ein Beispiel dazu Verwenden Sie sie für die Verzeichniserstellung.

    
slowdog 14.12.2010 23:15
quelle
3

Eine Art Sentinel Datei löst das ziemlich gut. Ermöglicht das Schreiben einer einzelnen Musterregel, um alle Ordner zu erstellen, hat keine Rogue-Neukompilierungsprobleme und ist -j safe.

%Vor%     
bobbogo 06.01.2011 10:54
quelle

Tags und Links