-
简介
在类 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.222(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.222 192.168.0.211” (可添加多个server的ip)
3. server重启distcc服务
sudo /etc/init.d/distcc restart (此步骤只需在server端执行,client端并不启动distcc服务)
之后,在client上开始编译android源码,可用distccmon-gnome来监视编译过程。