如何从依赖Target内部获取依赖它的Target名称?
如何让Makefile的共享依赖知晓触发它的上层目标?
你遇到的需求很常见——让共享依赖my-dependency在执行时能识别出是哪个上层目标(比如target-a或target-b)触发了它。这里有两种实用的实现方式,我平时写Makefile时经常用到:
方法一:目标特定变量(适合少量明确目标)
直接给每个上层目标定义专属的变量,这个变量会传递到它的依赖上下文中:
.PHONY: target-a target-b # 为每个目标绑定专属的触发标识变量 target-a: TRIGGER_TARGET := target-a target-a: my-dependency @echo "正在执行 target-a" target-b: TRIGGER_TARGET := target-b target-b: my-dependency @echo "正在执行 target-b" my-dependency: @echo "依赖此目标的上层目标是: $(TRIGGER_TARGET)"
运行效果:
- 执行
make target-a,会输出:依赖此目标的上层目标是: target-a 正在执行 target-a - 执行
make target-b,会输出:依赖此目标的上层目标是: target-b 正在执行 target-b
方法二:模式规则(适合批量相似目标)
如果你的上层目标命名有规律(比如都是target-xxx格式),用模式规则能更简洁地处理,不用逐个定义变量:
.PHONY: target-a target-b # 用模式匹配所有target-开头的目标,自动绑定触发变量 target-%: TRIGGER_TARGET := $@ target-%: my-dependency @echo "正在执行 $@" my-dependency: @echo "依赖此目标的上层目标是: $(TRIGGER_TARGET)"
这里的$@是Make的自动变量,代表当前正在构建的目标名,所以不管你新增target-c还是target-d,都不用额外修改依赖部分的代码,非常灵活。
原理说明
这两种方法的核心都是利用Make的目标特定变量特性:这类变量仅在指定目标及其所有依赖的构建上下文中生效,所以当my-dependency被不同上层目标触发时,TRIGGER_TARGET会被替换成对应的上层目标名。
内容的提问来源于stack exchange,提问作者code
相关产品推荐
相关产品推荐

