我正在尝试将“ sub-make”命令发送到子目录。我有一个带有“ top_level” makefile的父目录和一个带有自己的Makefile的子目录。
我的父Makefile的目标行如下:
target%:
make -C sub_dir $(patsubst target-%,%,$@)
我可以在父文件夹中做
使目标清洁&&使目标全部
它将被解释为:
使-C sub_dir清洁&&使-C sub_dir全部
我希望能够做到:
设定目标
但是在这种情况下,我得到了:
make -C sub_dir target.o
我期望虽然“ 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]:“ subtarget”是最新的。
make [1]:离开目录'/ home / aurelien / Documents / Projects / parent / sub_dir'
cc target.o -o target
抄送:target.o:没有这样的文件或目录
抄送:没有输入文件
制作:*** [目标]错误1
答案 0 :(得分:1)
target%
模式匹配,但%
仅匹配至少一个字符,不为零。从GNU make手册:
模式规则在其中包含字符“%”(恰好是其中的一个) 目标;否则,它看起来就像一条普通规则。目标 是用于匹配文件名的模式; “%”与任何非空匹配 子字符串,而其他字符仅与它们自己匹配。
因此target
不匹配,make使用其隐式规则来构建target
:先构建target.o
,然后再从target
进行target.o
。当尝试找到一种构建target.o
的方法时,模式规则将与配方匹配:
make -C sub_dir $(patsubst target-%,%,$@)
被展开。但是由于target.o
与target-%
不匹配,patsubst
什么也不做,您的食谱将变成:
make -C sub_dir target.o
答案 1 :(得分:0)
问题是模式必须匹配一个或多个字符。因此,这种模式:
target%:
与目标名称target
不匹配,因为没有剩余的字符可以与模式匹配。
因此,make
寻找另一个可用于构建target
的隐式规则,并找到内置规则:
% : %.o
因此它尝试构建target.o
。 此目标将与模式target%
与茎.o
匹配,因此它尝试使用您的规则来构建它。
要专门回答您的问题,任何与patsubst
中的替换模式不匹配的单词都将通过而不会更改。