不使用目标时,如何防止目标的先决条件扩展?

时间:2019-04-01 12:40:04

标签: makefile

在具有多个目标的Makefile中,如何防止未使用的目标的前提条件扩展?请参见以下示例:

thisexpands = $(warning Expanded!)

.PHONY: target1
target1: $(thisexpands)
    @echo Target 1

.PHONY: target2
target2:
    @echo Target 2

调用target2会强制thisexpands扩展,即使它被懒惰地求值并且从未使用过它和target1

在我的现实世界中,调用thisexpands时扩展target1是一个问题,因为这是一个shell命令,当在target1及其父目标的上下文之外调用时会打印错误。

2 个答案:

答案 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而不是默认构建,或作为构建另一个目标的一部分,则可以使用。