2017-04-18 64 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

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