2017-04-18 69 views
0

我試圖通過使用define作爲函數來改進我的Makefile,但是我在定義中使用Make函數時遇到了一些問題。讓我告訴你一個演示Makefile:在定義參數上應用文本轉換函數

OBJ=obj/main.o \ 
    obj/prompt.o 

define buildMessage 
    src="$(patsubst $(OBJ_PREFIX)/%.o,%.c,$(1))"; \ 
    obj="$(patsubst $(OBJ_PREFIX)/%.o,%.o,$(1))"; \ 
    echo "$$src => $$obj" 
endef 

$(OBJ): 
    $(call buildMessage, "[email protected]") 
    $(CC) -o [email protected] -c $(patsubst $(OBJ_PREFIX)/%.o, $(SRC_PREFIX)/%.c, [email protected]) $(CFLAGS) 

所以,是的,我希望定義打印花哨的風格構建步驟,但似乎patsubst沒有應用在定義。它會輸出

obj/main.o => obj/main.o 
obj/prompt.o => obj/prompt.o 

這就好像是如果patsubst被處理,但沒有改變也沒有匹配任何東西。有什麼建議麼?

謝謝您的時間

亞歷

+0

不應該'SRC =''有SRC_PREFIX',而不是'OBJ_PREFIX'? –

+0

無論如何,我沒有包含SRCs的var。此外,這不是真正的帖子問題:問題更多地是關於爲什麼patsubst不是它的工作 –

+0

只是一個註釋:,這不_simplify_ makefile。你最終會發現,如果你在makefile中使用大量的宏,它們將更難閱讀,並且你將是唯一能夠支持它的人 - 從這裏的經驗來講。有時他們是有用的,但我已經學會了避免它們,除非它們提供了真正的好處。就你而言,你可以通過[靜態模式規則](https://www.gnu.org/software/make/manual/make.html#Static-Pattern)更好地實現你的目標。 – blackghost

回答

2

我假設,雖然你沒有表現出來的OBJ_PREFIXobj

Make不關心報價。當你寫:

$(call buildMessage, "[email protected]") 

$1值將是,從字面上看,"obj/main.o"包括引號。該字符串與模式obj/%.o不匹配,因此該模式不適用,使原始字符串保持不變。

你應該這樣寫:

$(call buildMessage,[email protected]) 
+0

哈哈,太棒了,它工作!非常感謝 –