Senden Sie env an ein Makefile-Ziel

1486
Medhamsh

Ich versuche, eine Env-Variable zu setzen, die für ein Makefile-Ziel git sha1 ist. Ich setze viele env vars und nur dies schlägt fehl, ohne einen solchen Datei- oder Verzeichnisfehler. Ich bin total verwirrt. Bitte helfen Sie mir, dies als env var an mein Makefile-Ziel zu übergeben. Das mache ich am Anfang meines Makefiles.

SHA1 := $(shell git log | head -1 | awk '') BUILD_STAMP := $(shell date +%s) export SHA1 export BUILD_STAMP 

Und eines der Makefile-Ziele hat so etwas.

target: dep-target env \ VAR1=$(VAR1) \ GIT_SHA1=$(SHA1) \ my-command for the target 

Das scheitert mit

env: a6d23d14b0fbb613e567cc647ebfe2808ce47af1: No such file or directory 

Bitte helfen Sie mir, dies als env var festzulegen.

3
Wenn Sie die Antwort auf Ihre Frage unten finden, markieren Sie sie als "akzeptiert", indem Sie auf das graue Häkchen neben ihr klicken. Hannu vor 7 Jahren 0
Hat der Wert von SHA1 ein Leerzeichen? user20574 vor 7 Jahren 0

2 Antworten auf die Frage

3
Hannu
 VAR1 = $ (VAR1) GIT_SHA1 = $ (SHA1) 

Die runden Klammern, Klammern, die $auf diese Weise mit einem davor verwendet werden, bewirken, dass der Text zwischen den Klammern als Befehlszeile an Bash gesendet wird, um die Ausführung zu versuchen.

Ersetzen Sie stattdessen durch geschweifte Klammern, dh GIT_SHA1=$Sie erhalten stattdessen die beabsichtigte Variablenzuweisung.

Bist du sicher? Make sollte zuerst seine Variablen ersetzen (und sieht $ () als Variablen-Ersatz) und THEN bash wird kein $ () sehen, da Make sie zuerst ersetzt. user20574 vor 7 Jahren 0
Ich gehe davon aus, basierend auf "Keine solche Datei des Verzeichnisses", dass ich recht habe. Hannu vor 7 Jahren 0
Möglicherweise stellen Sie fest, dass A) die Datei oder das Verzeichnis, die nicht gefunden wurde, als a6d23d14b0fbb613e567cc647ebfe2808ce47af1` und nicht als SHA1 bezeichnet wird und B) dass die Nachricht von `env` und nicht von` bash` gedruckt wurde. user20574 vor 7 Jahren 0
Ich gehe davon aus, dass SHA1: = $ (shell git log | head -1 | awk '') `die Variable auf diesen Wert setzt, und die Tatsache, dass env druckt, impliziert für mich, dass env über Bash (oder "System()" ). Hannu vor 7 Jahren 0
Wenn $ (...) `bedeutete, dass" dies als Befehlszeile an die Bash gesendet werden soll, um die Ausführung zu versuchen ", dann würde $ (SHA1)` versuchen, den Befehl "SHA1" auszuführen, der einen Fehler ausgibt, der den Befehl "SHA1" ausdrückt `wurde nicht gefunden. Was passiert, wenn Sie in Ihrem Terminal "SHA1" eingeben? user20574 vor 7 Jahren 0
1
Curt

Ich habe nicht genug Vertreter, um @ Hannus falsche Antwort zu kommentieren (geschweifte und runde Klammern sind in Make gleichwertig).

Um dies zu debuggen, erstellen Sie ein separates kurzes Makefile und probieren Sie Folgendes aus:

SHA1 := $(shell git log | head -1 | awk '') all: echo "$(SHA1)" 

Dies zeigt, was passiert, wenn SHA1 der gesamten ersten Zeile der Git-Protokoll-Ausgabe zugewiesen wird, nicht nur dem SHA, und das Leerzeichen enthält. Der erweiterte Befehl env hätte dann eine ungültige Syntax.

In diesem Fall muss das Dollarzeichen im Befehl awk verdoppelt werden (print $$ 2), sodass es zu einem Dollar-Dollarzeichen wird und nicht als leere Variable $ (2).

`(geschweifte und runde Klammern sind in Make gleichwertig.) Was schreibst du * an dieser Stelle * im Makefile? Hannu vor 7 Jahren 0
@ Hannu Eine variable Erweiterung? user20574 vor 7 Jahren 0