使用 icecream 进行分布式编译

时间:2021-05-08 08:51:43

icecream 是一个分布式编译工具, 它的实现思想是一台主控制机加上若干台工作站,主控机把编译任务分配给工作站,主控机会根据工作站CPU的空闲情况进行分配,这样比较合理。 而且,主控机和工作站会自己进行网络通讯,从而知道网络内有多少台机器愿意分布式编译,用户不用像distcc那样,指定工作站的名字,这点我觉得比较方便。 

下载并编译icecream

下载地址是 ftp://ftp.suse.com/pub/projects/icecream/
下载并解压到一个临时目录,运行 ./configure --prefix=/opt/icecream
make
su - root
make install
安装在 /opt/icecream 目录里


配置

su - root 在每台机器上都要起icecc 守护进程: /opt/icecream/sbin/iceccd -d -v
在主控机上起 icc scheduler: 
/opt/icecream/sbin/icecc-scheduler -d -v


在用户的.bashrc 里加上路径:
export PATH=/opt/icecream/libexec/icecc/bin:$PATH
/opt/icecream/libexec/icecc/bin 放的是名为gcc, g++的可执行文件,也就是
说它们要优先于系统原来默认的gcc。 


如果要做native 编译,用命令
/opt/icecream/bin/icecc --build-native
它会生成一个打包文件,包含了编译器需要用到的所有文件。 在进行分布式编
译的时候,这些文件会传到编译主机上,并创建一个chroot环境。我觉得这是优于distcc的地方:不需要把编译器安装到另一台机器上。

export ICECC_VERSION=/home/yuwen/src/binutils-2.15/117d324a46e532af061421c3d940b082.tar.gz

export ICECC_DEBUG=debug 
该命令让icecc 输出调试信息


编译

然后就可以编译了,必须加上-j选项
make -j6
观察输出, 如果看到类似这样的log,说明分布式编译生效了:
<example>
ICECC[22334] 10:40:30: connected to /var/run/icecc/iceccd.socket
ICECC[22333] 10:40:30: Have to use host 172.25.52.190:10245 - Job ID: 1351 - env: i686 - has env: true - match j: 0
ICECC[22334] 10:40:30: env: i686 '/home/yuwen/src/binutils-2.15/6bc0f8d2aeca36e35947bdd88dd61f53.tar.gz'
ICECC[22334] 10:40:30: ./hex.c compiled 1 times on i686
ICECC[22333] 10:40:30: connected to 172.25.52.190
</example>


注意: native 编译并不能总是生效,比如一台x86 64位机是icc scheduler,另
一台是x86 32位机是工作机, 64位上的编译器并不能传到32机上。 但反过来是
可以的。

参考资料:https://github.com/icecc/icecream