Bash Makefile:对define参数应用文本转换函数

Bash Makefile:对define参数应用文本转换函数,bash,makefile,gnu-make,Bash,Makefile,Gnu Make,我试图通过使用define作为函数来改进我的Makefile,但是我在defines中使用Make函数时遇到了一个小问题。让我给你看一个演示 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 =>

我试图通过使用
define
作为函数来改进我的Makefile,但是我在defines中使用Make函数时遇到了一个小问题。让我给你看一个演示

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, "$@")
    $(CC) -o $@ -c $(patsubst $(OBJ_PREFIX)/%.o, $(SRC_PREFIX)/%.c, $@) $(CFLAGS)
因此,是的,我希望define以奇特的风格打印构建步骤,但似乎define中没有应用
patsubst
。它将输出

obj/main.o => obj/main.o
obj/prompt.o => obj/prompt.o
这与处理patsubst完全相同,但没有更改或匹配任何内容。有什么建议吗

谢谢你抽出时间


Alex

我假设,尽管您没有显示它,
OBJ_PREFIX
的值是
OBJ

Make不在乎引用。当你写作时:

$(call buildMessage, "$@")
$1
的值实际上是“obj/main.o”,包括引号。该字符串与模式
obj/%.o不匹配,因此该模式不适用,原始字符串保持不变

你应该这样写:

$(call buildMessage,$@)

我假设,尽管您没有显示它,
OBJ_PREFIX
的值是
OBJ

Make不在乎引用。当你写作时:

$(call buildMessage, "$@")
$1
的值实际上是“obj/main.o”
,包括引号。该字符串与模式
obj/%.o不匹配,因此该模式不适用,原始字符串保持不变

你应该这样写:

$(call buildMessage,$@)

src=
不应该有
src\u前缀
而不是
OBJ\u前缀
?不管怎样,我没有包含src的var。此外,这并不是这篇文章的真正问题:问题更多的是为什么patsubst没有完成它的工作。注意:这并没有简化生成文件。您最终会发现,如果在makefiles中使用大量宏,它们将更难阅读,并且您将是唯一能够支持它的人——从这里的经验来看。有时它们是有用的,但我学会了避免它们,除非它们提供了真正的好处。在您的情况下,您可以使用一个更好的方法来实现您的目标。您是在谈论
定义构建消息
?因为如果是这种情况,我看不出如何使用静态规则以及它的好处是什么。不应该使用
src=
而不是
OBJ\u前缀
?不管怎样,我没有包含src的var。此外,这并不是这篇文章的真正问题:问题更多的是为什么patsubst没有完成它的工作。注意:这并没有简化生成文件。您最终会发现,如果在makefiles中使用大量宏,它们将更难阅读,并且您将是唯一能够支持它的人——从这里的经验来看。有时它们是有用的,但我学会了避免它们,除非它们提供了真正的好处。在您的情况下,您可以使用一个更好的方法来实现您的目标。您是在谈论
定义构建消息
?因为如果是这样的话,我看不出如何使用静态规则以及它的好处是什么。