2012-09-03 106 views
1

我要定義一些類似的規則,所以我決定嘗試將它們定義一個函數內部:定義規則

COMPILED_JS_FILES=$(COMPILED_JS_FILES) $(foreach m,$(notdir $(wildcard src/$(1)/*.$(2))),$(TARGET_DIR)/$(1)/$(m)) 


$(TARGET_DIR)/$(1)/%.$(2) : src/$(1)/%.$(2) 
    $(CAT) $< > [email protected] 

endef 

$(eval $(call COMPILE_JS,modules,js)) 
$(eval $(call COMPILE_JS,modules,jsm)) 
$(eval $(call COMPILE_JS,models,js)) 
$(eval $(call COMPILE_JS,firefox,js)) 
$(eval $(call COMPILE_JS,helpers,js)) 

然而,$ <和$ @規則內部變量計算空字符串,大概是因爲它們是由運行它們的函數定義的,而不是在規則被評估之前被保存。

我很好奇這個問題的答案,但也解決了這個問題的其他合理的解決方案(除了重構目錄結構)。

回答

1

我真的想出了答案(在這種情況下,我一般不知道) - $$<[email protected]。此外,$$(CAT)將延遲$(CAT)的擴展,直到評估規則。

0

這是makefile的老問題。真的沒有一種很好的通用方法來解決它,因爲你是正確的:當你需要它們時,$<[email protected]不可用。

當我遇到這樣的問題時,我傾向於在Make外寫一個支持腳本。然而,GNU Make確實提供了.SECONDEXPANSION目標,這是一個晦澀的黑客,旨在使像你這樣的任務可以完成。您可以調查一下,但我自己的經驗是.SECONDEXPANSION並不總是一個乾淨的解決方案。

+0

我挖掘.SECONDEXPANSION目標 - 你知道我發現的解決方案(double-$)是否適用於不同的make實現,或者它碰巧在我正在使用的解決方案中工作? – Daniel

+0

不幸的是,我十多年來一直沒有使用非GNU製造。我不知道,但你的解決方案看起來很合理。 – thb