我想用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
[...]
产生相同的结果。
用双冒号替换所有单冒号也会产生相同的结果。
答案 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)"