如何让Makefile规则匹配所有目标(含.PHONY目标)?
解决Makefile捕获所有目标(含.PHONY目标)的问题
问题原因
当你声明.PHONY: x但未为x定义任何命令时,make会判定这个伪目标已处于最新状态,不会触发任何隐含规则(包括你写的%模式规则),因此输出make: Nothing to be done for 'x'。
解决方案
方案1:为单个伪目标添加明确规则
如果伪目标数量较少,直接为每个伪目标编写规则,指定执行逻辑:
.PHONY: x __dummy__ # 设置无参数make的默认目标 .DEFAULT_GOAL := __dummy__ __dummy__: @echo No targets rule # 为伪目标x定义执行逻辑 x: @echo Default rule # 捕获所有其他未明确定义的目标 %: @echo Default rule
方案2:用FORCE目标实现通用捕获(推荐)
如果需要处理大量伪目标或不确定目标列表,通过FORCE伪目标强制所有规则重新执行,确保所有目标(含伪目标)都触发自定义逻辑:
.PHONY: x __dummy__ FORCE # 设置无参数make的默认目标 .DEFAULT_GOAL := __dummy__ __dummy__: FORCE @echo No targets rule # 捕获所有指定目标(包括伪目标和普通目标) %: FORCE @echo Processing target: $@ # 此处添加转发到其他目录Makefile的逻辑,示例: # $(MAKE) -C ../your-target-dir $@ # FORCE目标仅用于触发重新执行,无需命令 FORCE:
测试效果
- 无参数调用
make:输出No targets rule - 调用
make y:输出Processing target: y - 调用
make x:输出Processing target: x,符合预期。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

