Wie geben Sie ein makefile-Ziel in ein anderes Verzeichnis?
Ich versuche herauszufinden, warum kann ich nicht ein Ziel angegeben, wie in anderen Verzeichnis.
Ich versuche zu generieren, werden einige php-Klassen, die aus json-Dateien, aber ich habe mich verändert die Zeile, die tatsächlich erzeugt das php auf ein dummy-echo-Anweisung, also jemand anderes kann einfach kopieren, einfügen und testen, ob Sie fühlen sich sehr großzügig.
Gibt es zwei weitere Dinge hinzufügen, um das Verzeichnis mit dem makefile:
- Eine dummy-Abhängigkeit eine Datei namens PatientDbPath.json
- Ein Verzeichnis namens aus
Wenn ich ein makefile mit dem folgenden:
.SUFFIXES: .php .json
.json.php:
echo "HelloMe" > PatientDbPath.php
PatientDbPath.php: PatientDbPath.json
clean:
$(RM) PatientDbPath.php
Dann alles funktioniert, wenn ich laufen machen; PatientDbPath.php ist korrekt angelegt und das nächste mal wenn ich make ausführe, bekomme ich die Meldung make: 'PatientDbPath.php' is up to date.
Allerdings möchte ich erzeugen die php-Datei in einem separaten Verzeichnis, so dass ich aktualisiert mein makefile die folgende:
.SUFFIXES: .php .json
.json.php:
echo "HelloMe" > out/PatientDbPath.php
out/PatientDbPath.php: PatientDbPath.json
clean:
$(RM) out/PatientDbPath.php
Sobald ich das tun, sagt mir make: Nothing to be done for 'out/PatientDbPath.php'
obwohl dort ist keine Datei PatientDbPath.php in das out-Verzeichnis.
So, ich dachte, vielleicht war es etwas, mit dem suffix-Regeln und habe ich eine Dritte Datei makefile.
out/PatientDbPath.php: PatientDbPath.json
echo "Whatever" > out/PatientDbPath.php
clean:
rm out/PatientDbPath.php
Diese arbeitet man gut, wie der erste. Kann jemand sehen, was ich falsch mache in meinem 2. makefile?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Fehler in Ihrer wildcard-Regel - (.json -> .php), eine konzeptionelle und eine praktische.
Der konzeptionelle Fehler ist, dass dies eine Regel ist, wie konvertiert beliebige json-Dateien (sagen wir foo.json) zu beliebigen, aber gleichen namens .php-Dateien (sagen, json.php). Doch Ihre Herrschaft ist spezifisch für gnerating PatientDbPth.php. Eine bessere Regel wäre
wo
$@
eine variable ist, benennen Sie die Ausgabe-Datei.Zeigt dies auch das praktische problem: Diese Regeln sind wirklich beschränkt gleichnamige Dateien. Wenn Sie eine Regel haben, zu übersetzen .json in .php, und Sie haben foo.php und Sie wollen bar.php dann die wildcard-Regel übereinstimmen, werden nicht. Matching umfasst das gesamte Datei-Namen, so dass die wildcard-Regel passt nicht, wenn du danach fragst out/PatientDbPath.php. Dies lässt Sie mit der Regel, dass keine Aktion ausgeführt wird, damit folgert, dass nichts getan werden soll.
Ist dies die einzige Datei, die Sie konvertieren wollen, ist es am besten, es zu schreiben, wie Sie getan in der Dritten Datei. Wenn Sie haben viele von json-Dateien, und Sie möchten, konvertieren Sie Sie zu einer out -/*.php und verwenden Sie GNU make haben, können Sie verwenden, GNU make ist generalisierte wildcard-Regeln:
out/%.php : %.json
hat den trick. Ich habe ein follow-up-Frage. Muss ich erstellen Sie eine separate Regel für jede .json-Datei in diesem Verzeichnis?all:: $(patsubst %.json, out/%.php, $(wildcard *.json))
hinzufügen wird eine Abhängigkeit von einzelnen php-Dateien generiert werden, die aus jedem der .json in dem VerzeichnisGibt es eine andere Möglichkeit, das gleiche zu tun, vielleicht mehr aus:
Dadurch wird eine Regel erstellen, die für jede Datei aufgeführt in
JSON_FILES
, so dass, wenn Sie definiert wurdenJSON_FILES= foo.json bar.json
, dann wäre dies äquivalent zu:Könnte man dann verwenden
$(wildcard *.json)
zu setzen, das Wert, wenn Sie wirklich wollte, dass alle die .json-Dateien, oder legen Sie ihn manuell an, wenn die Regel ist eindeutig zu wenige.