【问题标题】:Is it possible to apply different compilation jobs to a different targets into a Makefile in order to use distcc是否可以将不同的编译作业应用于 Makefile 中的不同目标以使用 distcc
【发布时间】:2021-11-25 14:46:26
【问题描述】:

我有一个包含多个目标的 Makefile。其中之一就是自动生成 cpp 代码。第二个指定编译那些生成的cpp。

我已经配置了一个分布式编译集群,我只想指定一些作业用于编译 cpp 文件本身。生成部分的另一个不同数量的工作。

有可能吗?

这个想法是使用“make -j30”通过 distcc 将构建分发到几个可用的主机,但是专用于生成定义到 Makefile 中的代码的目标不能拆分为 30 个作业,因为这个目标只会在本地处理。并且本地主机没有 30 个核心来处理它们,所以机器冻结了。这就是我需要为生成阶段定义作业数量和为编译阶段定义另一数量的作业的原因。

【问题讨论】:

  • 我猜你指的是 GNU make。您很可能已经安装了gmake 的完整文档,并且您可以直接从马口中阅读gmake-j 选项可以做什么或不能做什么。该文档中是否有您不清楚的部分?您是否已经阅读过文档,得出结论认为使用gmake 的内置功能无法实现此类功能,或者您不知道该文档的存在?
  • 视情况而定,如果不查看 Makefile 的相关部分,很难给您正确的建议。如果您知道您的 Makefile 将仅使用一个活动的 make 作业运行,您可以将生成的作业数编码到构建规则中。但是,如果有人使用 -j 选项调用您的 Makefile(并且 make itself 运行多个作业),这可能会变得很棘手。为什么你觉得首先需要使用不同的工作计数?
  • 为什么要拆分?编译目标可能取决于生成的源代码,而生成的源代码目标取决于它用于生成源代码的任何内容。只需描述所有依赖项并按照@SamVarshavchik 的建议使用-j。我在我的“主要”Makefile 之一的顶部有MAKEFLAGS += -j$(shell nproc) -Orecurse,然后将$(MAKE) -C $@ 向下放入$(SUBDIRS) 目标描述的子目录中。
  • 我无法在此处显示用于机密协议的 Makefile 的内容。在不同目标之间拆分作业的原因是由于生成代码的阶段不能由 distcc 分发,但 cpp 代码的编译阶段可以。我阅读了文档,但我不知道如何清楚地做到这一点。也许我错过了什么。
  • 您想使用distcc 分发构建是一个重要的细节,它会影响您将满足您的需求的答案类型。您应该编辑问题以描述您如何使用distcc 或您想如何使用它。与此同时,我已经为你标记了它。

标签: c++ makefile distcc


【解决方案1】:

这个想法是使用“make -j30”通过distcc将构建分发到几个可用的主机,但是专用于生成代码的目标......将在本地处理。并且 localhost 没有 30 个内核来处理它们,所以机器卡住了

手动设置不同的并发作业数量静态限制的替代方法是让 GNU Make 根据系统负载动态限制作业。请参阅-l--max-load 选项documented here

这应该可以防止本地代码生成作业使系统过载,同时允许全部数量的 distcc 作业并行运行(假设它们对本地系统负载没有太大影响 - 它们不应该影响运行队列他们被阻止等待来自远程构建的输入)。

$ make -j30 -l5 ...

您必须为您的系统选择一个合适的负载值,而我对此无能为力。尝试在构建期间运行 top 并观察平均负载部分。

【讨论】:

  • 这似乎是我需要的解决方案。我要做一些测试。非常感谢。
猜你喜欢
  • 2013-10-13
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多