是否可以将 GNU make jobserver 环境"pass-through"到通过第三方(非 make)提供的子组件



当使用-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是我传递给原始制造商的参数。

相关内容

  • 没有找到相关文章

最新更新