2010-09-27 19 views
1

我試圖創建一個Makefile,將下載和處理文件的文件生成的目標,這是一個簡化的版本:GNU使重載包括但不更新目標

default: all 
.PHONY: all clean filelist.d 
clean: 
    @rm -fv *.date *.d 

#The actual list comes from a FTP file, but let's simplify things a bit 
filelist.d: 
    @echo "Getting updated filelist..." 
    @echo "LIST=$(shell date +\%M)1.date $(shell date +\%M)2.date" > [email protected] 
    @echo 'all: $$(LIST)' >> [email protected] 

%.date: 
    touch [email protected] 

-include filelist.d 

不幸的是目標所有這些在第一次運行時都沒有正確更新,需要再次運行才能獲取文件。這是輸出我從它那裏得到:我使用的GNU讓3.81,其文檔指出重新加載整個事情,如果包含的文件得到改變

$ make 
Getting updated filelist... 
make: Nothing to be done for `default'. 
$ make 
Getting updated filelist... 
touch 141.date 
touch 142.date 
touch 143.date 

。出了什麼問題?

回答

2

您已將filelist.d指定爲.PHONY目標,因此請相信使該目標不會實際更新指定的文件。但是,它的確如此,新的內容將在下一次運行中使用。對於第一次運行,丟失的文件不是錯誤,因爲包含前綴短劃線。

從.PHONY中刪除filelist.d。但是,請記住它在刪除之前不會再次生成(因爲它不依賴於任何內容)。

同樣,您應該在.PHONY中包含「default」。


我寫了一個shell腳本,而不是一概而論這一切都在生成文件:

#!/bin/bash 
# Check whether file $1 is less than $2 days old. 

[ $# -eq 2 ] || { 
    echo "Usage: $0 FILE DAYS" >&2 
    exit 2 
} 

FILE="$1" 
DAYS="$2" 

[ -f "$FILE" ] || exit 1 # doesn't exist or not a file 

TODAY=$(date +%s) 
TARGET=$(($TODAY - ($DAYS * 24 * 60 * 60))) 
MODIFIED=$(date -r "$FILE" +%s) 

(($TARGET < $MODIFIED)) 

替換天的最大數量X可以filelist.d前通過再次下載:

filelist.d: force-make 
     ./less-than-days [email protected] X || command-to-update 
.PHONY: force-make 
force-make: 

現在filelist.d依賴於.PHONY目標,而不是假冒本身。這意味着filelist.d總是過時(僞目標永遠是「新」),但其配方只會定期更新文件。

不幸的是,這需要您將更新命令作爲單個命令寫入,如果太長,空間可能會成爲問題。在那種情況下,我會把它放在一個單獨的腳本中。

+0

謝謝,雖然有一個問題,因爲我不知道什麼時候ftp服務器將要更新,所以我需要在每次運行時重新創建filelist.d,但至少我明白髮生了什麼。 – user459723 2010-09-27 17:23:27

+0

@ user459723:這是怎麼回事? – 2010-09-27 20:18:46

+1

完美的作品,謝謝! – user459723 2010-09-28 09:45:58