未找到模式时的 patsubst 返回值



我正在尝试将"sub-make"命令发送到子目录。我有一个带有"top_level"生成文件的父目录和一个带有自己的生成文件的子目录。

我的父 Makefile 的目标行如下:

target%:
make -C sub_dir $(patsubst target-%,%,$@)

我可以在父文件夹中做:

使目标清洁&&使目标全部

它将被解释为:

使 -C sub_dir清洁 &&使 -C sub_dir

我希望能够做到:

制定目标

但在这种情况下,我得到:

将 -C sub_dir目标。

我期望虽然"patsubst"找不到模式,但它将返回任何内容或经过测试的表达式。但它返回这个"target.o"。

有人可以向我解释一下吗?我怎么能一无所获?

我尝试了这些表达式但没有成功:

make -C sub_dir $(patsubst target%,%,$@)
make -C sub_dir $(patsubst -%,%,$(patsubst target%,%,$@))
make -C sub_dir $($(patsubst -%,%,$(patsubst target%,%,$@)):.o=)

最后一个很棘手,它给出:

make -C sub_dir make[1]


:输入目录/home/aurelien/Documents/Projects/parent/
sub_dir'make[1]:"子目标"是最新的。
make[1]: 离开目录 '/home/aurelien/Documents/Projects/parent/sub_dir'cc
target.o -o target cc: target.o: 没有这样的文件或目录
抄送: 没有输入文件
make: *** [target
] 错误 1

target%模式匹配,但只有至少一个字符用于%,而不是零。从 GNU 制作手册:

模式规则包含字符 '%'(恰好是其中之一( 目标;否则,它看起来完全像普通规则。目标 是用于匹配文件名的模式;"%"匹配任何非空 子字符串,而其他字符仅匹配自身。

所以target不匹配,并使用其隐含的规则来构建target:构建target.o然后从target.otarget。当试图找到一种构建target.o的方法时,模式规则匹配和配方:

make -C sub_dir $(patsubst target-%,%,$@)

展开。但是由于target.otarget-%不匹配,patsubst什么都不做,你的食谱变成了:

make -C sub_dir target.o

问题是模式必须与一个或多个字符匹配。 所以,这个模式:

target%:

与目标名称不匹配target,因为没有剩余的字符来匹配模式。

因此,make寻找另一个可用于构建target的隐式规则,并找到内置规则:

% : %.o

所以它试图建立target.o.目标将与模式target%匹配,.o词干,因此它会尝试使用您的规则来构建它。

为了具体回答您的问题,任何与patsubst中的替换模式不匹配的单词都将在不更改的情况下传递。

最新更新