Donnerstag, Februar 27, 2020

Makefile Tricks mit VPATH und umfassen

Ich bin Herumspielen mit make-Dateien und die VPATH-variable. Im Grunde bin ich packte source-Dateien von ein paar verschiedenen Orten (angegeben durch den VPATH), und kompilieren Sie Sie in das aktuelle Verzeichnis, indem Sie einfach eine Liste .o-Dateien, die ich will.

So weit So gut, jetzt bin ich generating dependency-Informationen in eine Datei namens ‚.hängen‘ und darunter, die. Gnumake wird versuchen, mit den Regeln so weit zu erstellen, die die Datei enthalten, wenn Sie nicht existiert, also ist das ok. Im Grunde, meine makefile sieht so aus.

VPATH=A/source:B/source:C/source

objects=first.o second.o third.o

executable: $(objects)

.depend: $(objects:.o=.c)
    $(CC) -MM $^ > [email protected]

include .depend

Jetzt für die eigentliche Frage, kann ich die unterdrücken die generation der .hängen Sie die Datei in irgendeiner Weise? Derzeit arbeite ich in einer clearcase Umgebung -> sloooow, so würde ich es vorziehen, es zu haben ein bisschen mehr unter Kontrolle, wenn Sie zum aktualisieren der Informationen zu Abhängigkeiten.

Es ist mehr oder weniger eine Akademische übung, da konnte ich einfach wickeln Sie die Sache in ein script, das berühren der .hängen Sie die Datei vor dem ausführen machen (so dass es neuer als alle Quell-Datei), aber es wäre interessant zu wissen, ob ich irgendwie unterdrücken es mit „pure“ stellen.

Ich die Abhängigkeit nicht entfernen, um die Quelldateien (d.h. mit einfach .depend:), da bin ich je nach $^ Variablen zu tun, die VPATH Auflösung für mich.

Wenn, es würde keine Möglichkeit zu nur aktualisieren, Abhängigkeiten als Ergebnis der aktualisierten #include Richtlinien, das wäre noch besser natürlich.. Aber ich werde nicht meinen Atem für einen.. 🙂

  • Warum nicht einwickeln .depend: ... Ziel in if Richtlinie arbeiten?
  • interessant, ich hätte nie gedacht, dass.
InformationsquelleAutor falstro | 2010-03-16

1 Kommentar

  1. 2

    Wenn Sie nicht wollen, zu erneuern .hängen Sie jedes mal, Sie darf nicht eine Regel für Sie. Beachten Sie, dass, wenn Sie wirklich brauchen, um ein remake der Abhängigkeiten-Datei, müssen Sie auch das remake eine Objekt-Datei (das ist nicht meine Erkenntnis, es kommt aus Erweiterte Automatische Generierung Von Abhängigkeiten, und es hat einige Zeit gedauert, es zu begreifen). So bauen .abhängen in der Verknüpfung der Regel mit einem FALSCHEN Ziel:

    DEPEND_FILE = .depend
    # put this command in the executable rule
        $(MAKE) DEPENDENCIES
    
    .PHONY: DEPENDENCIES
    DEPENDENCIES: $(objects:.o=.c)
        $(CC) -MM $^ > $(DEPEND_FILE)
    
    -include $(DEPEND_FILE)
    

    Können Sie Dinge effizienter durch separate hängen-Dateien, eine für jedes Objekt, so dass, wenn man änderungen, die Sie nicht haben, um eine Neuberechnung der Abhängigkeiten aller Objekte:

    # put this command in the %.o rule
        $(CC) -MM $< > $*.d
    
    -include *.d
    

    (EDIT: so korrigiert ein dummer Fehler.)

    • ooh.. das Letzte, was ziemlich gut denken. es gibt ein flag für gcc (-MD) zur Generierung von Abhängigkeitsdateien, die während der Kompilierung zu, so dass Sie nicht brauchen, um es durch den Präprozessor zweimal.
    • Ich habe akzeptiert, wie es mich inspiriert zu tun, was ich Tat,, die haben das getrennt .d-Dateien für jedes Objekt auszuwerten, um jedes Objekt mit -MMD. Und die -include *.d. Dies bewirkt, dass die Neukompilierung ausgelöst werden, wenn erforderlich, produzieren Abhängigkeiten als Nebenprodukt. Keine Arbeit ist getan, wenn Sie nicht benötigt wird. Ausgezeichnet!

Kostenlose Online-Tests