首页 > 解决方案 > Make:通配符匹配完整路径?

问题描述

将 make 用于通用目的(不编译)

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

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

我制定了一个规则:

something-%:
    something --file $*

它可以很好地与“something-foo”匹配,但不能捕捉到“something-a/b/c/foo”。有没有办法为后一种情况编写通配符规则?

标签: makefilegnu-make

解决方案


该手册描述了模式如何匹配

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

在您调用 as 的情况下make something-a/b/c/foosomething-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.

如果您的模式确实包含斜线,您可以按照自己的方式工作。为了完整起见,如果您的规则基于文件,我还将定义一个先决条件,如果它不生成真正的输出文件,则将目标声明为虚假:

$ 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

推荐阅读