Woher weiß make, welche Dateien aktualisiert werden müssen

Lesezeit: 3 Minuten

Mir ist aufgefallen, dass, wenn ich Änderungen an einigen Dateien vornehme und dann make eingebe, bestimmte Befehle ausgeführt werden, die sich auf diese Dateien beziehen. Wenn ich nichts ändere, macht make nichts und sagt, dass das Programm auf dem neuesten Stand ist. Das sagt mir, dass make wissen kann, welche Dateien seit der letzten Ausführung geändert wurden. Woher weiß es? Es scheint nichts in das Verzeichnis zu legen, in dem es ausgeführt wird, also muss es diese Informationen woanders speichern.

Es überprüft die Metainformationen des Änderungsdatums des Dateisystems.

Siehe zum Beispiel die stat() Manpage und die st_mtime Mitglied von struct stat.

Es hat eingebaute Regeln, die ihm mitteilen, dass (zum Beispiel) eine .o-Datei neu generiert werden muss, wenn sich die entsprechende .c-Datei geändert hat; das Handbuchabschnitt zur Regelsyntax sagt:

Das Kriterium für das Veralten wird durch die Voraussetzungen angegeben, die aus durch Leerzeichen getrennten Dateinamen bestehen. (Wildcards und Archive-Member (siehe Archives) sind auch hier erlaubt.) Ein Ziel ist veraltet, wenn es nicht existiert oder wenn es älter ist als eine der Voraussetzungen (durch Vergleich der Zeiten der letzten Änderung).

make bestimmt, ob die Zieldatei X neu erstellt werden muss, indem überprüft wird, ob ihre Änderungszeit (wie im Dateisystem aufgezeichnet) älter ist als irgendeine ihrer Abhängigkeiten. Wenn Sie zum Beispiel eine Make-Regel wie die folgende hätten:

foo.o: foo.c foo.h common.h

Dann weiß es, dass es neu aufbauen muss foo.o wenn überhaupt foo.c, foo.h oder common.h haben eine neuere Änderungszeit als foo.o. Dies bedeutet, dass ausgeführt wird touch common.h zwingen würde foo.o beim nächsten Fabrikat umzubauen.

Das bedeutet, dass make kann verwechselt werden, wenn die Änderungszeiten unzuverlässig sind – beispielsweise wenn Ihre Systemuhr rückwärts gesprungen ist oder wenn Sie Ihre Dateien auf bestimmten Netzwerkdateisystemen speichern und mehrere Clients darauf zugreifen (insbesondere wenn die Uhren auf den verschiedenen Computern in Ihrem Netzwerk sind nicht synchron). Wenn Sie verwenden make Bei Dateien, die über ein Netzwerk verteilt sind, ist es im Allgemeinen eine gute Idee, NTP auszuführen, um Ihre Uhr korrekt einzustellen.

Make ist viel raffinierter, als es auf der Oberfläche erscheint. Es hat eine Inferenzmaschine mit einem ausgeklügelten Algorithmus; in Kombination mit Ihren Konfigurationsdaten make ist eine Art Programm + Datenbank, die als bekannt ist Expertensystem.

Wie auch immer, um Ihre Frage zu beantworten, der Scheck make does ist ein wenig knifflig, da es mehrere Ketten von Voraussetzungen geben kann, und diese Voraussetzungsketten selbst auf beliebige Weise vernetzt werden können.

Also die Antwort auf “woher weiß es?” ist:

  • machen stat(2)‘s die Dateien, um ihre Änderungszeiten zu erhalten
  • machen dann tut a topologische Sortierung auf dem Diagramm machte es aus dem Makefile

Sie haben Recht, make hinterlässt normalerweise keine Art von Cookies oder anderen Zustandsverfolgungsdateien. (Gelegentlich einige Makefile‘s erstellen selbst Timestamp-Cookies, aber das ist selten.) Aber das spielt keine Rolle, schließlich das Letzte Machen run könnte sowieso erfolglos sein. Es vergleicht einfach die Daten der erstellten Zieldateien mit den Daten der Quelldateien. Es interessiert nur, ob die Ziele aktuell sind, normalerweise spielt es keine Rolle, wann make wurde zuletzt gefahren.

Es prüft, ob der Datums-/Zeitstempel der Quelldatei später ist als der der entsprechenden Zwischendatei (oder vielleicht der Ausgabedatei – es ist schon eine Weile her, seit ich mich mit Make-Dateien beschäftigt habe). Wenn dies der Fall ist, muss die Datei kompiliert werden. Dies löst dann die Verknüpfung der endgültigen ausführbaren Datei aus.

1393290cookie-checkWoher weiß make, welche Dateien aktualisiert werden müssen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy