2015-01-08 56 views
1

我正在學習make的過程中,並且陷入是否有可能在prereq列表中使用目標函數。假設我有以下幾種...使先決條件中的功能

FILES = folder1/file folder2/file folder3/file 

$(FILES) : code/my_script.bash $(subst folder,dir,[email protected]) 
    bash code/my_script.bash $(subst folder,dir,[email protected]) 

在這種情況下,即使folder1/file不存在,my_script.bash也會運行。我預計它會執行另一個規則來首先構建這個目標。當我用echo $^替換bash行時,輸出的全部是code/myscript.bash。它似乎沒有在[email protected]上做替換來構建prereq。我現在看到,我可以通過在目標和prereq中使用%來獲得期望的目標,但可以在prereqs中使用函數嗎?

+0

您可以使用函數,但不能*使用目標特定變量(如'$ @')而不使用輔助擴展。 –

+0

所以'$$(subst文件夾,目錄,$ @)'應該作爲一個prereq? –

+0

您是否希望每個輸出文件都依賴* all *輸入文件?或一對一映射? –

回答

1

要使用依賴於規則目標的函數,您需要啓用二次展開。要啓用輔助擴展功能,您需要使用.SECONDEXPANSION:,而且您的$必須在depdnencies中加倍。所以:

FILES = folder1/file folder2/file folder3/file 

all: $(FILES) 

.SECONDEXPANSION: 
$(FILES): code/my_script.bash $$(subst folder,dir,[email protected]) 
    bash code/my_script.bash $(subst folder,dir,[email protected]) 

什麼$的倍增的確是防止代碼在第一膨脹過程中被評估。

如果您在先決條件中使用的函數不依賴於僅在評估規則時存在的變量(如[email protected]),則不需要二次展開。

0
FILES = folder1/file folder2/file folder3/file  

$(FILES) : code/my_script.bash $$(subst folder,dir,[email protected]) 
    bash code/my_script.bash $(subst folder,dir,[email protected]) 
+0

請使用您問題上的編輯鏈接添加更多信息。後回答按鈕應該只用於問題的完整答案。 – JTG

+0

@JTG這是一個完整的答案(一種)。 –

+1

啊,謝謝@EtanReisner,我在隊列中看到它,並沒有注意到這些變化。仍然PDSchloss,你應該包括一個描述或解釋,以幫助他人。 – JTG