You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义仅在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:38:16