Makefile patsubst';当找不到模式时,s返回值

Makefile patsubst';当找不到模式时,s返回值,makefile,Makefile,我正在尝试将“sub make”命令发送到子目录。我有一个带有“顶级”Makefile的父目录和一个带有自己Makefile的子目录 我的父Makefile有一个目标行,如下所示: target%: make -C sub_dir $(patsubst target-%,%,$@) 我可以在父文件夹中执行以下操作: 清除目标并使目标全部清除(&A) 它将被解释为: 使-C子目录清洁&使-C子目录全部清洁 我希望能够做到: 瞄准 但在这种情况下,我得到: make-C sub_dir t

我正在尝试将“sub make”命令发送到子目录。我有一个带有“顶级”Makefile的父目录和一个带有自己Makefile的子目录

我的父Makefile有一个目标行,如下所示:

target%:
    make -C sub_dir $(patsubst target-%,%,$@)
我可以在父文件夹中执行以下操作:

清除目标并使目标全部清除(&A)

它将被解释为:

使-C子目录清洁&使-C子目录全部清洁

我希望能够做到:

瞄准

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

make-C sub_dir target.o

我希望“patsubst”找不到模式,但它将返回nothing或已测试的表达式。但它返回这个“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/aurelian/Documents/Projects/parent/sub_dir'
make[1]:“子目标”是最新的。
make[1]:离开目录“/home/aurelian/Documents/Projects/parent/sub_dir”
cc target.o-o target
cc:target.o:没有这样的文件或目录
抄送:没有输入文件
make:**[target]错误1


target%
模式匹配,但仅与
%
的至少一个字符匹配,而不是零。从GNU make手册:

模式规则中包含字符“%”(正好是其中一个) 目标;否则,它看起来就像一条普通规则。目标 是用于匹配文件名的模式;“%”与任何非空字符匹配 子字符串,而其他字符只匹配它们自己

因此
target
不匹配,make使用其隐式规则来构建
target
:构建
target.o
,然后从
target.o
构建
target
。当试图找到构建
target.o
的方法时,模式规则匹配且配方:

make -C sub_dir $(patsubst target-%,%,$@)
是扩大的。但是由于
target.o
target-%
不匹配,
patsubst
什么也不做,您的配方变成:

make -C sub_dir target.o

问题是模式必须匹配一个或多个字符。因此,这种模式:

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

因此,
make
查找另一个可用于生成
target
的隐式规则,并找到内置规则:

% : %.o
因此它尝试构建
target.o
。此目标将匹配模式
target%
,其词干为
.o
,因此它尝试使用您的规则来构建该模式

为了明确回答您的问题,任何与
patsubst
中的替换模式不匹配的单词都将被传递而不进行更改