是否可以 "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的参数。
当 运行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的参数。