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