質問
ビルドルールを適用する前にツールを実行することで開始するMakefileがあります(このツールは私のために作成します)。このツール(Pythonスクリプト)がnull以外のステータスコードで終了する場合、GNU Makeをそこで停止し、プログラムのビルドを続行しないようにします。
現在、私はこのようなことをしています(トップレベル、つまり列1):
$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk
しかし、これはcollect_sources.py
がステータスコード1で終了してもmakeを停止しません。これは<=>の標準出力もキャプチャしますが、出力しません。方向。
可能な限り、ソリューションは、単純なMS-DOSシェルが標準システムシェルである場合でも機能するはずです。
提案はありますか?
解決 2
OK、これは私自身の解決策です。残念ながらcollect_sources.pyスクリプトのステータスコードに基づいていませんが、Works For Me(TM)であり、スクリプトが生成する出力を確認できます。
SHELL_OUTPUT := $(shell python collect_sources.py 2>&1)
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),)
$(info $(SHELL_OUTPUT))
else
$(error $(SHELL_OUTPUT))
endif
スクリプトは、エラーが"collect_sources: error:"
で始まる出力を生成するように記述されています。さらに、Pythonが特定のスクリプトを検出または実行できない場合、メッセージ"[Errno 2]"
などを含むエラーメッセージを出力します。そのため、この小さなコードは出力をキャプチャし(stderrをstdoutにリダイレクト)、エラーメッセージを検索します。何も見つからない場合は、単に$(info)
を使用して出力を印刷します。それ以外の場合は、$(error)
を使用して、Makeを効果的に停止します。
ifeq ... endif
のインデントはスペースで行われることに注意してください。タブが使用されている場合、Makeはコマンドを呼び出そうとしていると判断し、それについて文句を言います。
他のヒント
より良い方法があるかもしれませんが、私は次のことを試してみましたが、動作します:
$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))
ここではyour_command
が出力を提供しないと仮定しましたが、このような状況を回避するのは難しくないはずです。
編集:デフォルトのWindowsシェル(およびおそらく適切なシェル)で動作させるには、your_command && echo ok
関数内でif
の代わりにshell
を記述できます。これは(古い)DOSシェルでは不可能だと思います。これらの場合は、おそらく<=>を適応させるか、エラー(または成功)時に何かを出力するラッパースクリプトを記述します。
BuildRules.mkを作成するには、通常のターゲットを使用する必要があります。
BuildRules.mk: collect_sources.py
python $< >$@
include BuildRules.mk
これは、依存関係を自動的に生成するときに使用する標準的なトリックです。
修正 https://stackoverflow.com/a/226974/192373
.PHONY: BuildRules.mk
BuildRules.mk: collect_sources.py
echo Generating build rules...)
python $< >$@
$(MAKE) -f BuildRules.mk
-kオプションを指定してmake / gmakeを呼び出していないことを確認してください。