3

ステートメントが真でない場合、ifdefステートメントで終了コードを取得しようとしていますが、exit 1と$(call exit 1)を使用して試しました。

次のコードで最初のコードを使用すると、「Makefile:11:*セパレータがありません。停止してください。」というメッセージが表示されます。

..。

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

..。

を使用して$(call exit 1)もエラーは発生しませんが、makefileは実行を続けます。私が達成しようとしているのは、エラーコード1でelseのMakefileを終了することです

ありがとう

4

2 に答える 2

5

exit 1geekosaur が言うように、makefile 操作のようにシェル コマンドを配置することはできません。Makefile は、シェル スクリプトを含むことはできますが、シェル スクリプトではありません。シェル コマンドはターゲット レシピ内でのみ使用でき、それ以外の場所には使用できません。

GNU make の十分に新しいバージョンを使用している$(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 ...)機能をサポートしていない可能性もありますが、これはかなり前から存在しています。

于 2012-04-24T14:09:18.827 に答える
0

Makefile のどこかにそのままコードを貼り付けておくことはできません。コード ( などexit 1) は、常に何らかのビルド ルールに関連付けられています。

この場合、$(error)関数が必要です。ただし、それ自体が機能しないelseのと同じ理由で、にドロップするだけでは不十分な場合があります。exit 1全体を次のように言い換える必要があるかもしれません

PACKAGEDIR := $(if $(flavor PACKAGE),undefined,$(error PACKAGE must be defined!),$(HOME)/$(PACKAGE))
于 2012-04-24T05:28:26.137 に答える