未找到模式时patsubst的返回值

时间:2018-07-05 12:24:00

标签: makefile

我正在尝试将“ 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

2 个答案:

答案 0 :(得分:1)

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

  

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

因此target不匹配,make使用其隐式规则来构建target:先构建target.o,然后再从target进行target.o。当尝试找到一种构建target.o的方法时,模式规则将与配方匹配:

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

被展开。但是由于target.otarget-%不匹配,patsubst什么也不做,您的食谱将变成:

make -C sub_dir target.o

答案 1 :(得分:0)

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

target%:

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

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

% : %.o

因此它尝试构建target.o目标与模式target%与茎.o匹配,因此它尝试使用您的规则来构建它。

要专门回答您的问题,任何与patsubst中的替换模式不匹配的单词都将通过而不会更改。