Makefile规则中‘%:’的含义及为何不用$@的技术咨询
Makefile 静态模式规则与自动变量疑问解答
文件结构
. ├── dira │ └── Makefile ├── dirb │ └── Makefile └── Makefile
根目录 Makefile
subdir := $(sort $(subdir) dira dirb) # $(info $(subdir)) $(subdir): %: @echo $* @make -s -C $* run all: $(subdir) .PHONY: $(subdir) all
dira/Makefile
run: @echo "a"
dirb/Makefile
run: @echo "b"
1. $(subdir): %: 中 %: 的含义
这是Makefile静态模式规则的简化写法。静态模式规则的完整格式是:
<目标列表>: <目标模式>: <依赖列表> <命令>
这里$(subdir)是目标列表(即dira dirb),%:是省略了依赖列表的目标模式写法——表示为目标列表里的每个条目,匹配%对应的内容。
具体来说,%会逐个匹配目标列表中的元素:对dira,%匹配dira;对dirb,%匹配dirb。这种写法的核心作用是批量生成规则,避免为每个子目录单独编写重复的规则代码。
2. 伪目标下为何用$*而非$@?
先明确两个自动变量的定义:
$@:代表当前规则的完整目标名$*:代表目标模式中%匹配到的部分
在当前场景下,$@和$*的输出结果完全一致(都是dira或dirb),选择$*是出于以下原因:
- 语义贴合:这个规则是基于
%模式批量生成的,用$*能明确体现“取值来自模式匹配”,而非直接引用目标本身,让代码意图更清晰。 - 扩展性:如果未来修改目标模式(比如改成
dir%),$*会自动适配为a或b,而$@仍会输出完整目标名dira/dirb,此时两者的功能差异就会显现。当前场景下功能等价,但$*更符合静态模式规则的设计逻辑。
内容的提问来源于stack exchange,提问作者Einsam
相关产品推荐
相关产品推荐

