次のようなGNU Makefile(version 3.81))があります。
.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)
次のコマンドラインで実行します:make X=0.1 Y=0.1 SPOneDot
しかし、次の結果が得られます。
ifndef X
make: ifndef: Command not found
make: *** [SPOneDot] Error 127
私は makefileのドキュメント を見て、- 他の人が使用する を見ました。どんな助けでもありがたいです、それはおそらく愚かなことです。
ほとんどの場合、makeディレクティブはタブインデントではなく、最初の列から開始する必要があります。また、単純なifdef
ではなく、.if(...)
または同様のものが必要だと思います。どのmake
実装を使用しているかを知らずに判断するのは困難です。
GNU makeでは、条件付き部分が使用されます
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
GNU make manual にすべての詳細があります。
環境変数変数をテストするつもりなら(make変数とは対照的に)、単にコマンドでそれを行います:
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
$$
は単一の$
としてシェルに渡され、すべてがシェルの単一のコマンドである必要があるため、セミコロンとバックスラッシュ/改行が必要です。
行がタブで始まる場合、それはルールのレシピの一部と見なされます。条件付きディレクティブ行の先頭では、余分なスペースは許可されて無視されますが、タブは許可されません。