2016-04-05 12 views
1

Ich habe eine Version Datei verfile, die unter Version Zeichenfolge enthält
V1.1.2Bash-Schnipsel nicht in Make-Datei funktioniert

Und in Makefile Ich beabsichtige, diese Version Zeichenfolge zu lesen, Also schrieb ich Makefile wie folgt,

filepath  :=  $(PWD) 
versionfile  :=  $(filepath)/verfile 

all: 
     cat $(versionfile) 
     version=$(shell cat $(versionfile)) 
     echo "version=$(version)" 

Nun, wenn ich die Make-Datei ausführen bekomme ich folgende ouput

cat /home/ubuntu/ankur/verfile 
v1.1.2 
version=v1.1.2 
echo "version=" 
version= 

Also ich bin nicht in der Lage, Version Zeichenfolge in der Variablen zu speichern und später verwenden, Ich bin mir nicht sicher, was mache ich falsch?

Irgendein Vorschlag/Zeiger?

Nach der Lektüre Antwort von "Didier Trosset" änderte ich meine Make-Datei wie folgt,

filepath  :=  $(PWD) 
versionfile  :=  $(filepath)/verfile 
myversion  :=  "" 

all: 

ifeq ($(wildcard $(versionfile)),) 
all: 
     echo "File not present" 
else 
all: myversion = $(shell cat $(versionfile)) 
endif 
all: 
     echo "myversion = $(myversion)" 

und unten ausgegeben für die

echo "myversion = v1.1.2" 
myversion = v1.1.2 

Antwort

3

Sie haben zwei Probleme. Zuerst bash (und nicht machen) erweitern Sie die Variable, die Sie verwenden müssen $$version (oder $${version}). Mit diesem Make übersetzt zuerst $$ in nur $ und dann bash wird $version (oder ${version}) sehen. Zweitens wird jede Zeile in der Regel als separater Befehl ausgeführt. Um sie also über Umgebungsvariablen interagieren zu lassen, müssen Sie sie in eine gemeinsame Subshell einfügen, die mit einer Paranthese eingeschlossen ist.

filepath  :=  $(PWD) 
versionfile  :=  $(filepath)/verfile 

all: 
    cat $(versionfile) 
    (version=$(shell cat $(versionfile)); echo "version=$$version") 
+0

Keine Notwendigkeit für die Parens - jeder Befehl in make wird sowieso in einer Shell aufgerufen –

3

Ich ziehe es in der Regel in einer make Variable diese Version Zeichenfolge haben.

Daher würde ich lieber das folgende verwenden, das Variablen in Variablen und Regeln/Ziel/Befehle in Regeln/Ziel/Befehle hält.

filepath  :=  $(PWD) 
versionfile  :=  $(filepath)/verfile 
version   :=  $(shell cat $(versionfile)) 

info: 
     echo "version=$(version)" 

beachte hier, dass, version ein echter Make variabel ist. (Im Gegensatz zu einem Bash-Variable im Gegensatz nur in einer lingle Regel Linie des Ziels bestehenden.)


Wenn müssen Sie einige Befehle, um die versionfile zu erstellen, dann würde es besser sein, diese Datei auf sein eigenen Ziel zu schaffen

filepath  :=  $(PWD) 
versionfile  :=  $(filepath)/verfile 

all: versionfile 
     echo "version=$(version)" 

all: version = $(shell cat $(versionfile)) 

versionfile: 
     # Create your version file here 

Beachten Sie, dass Sie nicht die := mehr für die Zielvariable verwenden können: würde es die Datei auf Makefile zu lesen, anstatt lesen, wenn verwendet, dh nach versionfile Ziel erstellt wurde.

+0

Aber das Problem ist, kann ich diese Versionsdatei nur nach dem Ausführen anderer Befehle als Teil des Ziels verwenden? Können wir die Makefile-Variable in der Ziel-Datei "info" in Ihrem Makefile setzen? – AnkurTank

+1

@AnkurTank Ja, das ist möglich. Es heißt Zielvariablen in GNU make. Wenn Sie diesen Weg gehen möchten, würde ich vorschlagen, ein Ziel 'versionfile' zu ​​erstellen, wobei das tatsächliche Gebäudeziel davon abhängt, wie in der Antwortbearbeitung. –

+0

@ "Didier Trosset" Vielen Dank für Ihre Hilfe, ich habe meine Anfrage in Frage gestellt.Lassen Sie es mich wissen, wenn Sie darin eine Verbesserung sehen. Grundlegende Schritte erforderlich waren, 1. Überprüfen Sie, ob die Versionsdatei vorhanden ist, 2. Extrahieren und speichern Sie diese Version aus der Datei. 3. Schreiben und verwenden Sie die Version später. – AnkurTank