web-dev-qa-db-ja.com

変数がメイクファイルで定義されているかどうかの確認

次のような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のドキュメント を見て、- 他の人が使用する を見ました。どんな助けでもありがたいです、それはおそらく愚かなことです。

18
Troy Rockwood

ほとんどの場合、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

$$は単一の$としてシェルに渡され、すべてがシェルの単一のコマンドである必要があるため、セミコロンとバックスラッシュ/改行が必要です。

21
Jens

行がタブで始まる場合、それはルールのレシピの一部と見なされます。条件付きディレクティブ行の先頭では、余分なスペースは許可されて無視されますが、タブは許可されません。

4
frido