Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile目标特定变量和对基本目标的多次调用;无事可做”;_Makefile_Gnu Make_Target - Fatal编程技术网

Makefile目标特定变量和对基本目标的多次调用;无事可做”;

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

我想用GNUMake做的是有一个单一的基本目标,可以根据实际调用的目标进行轻微的更改。为了实现这一点,我尝试使用特定于目标的变量,如下所示(最简单的示例):

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)"