gpt4 book ai didi

makefile - 警告 : jobserver unavailable: using -j1. 将 '+' 添加到父规则

转载 作者:行者123 更新时间:2023-12-04 04:32:01 25 4
gpt4 key购买 nike

这是我的 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.

我收到 jobserver 不可用的警告和 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)启用作业服务器和 make才不是?

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

请注意我的问题不同于 this one .这是关于cmake的,我的问题是关于make的。还有 related question ,但它没有回答我的问题。

最佳答案

GNU make 手册很不错 explanation对于这个错误。关键是:'make' 不会将有关 jobserver 的信息传递给被调用的进程,除非确定被调用的进程也是 'make'。

‘warning: jobserver unavailable: using -j1. Add `+' to parent make rule.’

In order for make processes to communicate, the parent will pass information to the child. Since this could result in problems if the child process isn’t actually a make, the parent will only do this if it thinks the child is a make. The parent uses the normal algorithms to determine this (see How the MAKE Variable Works). If the makefile is constructed such that the parent doesn’t know the child is a make process, then the child will receive only part of the information necessary. In this case, the child will generate this warning message and proceed with its build in a sequential manner.



栏目 How the MAKE Variable Works错误描述中引用的指定两种方式告诉'make'被调用的进程是'make'的另一个实例:使用 $(MAKE)+ .
它指出:
  • 应该使用 $(MAKE)在配方中调用 'make' 时的变量。

    Recursive make commands should always use the variable MAKE, not the explicit command name ‘make’, as shown here:

    subsystem:
    cd subdir && $(MAKE)
  • 使用 $(MAKE)并放置一个 +在配方中调用'make'的行之前具有相同的效果。

    Using the MAKE variable has the same effect as using a ‘+’ character at the beginning of the recipe line.

  • 魔法只有在你明确输入 MAKE 时才会发生在食谱中。如果不是这种情况,请使用 + .

    This special feature is only enabled if the MAKE variable appears directly in the recipe: it does not apply if the MAKE variable is referenced through expansion of another variable. In the latter case you must use the ‘+’ token to get these special effects.

  • 关于makefile - 警告 : jobserver unavailable: using -j1. 将 '+' 添加到父规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60702726/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com