搭建distcc分布式编译环境

时间:2022-08-21 08:53:51
简介

distcc 在日常工作中常为我们使用来解决大型项目在单一工作站上编译较慢的问题。其主要用于对 C, Object C 以及 C++ 代码进行并行编译,将可以并行的编译任务分布于编译集群中的各个工作站,有效利用各机器资源,达到整体编译性能的成倍提升。
在类 Unix 系统上,distcc 使用 sendfile 系统调用在不同工作节点之间传送文件,尽管这种网络文件传输会占用一定的时间,他们对工作机的 CPU 资源占用却很小,而且这种分发任务的方式能够简化构建环境的配置,distcc 在这方面同早期的一些基于共享文件系统的分布编译环境 (dmake, pvmmake 等等 ) 相比几乎是 0 配置。
distcc 对各个编译节点的本地系统库及头文件基本没有要求,即使在不同的节点上这些组件的版本不同也不会影响到最终编译结果的正确性,实际情况是 distcc 会在本地 (client 机 ) 完成存在版本依赖的编译任务,这一点的实现原理简要说来式因为 distcc 借助了 C/C++ 编译驱动程序的以下特点:
1. cpp(C 预处理器 ) [cpp [arguments] .c 源文件输入 .i 中间文件输出 ]
2. ccl(C 编译器 ) [ccl .i 中间文件输入 .c 源文件输入 [arguments] –o .s 汇编文件输出 ]
3. as( 汇编器 ) [as [arguments] –o .o 目标文件输出 .s 汇编文件输入 ]
这个在本地做过预处理的 ASCII 源文件及其他命令行选项即可唯一确定一个目标文件,而与此任务在哪台机器上运行无关,通过分发这种任务到各个节点,即可消除对头文件的依赖。同理 distcc 通过在任务的分发节点做链接来消除对库文件的依赖。

编译android源码

参考以下信息。

搭建分布式编译器的机器有两台,安装ubuntu9.04操作系统,IP地址分别是192.168.0.215(A),192.168.0.111(B)。两台机器上都有arm-eabi-4.4.0编译器(可以从/android/prebuilt/toolchain/目录下copy),放在目录/usr/local/下。A机器提供编译服务,B机器作为客户端

1. Server和client端都要做的操作:
1)首先确认server和client上都安装了distcc
sudo apt-get install distcc

安装distcc图形界面监测程序(不是必须)

apt-get install distccmon-gnome

2)设置编译器路径到系统PATH中:
export PATH=/usr/local/arm-eabi-4.4.0/bin:$PATH

可以把此命令添加到~/.bashrc脚本中,这样每次启动都自动设置好了。

3)sudo vi /etc/default/distcc
修改STARTDISTCC的值为true。
STARTDISTCC="true"

在A(server)上,

修改 ALLOWEDNETS="192.168.0.0/16"

LISTENER="192.168.0.215" (server的ip)

在B(client)上,不修改以上ALLOWEDNETS和LISTENER的值。

其中ALLOWEDNETS采用了CIDR地址规则,在这里,192.168.0.0/16表示只要前16位为192.168的合法IP地址都可以请求编译服务。
针对B机器,由于不对外提供编译服务,所以只要将STARTDISTCC设为true即可。

4)sudo vi /etc/init.d/distcc
将/usr/local/arm-eabi-4.4.0/bin添加到distcc的PATH变量中。

5)在/usr/lib/distcc中建立distcc的软链接

A、B机器作相同的操作

cd /usr/lib/distcc
sudo ln –s ../../bin/distcc arm-eabi-gcc
sudo ln –s ../../bin/distcc arm-eabi-g++

/usr/local/arm-eabi-4.4.0/bin/下面的所有编译工具都要作到/usr/lib/distcc目录下相应的链接。

2. 在client需要完成:
export PATH=/usr/lib/distcc:$PATH
要保证/usr/lib/distcc系统PATH的最前面
export DISTCC_HOSTS=”192.168.0.215 192.168.0.213” (可添加多个server的ip)

3. server重启distcc服务
sudo /etc/init.d/distcc restart (此步骤只需在server端执行,client端并不启动distcc服务)

之后,在client上开始编译android源码,可用distccmon-gnome来监视编译过程。