2013-05-23 4 views
13

definiert ist, habe ich eine GNU Makefile (Version 3.81), die wie folgt aussieht:wenn Variablen in einer Make-Datei

.PHONY: SPOneDot 

SPOneDot: 
    ifndef X 
    X=0.05 
    $$(info X undefined, changed to $X) 
    endif 
    ifndef Y 
    Y=0.05 
    $$(info Y undefined, changed to $Y) 
    endif 
    python ./Submit3DSP.py -f OneDot.qdt -x $(X) -y $(Y) 

ich ausführen mit der folgenden Befehlszeile: make X=0.1 Y=0.1 SPOneDot aber ich habe folgendes Ergebnis:

ifndef X 
make: ifndef: Command not found 
make: *** [SPOneDot] Error 127 

Ich habe in der gesucht und others use it gesehen. Jede Hilfe wird geschätzt, es ist wahrscheinlich etwas Dummes.

+0

Welche Art von Marke ist das? GNU machen? BSD? POSIX? – Jens

+0

GNU Make Version 3.81 wird hier verwendet. –

Antwort

18

Höchstwahrscheinlich müssen Ihre make-Anweisungen nicht eingerückt sein, sondern in der ersten Spalte beginnen. Ich vermute auch, Sie wollen .if(...) oder ähnlich, nicht einfach ifdef. Es ist schwer zu sagen, ohne zu wissen, welche make Implementierung Sie verwenden.

In GNU make werden bedingte Teile verwendet, z. wie dieser

ifeq ($(CC),gcc) 
     $(CC) -o foo $(objects) $(libs_for_gcc) 
else 
     $(CC) -o foo $(objects) $(normal_libs) 
endif 

Die GNU make manual hat alle Details.

Wenn Sie wirklich eine Umgebung Variable bedeuten zu testen (im Gegensatz zu einer Variable machen Gegensatz), dann tun einfach so in den Kommandos:

SPOneDot: 
    if test -z "$$X"; then X=0.05; echo "X undefined, changed to $$X"; fi; \ 
    if test -z "$$Y"; then Y=0.05; echo "Y undefined, changed to $$Y"; fi; \ 
    python ./Submit3DSP.py -f OneDot.qdt -x $$X -y $$Y 

Beachten Sie, dass $$ an die Shell übergeben wird als eine einzige $ und alles muss ein einziger Befehl für die Shell sein, daher die Semikola und Backslash/Zeilenumbrüche.

+0

Ich interessiere mich nur für diese Variablen, wenn ich dieses bestimmte Ziel mache, brauche ich sie noch nicht eingerückt? –

+1

Danke, ich habe gelernt, dass man keine Bedingungen in ein Ziel setzen kann. Es gibt clevere Möglichkeiten, dies zu umgehen, aber ich werde die Umgebungsvariable fix verwenden. Übrigens solltest du ein "Nachecho" in beiden Zeilen haben, damit das funktioniert. –

+0

Guter Fang - behoben. – Jens

4

Wenn die Zeile mit einem Tab beginnt, wird sie als Teil eines Rezepts für eine Regel betrachtet. Zusätzliche Leerzeichen sind zulässig und werden am Anfang der Zeile mit bedingten Anweisungen ignoriert, eine Registerkarte ist jedoch nicht zulässig.

Verwandte Themen