Make:通配符以匹配完整路径?

时间:2019-11-19 18:40:42

标签: makefile gnu-make

将make用于一般目的(不编译)

假设我有一组具有完整路径名的文件,并且我想对该文件做些事情。

something --file a/b/c/X > $< # (for example)

我已经制定了规则:

something-%:
    something --file $*

与“ something-foo”匹配的很好,但是没有捕获“ something-a / b / c / foo”。有没有一种方法可以为后一种情况编写通配符规则?

1 个答案:

答案 0 :(得分:1)

该手册介绍了how patterns match

  

当目标模式不包含斜杠(通常不包含斜杠)时,在将文件名中的目录名与目标前缀和后缀进行比较之前,会将其从文件名中删除。

在您以make something-a/b/c/foo进行调用的情况下,something-a/b/c/被视为目录并被删除,因此其余与您的规则不符。这很容易检查:

$ cat Makefile
something-%:
        echo something --file $<

f%o:
        echo $*

输出:

$ make something-OtherDirectory/src/foo -dr
GNU Make 4.2.1
...
Considering target file 'something-OtherDirectory/src/foo'.
 File 'something-OtherDirectory/src/foo' does not exist.
 Looking for an implicit rule for 'something-OtherDirectory/src/foo'.
 Trying pattern rule with stem 'o'.
 Found an implicit rule for 'something-OtherDirectory/src/foo'.
 Finished prerequisites of target file 'something-OtherDirectory/src/foo'.
Must remake target 'something-OtherDirectory/src/foo'.
echo something-OtherDirectory/src/o
...

请注意,它与o的词干匹配了另一个模式规则。

如果样式确实包含斜杠,则可以使其按自己的方式工作。为了完整起见,如果您的规则基于文件,我还将定义一个先决条件,如果目标不生成实际的输出文件,则将目标声明为phony:

$ cat Makefile
.PHONY: something/%
something/%: %
        echo something --file $<

输出:

$ make something/OtherDirectory/src/foo.c
echo something --file OtherDirectory/src/foo.c
something --file OtherDirectory/src/foo.c