i007.cc

i007.cc

优先队列-降维打击

使用 icecream 进行分布式编译

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

下载并编译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机上。 但反过来是
可以的。

发表回复