这是我的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.
我收到了“jobserv不可用”的警告,
sub/Makefile
只使用单线程运行(就像使用-j1
一样)。他们说我应该添加
+
,然后在make
命令之前运行一个包含+
的test2
目标。现在我没有看到警告,并且sub/Makefile
真正地并行运行。但是根据这个答案,+
符号不是用于并行运行,而是用于强制运行命令,即使使用-n
、-t
、-q
标志运行make
。但为什么+
会启用jobserv呢?当我运行不使用
+
但使用$(MAKE)
来运行sub/Makefile
的test3
目标时,它也不会给出jobserv警告(并行执行有效)。那么make
和$(MAKE)
之间有什么区别呢?我认为这只是允许将默认的make替换为用户定义的make。当我不覆盖MAKE
变量时,我看到的make
命令与我在test1
目标中看到的相同。但是为什么$(MAKE)
会启用jobserv而make
不会呢?运行
test4
目标也不会给出jobserv警告(并行工作)。请注意,我的问题不同于这个问题。它涉及到cmake,而我的问题涉及到make。还有一个相关问题,但它没有回答我的问题。