2014-12-05 38 views
0

我最近轉換爲GNU make use。我試圖濫用Makefile來處理所有類型的文件,因爲Makefile提供了並行和檢查點功能。這是我的問題:如何指定makefile的可選依賴關係

我有很多pdf文件,我解析爲csv。在PDF文件中的分層文件夾結構:

level1/ 
    level2_1/ 
     level3_1_1.pdf 
     level3_1_2.pdf 
    level2_2/ 
     level3_2_1.pdf 
     level3_2_2.pdf 

我有我的腳本規則:

%.csv: %.pdf 
     python parsepdf.py $< [email protected] 

但現在我想連接所有這些文件。最簡單的方法是使用一個簡單的查找腳本

cat $(find level1/ -name '*.csv') > level1/level1.csv 

不過,我想這樣做在隨後與在每個層次創造了一箇中間CSV依賴層次結構的方式。我認爲這種方法將利用make -j的並行性優勢。

level1/level2_1/level_2_1.csv : level1/level2_1/level3_1_1.csv level1/level2_1/level3_1_2.csv 
     cat $* > [email protected] 
level1/level2_2/level_2_2.csv : level1/level2_2/level3_2_1.csv level1/level2_2/level3_2_2.csv 
     cat $* > [email protected] 
level1/level1.csv : $(wildcard level1/level2_*.csv) 
     cat $* > [email protected] 

但上面的方法爲兩個問題:

  • 即使CSV文件的一個不存在,水平最高的csv文件將不會被創建。我的要求是,即使有一個文件,我應該繼續並創建一個csv級別文件。
  • 如何在層次結構中自動爲這兩個級別生成這些規則(可以只假設兩個級別)。每個級別可以有不同數量的pdf文件。

Makefile是一個很好的工具嗎?如果是的話,在makefile中指定這個目標的最Makefile's方式是什麼?

+1

make是處理一些文件編寫其他文件一個很好的工具。但是,你的問題和例子並不清楚。你需要閱讀你的問題,並問問自己'是否有人不知道它已經明白我在寫什麼'。如果你很難把自己置於這個位置,讓其他人閱讀這些,而你沒有告訴他們任何事情,你會看到他們是否理解。我敢打賭他們不會。 一旦你的問題寫得很好,我會回答它。 – 2014-12-05 11:52:09

回答

1

我會猜測你想要什麼,因爲它不是很清楚你的問題。

使用find,通配符或$(wildcard)來生成預先聲明列表是一種不好的做法。躲開它。只需明確列出它們。如果您需要自動執行此過程,則始終可以通過一些腳本爲您生成Makefile,並在必要時手動進行編輯。

然後你就可以有

define CONCATENATE_RULE               
$1: $2 Makefile                 
     cat $2 > $1                
endef                   

$(eval $(call CONCATENATE_RULE, level1/level2_1/level_2_1.csv,\ 
    level1/level2_1/level3_1_1.csv \ 
    level1/level2_1/level3_1_2.csv \ 
)) 


$(eval $(call CONCATENATE_RULE, level1/level2_2/level_2_2.csv,\ 
    level1/level2_2/level3_2_1.csv \ 
    level1/level2_2/level3_2_2.csv \ 
))