当使用-jN
运行gnu make规则时,make会创建一个作业服务器,用于管理子模型之间的作业计数。此外,您可以通过在make配方前添加+
来"将jobserver环境"传递给它,例如:
target :
+./some/complex/call/to/another/make target
现在我有一个(python)脚本,它运行一些复杂的打包操作(对于make来说太复杂了),而不是sub-make。它可以运行的一个操作实际上可以派生出make
命令。
package.stamp : $(DEPS)
+./packaging.py $(ARGS)
touch $@
现在,当make命令在packaging.py 中调用时
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
这是有道理的,因为无论make设置什么环境,python都可能不会尊重或通过。
是否可以通过python程序将jobserver
引用传递给子制造商?如果可以,如何传递?
jobserver有两个方面必须保留:第一个是实际的环境变量,用于将选项发送到子制造。该值被正确保存,否则make将不知道它甚至应该查找jobserver,并且您不会看到该警告消息。
第二个方面是两个打开的文件描述符,它们被传递给make的子级。脚本必须保留这两个描述符,并在调用sub-make时保持打开状态。
您没有向我们展示用于调用sub-make的Python代码。默认情况下,subprocess
模块不会关闭文件描述符,但您可以提供close_fds=True
选项来让它关闭…如果您希望并行调用能够与jobserver正常工作,则应而不是使用此选项。
如果您不使用subprocess
,那么您必须向我们展示您正在做什么。
您可能应该用python
标记,因为这主要是一个Python问题。
为了总结和澄清答案-让作业服务器在您需要保留的子流程中工作:
- 环境变量
- 作业服务器fds
其中一个传递的环境变量(对我来说)如下:
MAKEFLAGS= --jobserver-fds=3,4 -j -- NAME=VALUE
CCD_ 9通信哪个fds制作的已经打开与作业服务器通信。为了让submaker能够使用jobserver,您应该保留或安排这些特定的fd(或者适当地重写环境变量,将它们指向它们最终所在的fd)。
NAME=VALUE
是我传递给原始制造商的参数。