我正在尝试将"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.o
target
。当试图找到一种构建target.o
的方法时,模式规则匹配和配方:
make -C sub_dir $(patsubst target-%,%,$@)
展开。但是由于target.o
与target-%
不匹配,patsubst
什么都不做,你的食谱变成了:
make -C sub_dir target.o
问题是模式必须与一个或多个字符匹配。 所以,这个模式:
target%:
与目标名称不匹配target
,因为没有剩余的字符来匹配模式。
因此,make
寻找另一个可用于构建target
的隐式规则,并找到内置规则:
% : %.o
所以它试图建立target.o
.此目标将与模式target%
匹配,.o
词干,因此它会尝试使用您的规则来构建它。
为了具体回答您的问题,任何与patsubst
中的替换模式不匹配的单词都将在不更改的情况下传递。