话说在Gentoo上用distcc来加速编译也有些时日了,但今天才比较明白研究是怎么个设置法,就把 自己觉得是关键的几个设置点勾勒勾勒。
首先,可以认为distcc的体系中有两个角色,一是把.c或.cpp发出去,等着收.o的机子,可 以认为是client;另一种是收.c或.cpp,编译为.o发出去的机子,可以认为是server。无论 是client还是server都需要有相同的toolchain和distcc,就是说 binutils、gcc、libtool、glibc、distcc都要一样。当然server上可以是交叉编译用的工 具链(可以用crossdev生成)
如果说client和server都是一样架构的机子,比如都是x86,那只需在client和server上都emerge上相同 版本的binutils、gcc、libtool、glibc和distcc即可。但如果说client是i686,server是x86_64就麻烦一些了。 怎么办呢?只要在server上做一个交叉编译的工具链就可以了。这可以用crossdev来做。
在x86_64的server机上emerge crossdev后,可以用crossdev -t i686-pc-linux-gnu来生成所需要的i686的工具链,此时在eix-update后你可以用eix -e binutils看到会有一个cross-i686-pc-linux-gnu/binutils,同样的情况还有gcc、linux-headers、glibc, 确保这几个cross-i686-pc-linux-gnu/xx和你client机上的相应包是一样的版本。之后在server和client上都 emerge上相同版本的distcc。
然后在server机上设置一下distccd,以便能接client机发出的编译请求。主要是建立一个日志文件,设置一下/etc/conf.d/distccd,然后启动distccd后台,并加到了default的runlevel中:
| 代码: 建立distccd日志文件 |
touch /var/log/distccd chown distcc:daemon /var/log/distccd |
chown一定要做,不然distccd会因为没有写不了日志而起不来。
| 文件: /etc/conf.d/distccd |
DISTCCD_OPTS=""
# this is the distccd executable
DISTCCD_EXEC="/usr/bin/distccd"
# this is where distccd will store its pid file
DISTCCD_PIDFILE="/var/run/distccd/distccd.pid"
# set this option to run distccd with extra parameters
# Default port is 3632. For most people the default is okay.
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3632"
# 设置一下日志文件
DISTCCD_OPTS="${DISTCCD_OPTS} --log-file /var/log/distccd"
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
# 允许连接的client,以198.168.0.2和10.0.0.0/24为例,当然嘻嘻...
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 198.168.0.2"
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 10.0.0.0/24"
# server的ip
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 198.168.0.3"
# set this for niceness
# Default is 15
DISTCCD_OPTS="${DISTCCD_OPTS} -N 15"
|
然后,启动distccd,并加到default的runlevel中:
| 代码: 启动distccd |
/etc/init.d/distccd start rc-update add distccd default |
接着,我们需要在client上做一下设置,使得emerge时distcc出去的是i686-pc-linux-gnu-gcc这样 完整的编译器名称而不是简单的gcc。方法很简单,只需要在/usr/lib/distcc/bin下添加一个i686-pc-linux-gnu-wrapper:
| 文件: /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper |
#!/bin/bash
exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"
|
然后cd到/usr/lib/distcc/bin下,把gcc、g++、cc、c++等直接指向/usr/bin/distcc的链接指向我们的 i686-pc-linux-gnu-wrapper:
| 代码: 指向i686-pc-linux-gnu-wrapper |
cd /usr/lib/distcc/bin ln -sf i686-pc-linux-gnu-wrapper gcc ln -sf i686-pc-linux-gnu-wrapper g++ ln -sf i686-pc-linux-gnu-wrapper c++ ln -sf i686-pc-linux-gnu-wrapper cc |
这样从client机子上distcc出去的就全部都是完整的i686-pc-linux-gnu-gcc和 i686-pc-linux-gnu-g++了。从而,在x86_64的server机上的distccd就能正确调用交叉编译 i686用的工具链而不是x86_64的工具链来编译了。
最后,在/etc/distcc/hosts中加上server,具体的设置可以man distcc看下。其实很简单,比如我打算在本机上编译1个任务,但在server上编译3个,那么:
| 文件: /etc/distcc/hosts |
localhost/1 192.168.0.3/3 |
如果你有足够多的server的话,建议不让localhost作为server,因为distcc只能在server上编译而得到.o文件,configure、link等步骤在client上完成的,所以让你的client专门负责configure和link会使整个编译速度更快些。
发表评论