2015-01-15 40 views
0

我想通過對每個中間文件進行並行處理來將從列表生成的文件處理爲摘要。 make可能適合這個。makefile,一對多對一個文件?

我們舉一個例子:給出一個url列表,下載文件,並行處理它們,並從處理後的文件中生成一個報告。

例如(無效):

all : report_file 

report_file : $(wildcard data/*.processed) 
    ... 

data/%.processed : data/%.input 
    ... # this should be processed in parallel 

data/%.input : filelist 
    download all lines of filelist to N files. 

filelist : 
    generate_list url_file > [email protected] 

我想的處理(也許下載),每個文件的並行工作要做,我不知道有多少行,將產生在文件列表中。

這不起作用,因爲運行時處理的文件不存在,所以建立報告的規則將被賦予一個空輸入。

此外,避免下載比1天更新的文件可能會有用,因此不會處理它們,因此makefile像依賴項在此處有用。

我可以從列表中生成一個特殊的生成文件,但有沒有辦法用一個生成文件來完成它?

+0

爲什麼你認爲'這不會工作,因爲運行時處理的文件不存在,所以建立報告的規則將被賦予一個空輸入。由於'report_file'依賴於* .processed',因此除非生成所有處理過的文件,否則不會執行'report_file'規則。您的上面的代碼必須正常工作,除了它應該能夠並行處理,並且平行下載文件,但處理和下載不會同時發生 –

+0

不,因爲「所有處理的文件」將不會是什麼。而report_file因此取決於沒有... – makapuf

+0

並行處理和下載的所有文件可以通過make -j正常完成 – makapuf

回答

0

由於report_file的依賴關係不能被評估,直到之後所有的目標依賴信息都被解析,您需要再次刷新這些信息。做到這一點的唯一方法就是調用一個submake。

all: filelist 
    $(MAKE) $(shell cat $<) #make data/a.processed data/b.processed etc... 
    $(MAKE) report_file 

report_file : $(wildcard data/*.processed) 
    ... 

data/%.processed : data/%.input 
    ... # this should be processed in parallel 

data/%.input : 
    download all lines of filelist to N files. 

filelist : 
    generate_list url_file > [email protected] #url list 
    sed -i 's;\(.*\);\1.processed;g' [email protected] #append .processed to all urls