2011-11-09 6 views
4

私は2つのターゲットを定義するかなり簡単なテストMakefileを書きました。すべて& cleanです。私は2つの異なる条件文を持っています。 1つは$(MAKECMDGOALS)特殊変数の存在をチェックし、もう1つはコマンドラインターゲットのどれかが変数(NODEPS)にリストされているものと一致するかどうかを検出します。私が抱えている問題は、私の条件文の中の分岐のどれも実行されないということです。最終的には、私が提供しているターゲットにいくつかの自動生成された依存ファイルを含めるべきかどうかを判断するために条件を使用したいと思いますが、現時点でどちらの式も評価するのに苦労しています。私はGNU make version 3.81を実行しています。私はUbuntuとMac OS Xのもとでそれを試してみました。GNU Makeでifeqとifndefを使用する

NODEPS := clean 
    INCLUDE = $(filter $(NODEPS),$(MAKECMDGOALS)) 

    .PHONY : all clean 

    ifndef $(MAKECMDGOALS) 
     @echo "$$(MAKECMDGOALS) is not defined" 
    else 
     @echo "$(MAKECMDGOALS) is defined" 
    endif 

    ifneq (0, $(words $(INCLUDE))) 
     @echo "INCLUDE = $(INCLUDE) != 0" 
    else 
     @echo "INCLUDE = $(INCLUDE) == 0" 
    endif 


    all : 
     @echo "all : $(MAKECMDGOALS)" 

    clean : 
     @echo "clean : $(MAKECMDGOALS)" 
+0

あなたは穀物に対して作業しているかのように聞こえます。変数を渡す場合は、変数ではなくターゲットとして渡します。依存ファイルをインクルードしたい場合は、それを 'include'してください。 – Beta

答えて

13

最終的に私は何が間違っていたか分かりました。私は@echoではなく$(info)を使用するべきだと指摘しています。微妙には、問題の一部は、タブで@echoをインデントしたことでした。タブはルールでは必須ですが、条件文では許可されていないようです。もう1つの間違いは、ifndef MAKECMDGOALSと書かれていたはずのときに、テスト条件の変数$(MAKECMDGOALS)を展開したことです。

+0

私はちょうどインデントの問題に噛まれました。 – elias

11

makefileはシェルスクリプトではありません。実行可能な文を好きな場所に「無作為に」置くことはできません。

メイクファイル内から外の世界との通信の様々な方法があります:$(info ...)$(warning ...)$(error ...)$(shell @echo ...)は(一部、またはこれらのすべてはGNUの拡張を行うことでもよいです)。

Ps:あなたはスペルミスでPHONYです。

+0

スペルミスを発見してくれてありがとう。ほとんどのメイクファイルの例では、 '@ echo'という情報が流行していました。私はそれがルールの一部としてのみ有効であるとは思わなかった。 – Alastair

関連する問題