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

Makefile依赖项中%通配符是否生效?两种写法未触发对应规则问题咨询

问题原因

  1. 第二种写法存在语法错误:自动变量$*仅可在规则的命令部分使用,定义依赖列表时$*还未完成赋值,展开后为空值,导致%.ABC没有有效依赖,不会触发%.nextFrag规则执行。
  2. 第一种写法符合基础语法,但未匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:39:01