在 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.o
和 foo.so.o
之间没有 space,但离它不远。
假设您确定某些字符串永远不会成为您的文件名的一部分(例如 !!!
),您可以组合替换引用(或等效的 patsubst
)、join
和 subst
:
$(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)))
我想为每个输入词生成两个输出词,它们是连续的,并对它们应用 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.o
和 foo.so.o
之间没有 space,但离它不远。
假设您确定某些字符串永远不会成为您的文件名的一部分(例如 !!!
),您可以组合替换引用(或等效的 patsubst
)、join
和 subst
:
$(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)))