2013-04-26 58 views
0

我使用make來執行一系列的處理步驟。每一步都取決於前一個的成功。一旦完成了一個步驟,我就會將具有該步驟名稱的文件觸摸到一個單獨的目錄中。Makefile執行一系列步驟

下面是一個例子來解釋這個概念:

VPATH=steps 

step1: 
     @echo "do some actions with [email protected]" 
     @touch $(VAPTH)/[email protected] 

step2: step1 
     @echo "do some actions with [email protected]" 
     @touch $(VPATH)/[email protected] 

step3: step2 
     @echo "do some actions with [email protected]" 
     @touch $(VPATH)/[email protected] 

它基本的工作原理,但有一個弱點:它檢查無論是在目標「」並在VPATH中。如果在工作目錄「。」中錯誤地觸摸./step1。讓人感到困惑。我想知道如果我能避免在檢查目標/先決條件任何含糊之處,但我想用

make step3 

,而不是

make steps/step3 

任何其他的Makefile例子得到保持歡迎同樣的目標。先謝謝您的幫助!

回答

2

makefile的一個基本規則是你不能創建與認爲它們應該是不同的目標。將名稱放在想要在[email protected]變量中構建的目標名稱中。您的規則必須用該名稱創建目標,否則將無法正常工作。在你的例子中,你正在創建一個名稱爲$(VPATH)/[email protected]的目標,它與[email protected]不一樣,所以這是不對的。

makefile的另一個規則是VPATH無法正確地用於查找派生目標。它只能用於查找源文件。

我建議您將變量名稱從VPATH更改爲STEPDIR之類的內容,以避免混淆。然後你可以寫這樣的makefile(注意這是未經測試的,可能需要調整)。查看GNU make手冊中的靜態模式規則,以瞭解我在評論部分中做了什麼:

STEPDIR := steps 
STEPS := step1 step2 step3 

# Translate from local to subdirectory 
.PHONY: $(STEPS) 
$(STEPS): %: $(STEPDIR)/% 

$(STEPDIR)/step1: 
     @... 
     @touch [email protected] 

$(STEPDIR)/step2: $(STEPDIR)/step1 
     @... 
     @touch [email protected] 

$(STEPDIR)/step1: $(STEPDIR)/step2 
     @... 
     @touch [email protected] 
+0

謝謝,這正是我一直在尋找的。 – user1222217 2013-04-26 12:05:15