Makefile依赖项中%通配符是否生效?两种写法未触发对应规则问题咨询
问题原因
- 第二种写法存在语法错误:自动变量
$*仅可在规则的命令部分使用,定义依赖列表时$*还未完成赋值,展开后为空值,导致%.ABC没有有效依赖,不会触发%.nextFrag规则执行。 - 第一种写法符合基础语法,但未匹配Make的规则执行逻辑:
%.nextFrag是模式规则生成的目标,在隐式规则链中会被Make判定为中间目标。默认配置下,Make不会为这类隐式中间目标执行对应构建规则,因此对应日志不会打印。
修复方案
基于第一种写法调整即可,可选以下任意一种方案:
方案1:标记.nextFrag类目标为非中间目标
添加.SECONDARY特殊目标声明,告诉Make所有后缀为.nextFrag的目标都不是可忽略的中间目标,需要正常执行构建逻辑:
.SECONDARY: %.nextFrag START : \ test.ABC echo "In Start" %.ABC : %.nextFrag echo "In ABC" %.nextFrag: echo "In nextFrag"
方案2:显式声明依赖
将test.nextFrag直接添加为顶层目标START的依赖,避免Make将其判定为隐式中间目标:
START : \ test.nextFrag \ test.ABC echo "In Start" %.ABC : %.nextFrag echo "In ABC" %.nextFrag: echo "In nextFrag"
方案3:声明伪目标(适合不需要生成实际文件的场景)
如果所有规则都只是用来执行命令,不需要生成对应名称的实体文件,可以用.PHONY声明伪目标,Make会强制按依赖顺序执行所有规则,无视本地文件状态:
.PHONY: START %.ABC %.nextFrag START : \ test.ABC echo "In Start" %.ABC : %.nextFrag echo "In ABC" %.nextFrag: echo "In nextFrag"
内容的提问来源于stack exchange,提问作者Aragon
相关产品推荐
相关产品推荐

