【发布时间】:2021-11-07 14:01:43
【问题描述】:
我有工作的makefile代码,它首先找到u文件夹中的所有文件,然后删除./u/,最后将.c的后扩展名替换为.o。有没有办法让它变成一个或两个衬里?我觉得这段代码看起来很乱,有待改进。
UTILS=$(wildcard ./u/*.c)
TEMP=$(UTILS:./u/%=%)
OBJ=$(TEMP:.c=.o)
【问题讨论】:
我有工作的makefile代码,它首先找到u文件夹中的所有文件,然后删除./u/,最后将.c的后扩展名替换为.o。有没有办法让它变成一个或两个衬里?我觉得这段代码看起来很乱,有待改进。
UTILS=$(wildcard ./u/*.c)
TEMP=$(UTILS:./u/%=%)
OBJ=$(TEMP:.c=.o)
【问题讨论】:
您不能嵌套 $(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)
这可能更容易阅读。
【讨论】: