2012-06-19 40 views
0

我想執行的目標的規則,但所有相關指標應把這一目標作爲滿足。GNU做:執行目標,但需要依賴從文件

我該如何做到這一點?

實施例:

$(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 > [email protected] 

如果$(NETWORK_SHARE)/foo.log存在:foo.csv須重建如果$(NETWORK_SHARE)/foo.log比foo.csv更新;如果$(NETWORK_SHARE)/foo.log不存在(例如,服務器脫機,失敗,...),則僅顯示指示問題的消息,但應該打印foo.csv只有在foo.csv不存在的情況下才能生成。

我打得四處.PHONY和返回不同的返回值,但情況2,昂貴的「出口」只要我上執行$(NETWORK_SHARE)/foo.log有事......

問候 DIVB

+1

我所知,沒有乾淨的方式做到這一點,但你可以用條件withing的命令...... – Beta

+0

嗨雜牌吧,謝謝你這是什麼不過,我已經這樣做了,但我仍然存在這個問題。我想我找到了一個好辦法重新制訂: _I要輸出消息(執行命令)上的目標是達到DATE_。 – divB

回答

0

大,感謝在我相關的問題(Force make to find out-of-date condition from fileThiton's答案,我現在可以提供一個黑客來解決這個問題:

.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 [email protected] > [email protected] 
else 
foo.csv: $(NETWORK_SHARE)/foo.log 
    @echo Doing expensive export since log file changed ... 
    @sleep 10 
    @echo [email protected] > [email protected] 
endif 

「old_file」是一個虛擬文件,必須存在,並且不應該比任何其他文件(例如, 1971年1月1日00:00)

問候 DIVB

1

看起來像,而不是使用一些舊的文件(有人能小心碰),你可以使用一個訂單唯一的先決條件。下面是從GNU makefile文件手動報價(4.3章)

然而,有時候,你必須要強加的規則 特定的順序不強制 目標,如果要更新時要調用的情況其中一個規則被執行。在這種情況下, 您想要定義僅限訂單的先決條件。爲了只先決條件 可以通過將一個管道符號來指定(|)在前提條件 列表:任何先決條件管道符號的左邊是正常;任何 先決條件,以正確的順序是隻:

targets : normal-prerequisites | order-only-prerequisites