25

ビルド ルールを適用する前にツールを実行して開始する Makefile があります (このツールが作成してくれます)。Python スクリプトであるこのツールが null 以外のステータス コードで終了した場合、GNU Make をその場で停止し、プログラムのビルドを続行しないようにします。

現在、私は次のようなことをしています(最上位、つまり列1):

$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk

しかしcollect_sources.py、ステータス コード 1 で終了しても、これは make を停止しません。これも標準出力をキャプチャしますが、出力collect_sources.pyしないため、間違った方向を見ているような気がします。

可能であれば、単純な MS-DOS シェルが標準のシステム シェルである場合でも、ソリューションは機能するはずです。

なにか提案を?

4

5 に答える 5

7

より良い方法があるかもしれませんが、私は以下を試しました、そしてそれはうまくいきます:

$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))

your_commandここでは、それは何の出力も与えないと仮定しましたが、そのような状況を回避するのは難しいことではありません。

編集:デフォルトのWindowsシェル(そしておそらく適切なシェル)で動作させるために、関数内のyour_command && echo ok代わりに書くことができます。これは(古い)DOSシェルでは不可能だと思います。これらの場合、エラー(または成功)時に何かを出力するようにラッパースクリプトを適合または作成する必要があります。ifshellyour_command

于 2008-10-22T12:58:42.337 に答える
4

残念ながら、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)

ifeq ... endifのインデントはスペースで行われることに注意してください。タブが使用されている場合、Make はコマンドを呼び出そうとしていると判断し、それについて文句を言います。

于 2008-10-23T16:35:36.487 に答える
4

BuildRules.mk を作成するには、通常のターゲットを使用する必要があります。

BuildRules.mk: collect_sources.py
        python $< >$@

include BuildRules.mk

これは、依存関係を自動的に生成するときに使用する標準的なトリックです。

于 2008-10-22T18:22:46.100 に答える
-1

-k オプションを指定して make/gmake を起動していないことを確認してください。

于 2008-10-22T18:35:02.877 に答える