将make用于一般目的(不编译)
假设我有一组具有完整路径名的文件,并且我想对该文件做些事情。
something --file a/b/c/X > $< # (for example)
我已经制定了规则:
something-%:
something --file $*
与“ something-foo”匹配的很好,但是没有捕获“ something-a / b / c / foo”。有没有一种方法可以为后一种情况编写通配符规则?
答案 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