Makefile: abhängig von jeder Datei eines Verzeichnisses
Möchte ich ein Makefile, das läuft entweder mit gnumake oder makepp, packt alle Dateien, die unter den gegebenen directiories:
DIRS:=$(shell find . -mindepth 2 -maxdepth 2 -not -name mp3 -not -name ".*" -type d)
PACKAGES = $(DIRS:%=%.npk)
all: packages
packages: $(PACKAGES)
%.npk: %/*
npack c $@ @^
.PHONY: all packages
das problem ist, dass es gibt keine solche Sache als " % /* in die Abhängigkeiten.
Ich brauche die Ziele (X. npk) abhängen, die auf jede Datei im Verzeichnis X, aber ich weiß nicht, was die Dateien werden wenn ich Schreibe das Makefile, 'Ursache, die Sie erzeugt später.
Beispiel:
./dirA/x
./dirA/y
./dirB/e
./dirB/f
Möchte ich erstellen ./dirA.npk (je nach x,y), ./dirB.npk (e -, f -)
Es gibt nichts, was ich wissen über die Verzeichnisse oder die Dateien im Voraus, außer dass die Suche verwendet, in der 1. Zeile findet alle dirs.
- Ich habe versucht: %.npk: $(wildcard %/*), aber das funktioniert nicht. Ich dachte auch an ein er zusammen bekam aber an das gleiche problem, dass ich angewiesen auf target_dir/*.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, mit den
wildcard
Richtlinie:EDIT:
Das oben ist nur ein Beispiel für die Verwendung
wildcard
und macht jeder .npk-Datei hängt von den Dateien in allen anderen Ordner. Ihre Nutzung würde etwas anders sein.Ich glaube, es gibt einen einfacheren Weg zu gehen über diese. Warum werden Sie wollen, um eine Abhängigkeit auf alle Dateien in dem Ordner? Ist es einfach mit die
$^
Betreiber? Oder müssen Sie neu erstellen die .npk, ob Dateien verändert?Einer Alternative (und eventuell sauberere) Lösung wäre die Verwendung der
find
- Dienstprogramm in Ihrem Rezept statt$^
und verwenden Sie die.FORCE
Richtlinie immer die Kraft .npk-Datei neu erstellt werden. Der Nachteil ist, dass .npk-Dateien können neu erstellt werden, unnötig.EDIT 2:
Wenn es nicht eine Möglichkeit, dies sauber mit
make
Befehle, können Sie es umgehen, indem.FORCE
um sicherzustellen, dass das Rezept immer laufen und bewegen "sollte ich diese Datei neu erstellt" check in den Körper des Rezept:wo
check_for_rebuild.sh
ist ein shell-Skript, das bedeutet so etwas wie dieses:Ich mag nicht wirklich die Lösung, weil es funktioniert, um das problem statt es zu lösen direkt, aber es kann in der Lage sein, um Sie gehen in der Zwischenzeit. Wenn Sie diesen Weg gehen, ist es wahrscheinlich sauberer und einfacher, alles zu tun, in dem shell-script und entweder das makefile einfach aufrufen des scripts zu entfernen oder das makefile vollständig.
cmp X.npk X.npk.tmp
zeigt, veränderte ich umbenennen der tmp-Datei, sonst lösche ich es. Aber es ist immer langsamer als ich, haben mehr Verzeichnisse und Dateien.Dies ist die Lösung, die ich gefunden habe:
es basiert auf der makedepend Idee, mit den "meta" - scripting. Nicht sehr schön, aber funktioniert.
make -j<n>
,depend
Ziel könnte scheitern, und das tut er für meinen Fall. BewegenMakefile.depend
Ziel innerhalbdepend
Rezept beheben sollte.Mit makepp Sie können dies in 2 Schritten über das :foreach rule modifier:
Dieser bietet in der Regel für jedes Unterverzeichnis, das reexecutes, Wann immer es eine änderung in der Liste der Dateien darin.