Warum erstellt Make immer und immer wieder Verzeichnisse?

339
gcb

Ich habe ein Makefile, das einige Dokumente aus meiner Quelle erstellt:

/home/share/htdocs: #installs apache and make sure we have /htdocs...  /home/share/htdocs/doxjs: /home/share/htdocs mkdir -p $@ chgrp users $@ chmod g+w $@  /home/share/htdocs/dox: /home/share/htdocs mkdir -p $@ chgrp users $@ chmod g+w $@  .PHONY: dox dox: /home/share/htdocs/dox /home/share/htdocs/doxjs # runs doxygen cp -r dox/html/* /home/share/htdocs/dox/ cp -r doxjs/html/* /home/share/htdocs/doxjs/ 

Diese Regeln sollten lediglich die Berechtigung zum Bereitstellen der Dateien von htdocs erstellen, festlegen und Dokumente erstellen und verschieben.

aber wenn ich renne. Es wird immer versucht zu erstellen/home/share/htdocs/dox

irgendwelche ideen warum?

selbst wenn ich benutze:

.PHONY: setup setup: /home/share/htdocs/dox /home/share/htdocs/doxjs 

das ist was ich bekomme:

$ sudo rm -fr /home/share/htdocs/dox* $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox mkdir -p /home/share/htdocs/doxjs chgrp users /home/share/htdocs/doxjs chmod g+w /home/share/htdocs/doxjs  $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox  $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox 

Warum? Ich gehe davon aus, dass ich mit modifizierten Zeiten keinen Konflikt sehe. Aber ich kann mir nicht vorstellen was.

0

2 Antworten auf die Frage

1
QMaster

Hast du versucht zu laufen make -d? Laut der Manpage bietet dies:

Debugging-Informationen zusätzlich zur normalen Verarbeitung. In den Debugging-Informationen wird angegeben, welche Dateien für das Remaking in Betracht gezogen werden, welche Dateizeiten verglichen werden und mit welchen Ergebnissen, welche Dateien tatsächlich neu erstellt werden müssen, welche impliziten Regeln berücksichtigt und welche angewendet werden was ist zu tun.

1
dirkt

Ich habe Ihre Struktur verspottet und verwendet make -r -d setup, wo -dDebug-Ausgaben -rangezeigt und eingebaute Regeln ignoriert werden, so dass weniger Ausgabe erforderlich ist. Der relevante Teil ist

Considering target file 'setup'. File 'setup' does not exist. Considering target file 'htdocs/dox'. Considering target file 'htdocs'. Finished prerequisites of target file 'htdocs'. No need to remake target 'htdocs'. Finished prerequisites of target file 'htdocs/dox'. Prerequisite 'htdocs' is newer than target 'htdocs/dox'. Must remake target 'htdocs/dox'. 

Nach dem Abstieg htdocserhält dieses Verzeichnis also eine neuere Zugriffszeit als htdocs/doxund makeschließt daraus, dass es neu erstellt werden muss.

Lösung: Verwenden Sie kein übergeordnetes Verzeichnis als Voraussetzung.

Tatsächlich ist das gesamte Setup zum Erstellen von Verzeichnissen und zum Ausführen von make in ihnen ein bisschen faul; Was immer Sie erreichen wollen, Sie sollten es mit einer statischen Verzeichnisstruktur erreichen können.

Was bedeutet es, wenn htdocs neuer ist? es hat nur die Regel überprüft. Nach dieser Logik wäre jede einzelne Abhängigkeit neuer, wenn sie zuerst geprüft werden. Dies geschieht mit einer Abhängigkeit von Design gcb vor 7 Jahren 0