如何在Makefile中使用%过滤器触发其他目标执行?
解决Makefile通配符目标触发对应子目标的问题
问题场景
你想通过%-all这种带通配符的目标,自动触发1-check、2-check这类对应目标的执行,但直接在%-all里写$*会失效——因为Make会把它当成shell命令执行,而不是去构建Makefile里定义的目标。
正确实现方式
方式一:通过$(MAKE)调用自身构建目标
修改你的Makefile如下:
1-check: echo "1" 2-check: echo "2" run-check: $(MAKE) 1-check-all 2-check-all %-all: $(MAKE) $*
$(MAKE)是Make的内置变量,指向当前使用的Make工具,用它调用自身能保证跨平台正常工作。- 执行
make run-check时,会先触发1-check-all和2-check-all,这两个目标又会通过$(MAKE) $*分别调用make 1-check和make 2-check,最终输出1和2。 - 如果不想看到Make打印执行的命令,可以在命令前加
@,比如@$(MAKE) $*。
方式二:利用依赖关系实现(更符合Makefile逻辑)
另一种更推荐的写法是把对应目标设为%-all的依赖,这样Make会自动先构建依赖目标:
1-check: echo "1" 2-check: echo "2" run-check: 1-check-all 2-check-all %-all: $* # 这里如果不需要额外操作,留空即可
这种写法下,构建1-check-all时,Make会先检查并构建它的依赖1-check,自动完成你想要的触发效果,逻辑更清晰。
内容的提问来源于stack exchange,提问作者IMac
相关产品推荐
相关产品推荐

