如何定义仅在Makefile同目录生效的GNU Make目标?
实现仅匹配根目录文件的Makefile通配符规则
我需要编写一个Makefile,让其中的%.md通配符规则仅对代码库根目录下的目标生效。当前的规则如下:
%.md: @echo "Running rule '%.md' for target '$@'." md/%: @echo "Running rule 'md/%' for target '$@'."
执行命令make ex1.md md/ex2.md unknown/ex3.md时,实际输出为:
Running rule '%.md' for target 'ex1.md'. Running rule '%.md' for target 'md/ex2.md'. Running rule '%.md' for target 'unknown/ex3.md'.
但我期望的输出是:
Running rule '%.md' for target 'ex1.md'. Running rule 'md/%' for target 'md/ex2.md'. make: *** No rule to make target 'unknown/ex3.md'. Stop.
核心需求是:%.md规则只能作用于与Makefile同目录的md文件,不能匹配其他目录下的文件。我清楚调整规则顺序可以让md/ex2.md匹配到md/%规则,但这不足以解决全部问题——我需要执行make unknown/ex3.md时直接报错,而非触发%.md规则。
补充说明
- 所有涉及的规则均为PHONY规则,不用于实际创建文件,与Makefile的原始设计初衷不同
- 所有规则无实际依赖,但可接受引入伪依赖作为临时解决方案
最优解决方案
结合调整规则顺序和**检查自动变量$(@D)**可以实现需求,具体代码如下:
md/%: @echo "Running rule 'md/%' for target '$@'." %.md: @if [ "$(@D)" != '.' ]; then echo "Rule '%.md' is only meant for files on the current dir."; exit 1; fi @echo "Running rule '%.md' for target '$@'."
执行指定命令后的输出符合预期:
$ make ex1.md md/ex2.md unknown/ex3.md Running rule '%.md' for target 'ex1.md'. Running rule 'md/%' for target 'md/ex2.md'. Rule '%.md' is only meant for files on the current dir. make: *** [Makefile:127: unknown/ex3.md] Error 1
内容的提问来源于stack exchange,提问作者jpbochi
相关产品推荐
相关产品推荐

