在 patsubst 中使用 % 两次

Use % twice in a patsubst

我想为每个输入词生成两个输出词,它们是连续的,并对它们应用 patsubst

我想要的非工作原型:

$(patsubst %.o,%.a.o %.so.o,$(OBJ))

% 的第二个出现没有被替换,而是出现一个普通的 %

未给出所需顺序的工作版本:

$(patsubst %.o,%.a.o,$(OBJ)) $(patsubst %.o,%.so.o,$(OBJ))

示例:

输入:

foo.o bar.o

期望的输出:

foo.a.o foo.so.o bar.a.o bar.so.o

如何获得所需的输出?

两个嵌套的 foreach 循环可以解决您的问题。一个用于文件,另一个用于扩展名。下面的代码应该可以解决您的问题。

OBJS = foo.o bar.o
EXTS = a.o so.o

OUT  = $(foreach file, ${OBJS}, \
         $(foreach ext, ${EXTS}, \
           $(patsubst %.o, %.${ext}, ${file})))

join make 函数接受两个单词列表并将它们逐字连接起来。不完全是你想要的,因为 foo.a.ofoo.so.o 之间没有 space,但离它不远。

假设您确定某些字符串永远不会成为您的文件名的一部分(例如 !!!),您可以组合替换引用(或等效的 patsubst)、joinsubst:

$(subst !!!, ,$(join $(OBJ:o=a.o!!!),$(OBJ:o=so.o)))

或者,更简单,如果您确定 .a.o 不能成为文件基本名称的一部分:

$(subst .a.o,.a.o ,$(join $(OBJ:o=a.o),$(OBJ:o=so.o)))