2012-04-24 12 views
3

が、私はIFDEF文で終了コードを取得しようとしている場合のMakefileに終了コード1を取得しますが、私は、出口1と$(コール終了1)文が真でない場合、文の

使用してみました私は "Makefile:11:*セパレータがありません。停止します。"

...

ifdef PACKAGE 
    PACKAGEDIR = $(HOME)/$(PACKAGE) 
else 
    exit 1 
endif 

...

$(call exit 1)を使用することで、私はエラーを取得していないが、メイクファイルはまだ実行し続けます。 私は何を達成しようとしているとすると、エラーコードとそれ以外にMakefileを終了する1

おかげ

答えて

4

として全体のことを言い換えるする必要があるかもしれません。 Makefileはシェルスクリプトではありませんが、にはシェルスクリプトが含まれています。シェルコマンドはターゲットレシピ内にのみ表示され、他の場所には表示されません。

あなたは、GNUの十分に新しいバージョンを持っている場合は、次のように、あなたが$(error ...)機能を使用することができます

ifdef PACKAGE 
    PACKAGEDIR = $(HOME)/$(PACKAGE) 
else 
    $(error You must define the PACKAGE variable) 
endif 

はまた、それが定義されていても場合、変数が定義されている場合ifdefはtrueになりますのでご注意空の文字列にする

ifneq ($(PACKAGE),) 
    PACKAGEDIR = $(HOME)/$(PACKAGE) 
else 
    $(error You must define the PACKAGE variable) 
endif 

変数が空でない値に設定されていることを確認してください。

GNU makeのバージョンが古くて$(error ...)機能をサポートすることができない可能性がありますが、これは長年にわたって行われています。

0

あなたは単にMakefileでどこかにこだわっ裸のコードを持つことができないことです。コード(exit 1など)は、常に何らかのビルドルールに関連付けられています。

この場合、$(error) functionが必要です。 elseにドロップするだけでは十分ではないかもしれませんが、同じ理由でexit 1自体はそこでは動作しません。あなたはgeekosaurあなたがメイクファイル操作としてexit 1のようなシェルコマンドを置くことができない言うように

PACKAGEDIR := $(if $(flavor PACKAGE),undefined,$(error PACKAGE must be defined!),$(HOME)/$(PACKAGE)) 
+0

まだ終了していません。パッケージは未定義です。未定義/ソースはターゲット内にありません – Gerardo

+0

言い換えれば、実際にどこかでトリガーする必要があります(これは一般的に 'make ')。あなたの "fyi"は混乱しています。変数定義は実際にはターゲットの一部ではありません。私は、あなたの終了しようとする試みがターゲットにあることを要求していると伝えようとしていました。あなたが実際にどこかで 'make'関数(' $(エラー) ')を起動させる必要があるので、あなたが望むものをフレーズするのは実際はやや難しいです。 ':='を使って私がdo * *への答えを編集したようにします。 – geekosaur

+0

@Gerardo、 '$(error)'は 'else'ブランチで動作します。 ')'の前のスペースに注意してください。 Makeのどのバージョンを使用していますか? – Beta

関連する問題