makefile - Make:通配符匹配完整路径?
问题描述
将 make 用于通用目的(不编译)
假设我有一组具有完整路径名的文件,并且我想对那个文件做一些事情。
something --file a/b/c/X > $< # (for example)
我制定了一个规则:
something-%:
something --file $*
它可以很好地与“something-foo”匹配,但不能捕捉到“something-a/b/c/foo”。有没有办法为后一种情况编写通配符规则?
解决方案
该手册描述了模式如何匹配:
当目标模式不包含斜杠(通常不包含)时,文件名中的目录名会在与目标前缀和后缀进行比较之前从文件名中删除。
在您调用 as 的情况下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
.
如果您的模式确实包含斜线,您可以按照自己的方式工作。为了完整起见,如果您的规则基于文件,我还将定义一个先决条件,如果它不生成真正的输出文件,则将目标声明为虚假:
$ 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
推荐阅读
- c# - 捕获控制选项卡生成的事件
- sql - postgresql - 累积。按月汇总活跃客户(去除流失)
- vbscript - 在 VBScript 和 XMLHTTP 中使用特殊字符
- pyspark - PySpark - 迭代数据框的行
- android - 如何禁用标签主机上的默认焦点突出显示?
- machine-learning - 分类编码器缺少级别
- android - Toast maketext 消息中的图像图标
- android - 如何在共享首选项中保存 Java 对象
- sql - 每 1000 行提交一次
- python - sklearn 中 learning_curve 函数中估计器参数的值应该是多少?