为什么运行普通make命令时作业服务器不可用?

问题描述 投票:0回答:1

这是我的Makefile:

.PHONY: test%

test1:
    # jobserver is UNavailable
    make -C sub

test2:
    # jobserver is available, ok
    +make -C sub

test3:
    # jobserver is available, ok
    $(MAKE) -C sub

test4:
    # jobserver is available, ok
    +$(MAKE) -C sub

sub是包含另一个Makefile(子make)的子目录。

当我运行test1规则时:

$ make -j8 test1
make -C sub
make[1]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.

我警告作业服务器不可用,并且sub/Makefile确实在单线程中运行(就像-j1一样。

他们说我应该添加+,因此我在test2命令之前运行了一个包含+make目标。现在我看不到警告,并且sub/Makefile实际上是并行运行的。但是根据this answer,即使+make-n-t标志一起运行,-q符号也不用于并行运行,而是用于强制运行命令。但是为什么+启用作业服务器?

当我运行不使用test3但使用+来运行$(MAKE)sub/Makefile目标时,它也不会发出作业服务器警告(并行执行有效)。那么make$(MAKE)有什么区别?我认为这仅仅是为了允许用用户定义的make替换默认的make。当我不覆盖MAKE变量时,会看到与在make目标中看到的相同的test1命令。但是,为什么$(MAKE)启用Jobserver而make却没有启用?

正在运行test4目标也不会向作业服务器发出警告(并行运行)。>>

[请注意,我的问题与this one不同。关于cmake

,我的问题是关于make。也有related question,但它不能回答我的问题。

[这里是我的Makefile:.PHONY:test%test1:#作业服务器不可用make -C sub test2:#作业服务器可用,确定+ make -C sub test3:#作业服务器可用,确定$(MAKE)...

makefile
1个回答
0
投票

GNU make manual对这个错误有不错的解释。关键是:除非确定被调用的进程也是“ make”,否则“ make”将不会传递有关作业服务器的信息。

© www.soinside.com 2019 - 2024. All rights reserved.