gcc - 如何使用 distcc 仅远程预处理和编译所有内容?

标签 gcc build g++ distributed distcc

背景:

  • 我有一个 128 核服务器,我想将其用作构建服务器。
  • 我有一堆客户端机器,它们与不太新且功能不太强大的 PC 一起工作。 (无法升级!不在我的控制范围内。)

我做了什么:

  • 我关注了 distcc documentation .
  • 并在服务器上安装了一个虚拟机,具有完全相同的编译器版本,相同的 distcc 版本——基本上与客户端机器上相同的发行版。
  • 配置客户端和服务器后,我可以远程构建。我可以使用 distccmon-text 工具验证这一点。我可以在服务器上看到,distcc 守护进程启动了 8 个线程,它们正在等待构建作业的到来。作为第一步,这是很好的。你可以看到下面的输出来确定。

enter image description here

  • 第二步:由于客户端机器是双核机器,而服务器提供 128 核,并且并非所有客户端都会同时编译,所以我想尽可能多地将构建任务卸载到构建-服务器。

问题:

  1. 第一个问题:distcc,无论我如何尝试配置它,总是尝试在客户端和服务器上平均分配构建作业。即使我的配置文件如下所示:
# --- /etc/distcc/hosts -----------------------
# See the "Hosts Specification" section of
# "man distcc" for the format of this file.
#
# By default, just test that it works in loopback mode.
# 127.0.0.1
172.24.26.208/8,cpp,lzo
localhost/0

根据distcc documentation应该给构建服务器更高的优先级,给本地主机更低的优先级,因为它出现在列表的后面。此外,它应该为构建服务器提供 8 个作业,为本地主机提供 0 个作业。但不,那不会发生。输入 make -j8 后,它会尝试在本地主机上启动 4 个线程,在远程主机上启动 4 个线程。 不好。您可以从下图中看到这一点。

enter image description here

  1. 第二个问题:您还会注意到预处理是在本地计算机上完成的。为此,distcc 附带了一个工具。它被称为“distcc-pump”或泵模式,可以像这样使用。
time pump make CC="distcc gcc" CXX="distcc g++" -j8

不幸的是,无论泵模式与否,预处理都发生在 localhost 上,正如您从上图中看到的那样。 伤心。

注意:distcc 程序在任何时候都不会抛出任何错误或警告,使用我在此处列出的配置,无论是在服务器或客户端。

版本:

  • 海湾合作委员会 4.4.5
  • distcc 3.2rc1.2

(在有人建议 - “升级软件!”之前,更新版本对我来说很可能是不可能的。无论如何,这个版本的 distcc 提供了我需要的功能。此外,我可以升级服务器虚拟机但是客户端和服务器之间会有编译器版本不匹配。我无法升级客户端。)

欢迎就如何改进此设置/(解决问题)提出任何建议和反馈。

最佳答案

编辑:这些解决方案不起作用,我让答案避免其他人再次提出它们


尝试

关于gcc - 如何使用 distcc 仅远程预处理和编译所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55589907/

相关文章:

c - 优化了多模运算的逻辑运算?

xcode - 计划和构建预操作脚本输出?

c++: g++: extern "C"函数定义?

c++ - 如何一次获取所有重复的符号链接(symbolic link)器错误?

c++ - 与来自 time.h 的标识符 'clock' 发生冲突

c - 这是什么类型的声明?

c - 链接描述文件中 *(.data)、*(.data*) 和 *(.data.*) 之间的区别

c++ - CLion 不识别 Cygwin 编译器

.net - 如何在使用 Microsoft.Build.Evaluation (MSBuild) 构建之前执行清理

android - AOSP 构建错误 - make 失败