2011-01-17 166 views
41

私のメイクファイルでは、ライブラリの存在をチェックし、有益なエラーメッセージを出したいと思います。GNU makeが "最初のターゲットの前にコマンドを開始する"エラー

9: ifeq ($(${JSONLIBPATH}),) 
10: JSONLIBPATH = ${ALTJSONLIBDIR}/${LIBJSON} 
11: endif 
12: ifeq ($(${JSONLIBPATH}),) 
13: $(error JSON library is not found. Please install libjson before building) 
14: endif 

私のメイクはライン13上で立ち往生:

Makefile:13: *** commands commence before first target. Stop. 

ライン13の後、私のメイクは、その目標を持って、ファイルが見つからなかったとき、私はmakeプロセスを終了する必要があり、条件を作成しました。

この条件ブロックをターゲット(たとえばisJSONLibraryInstalledというターゲット)に入れようとしましたが、これは正しく実行されません。

ターゲットを処理する前に、ファイルの存在をチェックしてエラーのケースを処理するにはどうすればよいですか?これがばかげた質問であれば謝罪してください。

答えて

62

まず、現在のパスにちなんで名付けられた変数の内容を調べています。これはおそらくあなたが望むものではありません。シンプルな環境変数の参照は、$(name)または$ {name}ではなく、$ {name}です。このため、13行目は常に評価されます。

第2に、私は$(エラー...)式の字下げに窒息していると思います。式が空の文字列に解決されても、行の先頭にはタブ文字があります。これはコマンドを示します。コマンドはルールの外には存在できません。

私は、インデントするためにタブではなくスペースを使用するとうまくいくと思います。

+9

リッチャー:私はスペースの代わりにタブを使用し、***コマンドが始まる前にこのままで止まっていました。第1のターゲットとする。あなたはその日を救った。多くのありがとう... :) – NeonGlow

+0

私の時間を節約してくれてありがとう... –

+2

禁じられた場所の偉大な観察..タブ:) –

1

私の場合は、これを引き起こしていたコネクタの前には不要な空白がありました。 slickeditでは、すべての特殊文字を表示するオプションを選択し、黒い羊に気づいた。

+0

閉じる、エラーの原因となっている '$(error ...'置換の前には不要なタブ文字ですそれを削除するかスペースで置き換えると、エラーは消えてしまいます。 –

3

あなたはエラーメッセージを作成し得る、常に(エラーが新しいバージョンから削除されているように見える)3.81を作るGNUにエラー・メッセージのドキュメントhttp://www.gnu.org/software/make/manual/make.html#Error-Messagesをチェックし、それは言う:

をこれが最初の事を意味し、 makefileはコマンドスクリプトの一部であるようです:TAB文字で始まり、合法的なmakeコマンド(変数割り当てなど)ではないようです。コマンドスクリプトは常にターゲットと関連付ける必要があります。

問題をより混乱させるのは、「法的なmakeコマンドではないようです」ということです。理由を説明します。

a := b 
    $(error a) 

エラーが2行で発生し、ない1:

a := b 
a: 
    echo $a 

注:SO現在、単にそれは割り当てのように解析できるという文なので、次のような作品を受け入れ作りますhttps://meta.stackexchange.com/questions/143632/tabs-converted-to-spaces