是否可以 "pass-through" GNU make jobserver 环境到通过第 3 方(非 make)服务的 submake

Is it possible to "pass-through" GNU make jobserver environment to a submake served via a 3rd-party (non-make)

当 运行ning gnu-make 规则与 -jN make 创建一个 jobserver 用于跨子 make 管理作业计数。此外,您可以通过在制作食谱前加上 + 来 "pass the jobserver environment" - 例如:

target :
        +./some/complex/call/to/another/make target

现在我有一个 (python) 脚本,而不是子 make,其中 运行 一些复杂的打包操作(对于 make 来说太复杂了)。它可以 运行 执行的其中一项操作实际上可以产生 make 命令。

package.stamp : $(DEPS)
         +./packaging.py $(ARGS)
         touch $@

现在当在 packaging.py 中调用 make 命令时

make[1]: warning: jobserver unavailable: using -j1.  Add `+' to parent make rule.

这是有道理的,因为无论由 make 设置什么环境,都可能不会被 python 接受或通过。

是否可以通过 python 程序将 jobserver 引用传递给子 make - 如果可以,怎么做?

jobserver 有两个方面必须保留:第一个是实际的环境变量,make 用于向子 make 发送选项。该值已正确保存,否则 make 甚至不知道它应该查找作业服务器,您也不会看到该警告消息。

第二个方面是两个打开的文件描述符,它们被传递给 make 的子级。您的脚本必须保留这两个描述符,并在调用子 make 时将它们保持打开状态。

你没有告诉我们什么 Python 代码被用来调用 sub-make。默认情况下,subprocess 模块不会关闭文件描述符,但您可以提供 close_fds=True 选项让它这样做...您应该 使用它如果您希望并行 make 调用与作业服务器一起正常工作,请选择此选项。

如果您不使用 subprocess,那么您必须向我们展示您正在做什么。

您可能应该用 python 标记来标记它,因为它主要是一个 Python 问题。

为了总结和澄清答案 - 为了让工作服务器在您的子流程中工作,您需要保留:

  • 环境变量
  • jobserver fds

传递的其中一个环境变量(对我而言)如下所示:

MAKEFLAGS= --jobserver-fds=3,4 -j -- NAME=VALUE

jobserver-fds communicate which fds make 已经打开与jobserver通信。为了使 submake 能够使用作业服务器,您应该保留或安排这些特定的 fd 可用(或者适当地重新编写环境变量以将它们指向它们最终所在的 fd)。

NAME=VALUE是我传给原make的参数。