Makefile特定于目标的变量和对基础目标的多次调用“无所事事”

时间:2016-11-17 12:39:48

标签: makefile gnu-make target

我想用GNU Make做的是拥有一个基本目标,可以根据实际调用的目标稍微调整一下。为实现这一目标,我尝试使用特定于目标的变量,如下所示(最小示例):

Makefile

.PHONY: all _base_target target1 target2

all: target1 target2

target1: MYVAR="first"
target1: _base_target

target2: MYVAR="second"
target2: _base_target

_base_target:
        echo "MYVAR is $(MYVAR)"

因此,这对于使用单个目标非常有效:

$ make target1
echo "MYVAR is "first""
MYVAR is first
$ make target2
echo "MYVAR is "second""
MYVAR is second

但是,当我想要运行两个目标时(通过all或单独运行):

$ make -n all
echo "MYVAR is "first""

$ make -n target1 target2
echo "MYVAR is "first""
make: Nothing to be done for `target2'.

如何调整Makefile以使其为每个运行基本目标?即我希望make all的行为就像我make target1; make target2一样。

显然,.PHONY选项似乎不足。由于我在词汇量方面缺乏对GNU Make的熟练程度,因此使用谷歌很难找到有用的结果。

双冒号尝试

回答有关使用双冒号below的答案。

[...]
all:: target1
all:: target2
[...]

产生相同的结果。

用双冒号替换所有单冒号也会产生相同的结果。

2 个答案:

答案 0 :(得分:1)

  

如何调整Makefile以使其为每个运行基本目标?

使用常规依赖项时,不能有一个基本目标。原因是make执行配方更新目标一次,而您希望使用MYVAR的不同值多次更新目标。

答案 1 :(得分:1)

您无法在GNU make的单个实例中执行此操作。 Make只会尝试在每次调用时最多一次构建一个目标。

你可以做的是使用递归:

.PHONY: all _base_target target1 target2

all: target1 target2

target1: ; $(MAKE) _base_target 'MYVAR="first"'

target2: ; $(MAKE) _base_target 'MYVAR="second"'

_base_target:
        echo "MYVAR is $(MYVAR)"