Makefile目标特定变量和对基本目标的多次调用;无事可做”;
我想用GNUMake做的是有一个单一的基本目标,可以根据实际调用的目标进行轻微的更改。为了实现这一点,我尝试使用特定于目标的变量,如下所示(最简单的示例):Makefile目标特定变量和对基本目标的多次调用;无事可做”;,makefile,gnu-make,target,Makefile,Gnu Make,Target,我想用GNUMake做的是有一个单一的基本目标,可以根据实际调用的目标进行轻微的更改。为了实现这一点,我尝试使用特定于目标的变量,如下所示(最简单的示例): Makefile: .PHONY: all _base_target target1 target2 all: target1 target2 target1: MYVAR="first" target1: _base_target target2: MYVAR="second" target2: _base_target _bas
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
或单独运行):
如何调整Makefile,使其为每个目标运行基本目标?也就是说,我希望makeall
表现得像我做了maketarget1一样;使target2
显然,.PHONY
选项似乎不够。由于我在词汇方面缺乏对GNU Make的熟练程度,因此使用Google很难找到有用的结果
双冒号尝试
回答关于使用双冒号的问题
产生相同的结果
用双冒号替换所有单冒号也会产生相同的结果
如何调整Makefile,使其为每个目标运行基本目标
使用常规依赖项时不能有一个基本目标。原因是make
执行配方以更新目标一次,而您希望使用不同的MYVAR
值对其进行多次更新
如何调整Makefile,使其为每个目标运行基本目标
使用常规依赖项时不能有一个基本目标。原因是
make
执行配方以更新目标一次,而您希望使用不同的MYVAR
值对其进行多次更新。您不能在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)"
您不能在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)"
文档引用听起来很有希望,但即使将示例Makefile中的所有单冒号替换为双冒号,它也不起作用。你能再详细说明一下我应该改变什么吗?文档中缺少示例。@gertvdijk如果基本目标生成一个文件,并且该文件的内容受
MYVAR
的影响,那么您需要两个不同的目标。恐怕我不明白您的说法。我已经有了各种变体的单独目标,我的问题主要是使用一个基本目标作为“模板”。@gertvdijk想得更多,恐怕双冒号规则对你没有帮助。文档引用听起来很有希望,但即使在示例Makefile中将所有单冒号替换为双冒号,它也不起作用。你能再详细说明一下我应该改变什么吗?文档中缺少示例。@gertvdijk如果基本目标生成一个文件,并且该文件的内容受MYVAR
的影响,那么您需要两个不同的目标。恐怕我不明白您的说法。我已经为这些变体设定了单独的目标,我的问题主要是使用一个基本目标作为“模板”。@gertvdijk想得更多,恐怕双冒号规则对你没有帮助。
.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)"