0

ターゲットのルールを実行したいのですが、すべての依存ターゲットはこのターゲットを満たしていると見なします。

どうすればこれを達成できますか?

例:

$(NETWORK_SHARE)/foo.log:
    @echo Warning: server offline, still continue ...
    @exit 0

foo.csv: $(NETWORK_SHARE)/foo.log
    @echo Long export from a (different) server
    @echo sleep 20
    @echo foo > $@

$(NETWORK_SHARE)/foo.logが存在する場合:$(NETWORK_SHARE)/foo.logがfoo.csvよりも新しい場合、foo.csvは再構築されます。それ以外の場合は何も起こりません(デフォルト)

$(NETWORK_SHARE)/foo.logが存在しない場合(サーバーオフライン、障害など)、問題を示すメッセージのみを出力する必要がありますが、foo.csvは、foo.csvが存在しない場合にのみビルドされます。

.PHONYをいじってさまざまな戻り値を返しましたが、ケース2の場合、$(NETWORK_SHARE)/foo.logで何かを実行するとすぐに高価な「エクスポート」が発生します...

よろしくdivB

4

2 に答える 2

1

古いファイル(誰かが誤って触れる可能性がある)を使用する代わりに、注文のみの前提条件を使用できるように見えます。これがGNUmakefileマニュアル(4.3章)からの引用です

ただし、場合によっては、これらのルールの1つが実行された場合にターゲットを強制的に更新せずに、呼び出されるルールに特定の順序を課したい場合があります。その場合、注文のみの前提条件を定義する必要があります。順序のみの前提条件は、前提条件リストにパイプ記号(|)を配置することで指定できます。パイプ記号の左側にある前提条件はすべて正常です。右側の前提条件は注文のみです。

 targets : normal-prerequisites | order-only-prerequisites
于 2014-01-10T01:53:10.180 に答える
0

すばらしい。関連する質問でのThitonの回答に感謝します(ファイルから古い状態を強制的に見つけさせます)。これを解決するためのハックを提供できるようになりました。

.PHONY: always-remake

NETWORK_SHARE = //server/dfs/common/logs

.PHONY: all
all: foo.csv

# file does not exist ...
ifeq "$(wildcard $(NETWORK_SHARE)/foo.log)" ""

old_file: always-remake
    @echo Warning: network is not available ....

foo.csv: old_file
    @echo Expensive export
    @sleep 10
    @echo $@ > $@
else
foo.csv: $(NETWORK_SHARE)/foo.log
    @echo Doing expensive export since log file changed ...
    @sleep 10
    @echo $@ > $@
endif

「old_file」はダミーファイルであり、存在する必要があり、他のファイルよりも新しくなることはありません(例:1/1/1971、00:00)

よろしくdivB

于 2012-06-20T14:43:25.750 に答える