Makefile:总是 运行 规则的先决条件?

Makefile: always run prerequisite for a rule?

我想知道是否有办法让 make 总是 运行 一些规则先于另一条规则,如果它是先决条件的话。

例如:


setup:
    @echo "Setup"
    
rule1: setup
    @echo "Rule 1"

rule2: setup
    @echo "Rule 2"

运行 用上面的 Makefile 编译,输出:

Setup
Rule 1
Rule 2

但我也希望在规则 2 之前设置 运行。 With 会产生这样的输出:

Setup
Rule 1
Setup
Rule 2

在命令列表中调用 make setup 是我唯一的选择吗?

每次调用 make 不可能多次构建目标。

如果你有一个“序言”,你想在每个规则之前 运行 然后你可以把它放入一个变量并将变量添加到每个配方中:

SETUP = @echo "Setup"

rule1:
        $(SETUP)
        @echo "Rule 1"

rule2:
        $(SETUP)
        @echo "Rule 2"

一个pattern rule和GNU make secondary expansion可以提供一个近似值。由于您不能多次构建相同的目标,因此我们的想法是拥有与 ruleN 目标一样多的 setup-ruleN 目标,并对所有 setup-ruleN 使用相同的 setup-% 模式规则]:

$ cat Makefile
.PHONY: all
all: rule1 rule2

setup-%:
    @echo "Setup"
    
.SECONDEXPANSION:

rule1: setup-$$@
    @echo "Rule 1"

rule2: setup-$$@
    @echo "Rule 2"

$ make
Setup
Rule 1
Setup
Rule 2

奖励:$* 自动变量可以用在 setup-% 配方中,如果您想对其进行个性化设置:

$ cat Makefile
.PHONY: all
all: rule1 rule2

setup-%:
    @echo "Setup ($*)"
    
.SECONDEXPANSION:

rule1: setup-$$@
    @echo "Rule 1"

rule2: setup-$$@
    @echo "Rule 2"

$ make
Setup (rule1)
Rule 1
Setup (rule2)
Rule 2