首页 > 解决方案 > (Makefile) 同一行上的多个字符串替换

问题描述

我有工作 makefile 代码,它首先找到文件u夹中的所有文件,然后删除./u/并最后替换.cto的后扩展名.o。有没有办法让它变成一个或两个衬里?我觉得这段代码看起来很乱,可以改进。

UTILS=$(wildcard ./u/*.c)
TEMP=$(UTILS:./u/%=%)
OBJ=$(TEMP:.c=.o)

标签: makefilegnu-makegnu

解决方案


你不能嵌套$(var:x=y)样式替换,但你可以嵌套等效的patsubst函数调用,所以你可以这样写:

OBJ=$(patsubst %.c, %.o, $(patsubst ./u/%,%,$(wildcard ./u/*.c)))

您可以简化为:

OBJ=$(patsubst ./u/%.c,%.o,$(wildcard ./u/*.c))

但是考虑到这种简化,您可以对原始版本执行相同的操作:

UTILS=$(wildcard ./u/*.c)
OBJ=$(UTILS:./u/%.c=%.o)

这可能更容易阅读。


推荐阅读