在具有多个目标的Makefile中,如何防止未使用的目标的前提条件扩展?请参见以下示例:
thisexpands = $(warning Expanded!)
.PHONY: target1
target1: $(thisexpands)
@echo Target 1
.PHONY: target2
target2:
@echo Target 2
调用target2
会强制thisexpands
扩展,即使它被懒惰地求值并且从未使用过它和target1
。
在我的现实世界中,调用thisexpands
时扩展target1
是一个问题,因为这是一个shell命令,当在target1及其父目标的上下文之外调用时会打印错误。
答案 0 :(得分:2)
Makefiles在运行第一个规则之前已完全解析。作为解析的一部分,必须扩展所有目标和前提条件。您可以在GNU make手册的How make Reads a Makefile中找到有关makefile的不同部分何时扩展的详细信息。
一种方法是使用递归:
thisexpands = $(warning Expanded!)
target1: ; $(MAKE) target1-recurse T1_DEPS='$(value thisexpands)'
T1_DEPS =
target1-recurse: $(T1_DEPS)
@echo Target 1
这不起作用:
您可以使用secondary expansion来推迟扩展,如下所示:
.SECONDEXPANSION:
target1: $$(thisexpands)
请务必小心,以免转义先决条件列表。
答案 1 :(得分:1)
无法完全取消扩展。但是,您可以基于$(MAKECMDGOALS)
的值使用条件分配:
thisexpands = $(if $(filter target1,$(MAKECMDGOALS)),$(warning Expanded!))
.PHONY: target1
target1: $(thisexpands)
@echo Target 1
.PHONY: target2
target2:
@echo Target 2
请注意,如果target1
仅显式构建(make target1
而不是默认构建,或作为构建另一个目标的一部分,则可以使用。