Distcc/Cross-Compiling/zh-cn

本文向你展示如何配置distcc在不同的处理器架构之间进行交叉编译.

介绍
是一个工具，能让你在网络中的多台机器共同编译软件. 只要在网络中的机器使用相同的工具链为相同的处理器架构编译，就不需要特殊的 配置. 但是如果你想用不同的机器为不同的架构进行编译呢？这篇指南将向你展示如何配置 来为不同的架构进行编译.

安装必要的工具
首先，你需要在所有的参与编译的机器上安装. 是一个能够让简化跨架构工具链编译的工具. 最初由Joshua Kinard编写，后来Mike Frysinger进行了完全的重写. 它的使用非常的直观： 将为Sparc架构编译完整的交叉工具链. 这包含binutils，gcc，glibc和linux-headers. 如果你需要帮助，尝试运行. 很明显，你要要在所有帮助编译的机器上安装合适的交叉工具链.

If you want to fine tune the cross-toolchain, here is a script that will produce a command line with the exact versions of the cross development packages to be built on the helper boxes (the script is to be run on the target box).

Script to fine-tune cross development tools

Next, you will need to emerge  on all the machines that will be involved in the process. This includes the box that will run emerge and the boxes with the cross-compilers. Please see the Gentoo Distcc Documentation for more information on setting up and using.

Intel x86 subarchitectures
If you are cross-compiling between different subarchitectures for Intel x86 (e.g. i586 and i686), you must still build a full cross-toolchain for the desired CHOST, or else the compilation will fail. This is because i586 and i686 are actually different CHOSTs, despite the fact that they are both considered "x86." Please keep this in mind when you build your cross-toolchains. For example, if the target box is i586, this means that you must build i586 cross-toolchains on your i686 helper boxes.

SPARC
使用 也许会失败，伴随如下错误：

运行crossdev -t sparc时出现的错误

如果发生上述错误，尝试使用下面的命令：

配置distcc以便正确的交叉编译
使用默认的distcc配置，交叉编译“不”会正常工作. 这是因为很多编译仅仅调用 而不是编译器的全名（例如 ）. 当这一编译被分发到帮助交叉编译的机器上时，原生的编译器被调用，而非你新安装的交叉编译器.

幸运的是，这一小问题有一个解决方案. 所需的只是在将要运行 的机器上添加一个封装脚本和几个符号链接. 我将使用我的Sparc机器作为例子. 在下面每处你看到 的地方，你需要替换成你自己的CHOST（例如对于AMD64的机器来说是 ）. 当你第一次安装完distcc的时候，看起来像这样：

这里你需要做：

然后，你要在这台机器上创建一个新的脚本. 打开你喜欢的文本编辑器，创建一个文件，内容如下. 然后保存到. 记住替换CHOST（这里是 ）成你要运行emerge的机器的实际的CHOST.

The new wrapper script

接下来，将此脚本设置为可执行，并创建适当的符号链接：

当你完成以后，看起来像这样：

Next we want to make sure that these wrappers stay available after upgrading the distcc package as it will overwrite the symbolic links. We can do this through a file that looks like so:

/etc/portage/bashrc

恭喜，你已经有一个可以工作的distcc配置了（希望如此）.

这是如何工作的
当 被调用的时候，它会检查自己是以何种方式被调用的（例如 ， 等等）. 当distcc把编译工作分发到帮助交叉编译的机器上的时候，它会把调用方式一起分发. 在帮助交叉编译的机器上，distcc的守护进程会去寻找有相同名字的程序. 如果它看到的仅仅是 ，它就会去找 ，如果帮助交叉编译的机器架构跟运行 的机器不一致，distcc的守护进程找到的gcc很可能是这台机器上的原生的的编译器. 如果发送的是编译器的“全名”（例如 ），就不会出现混淆.

感谢
感谢下面的作者和编辑对这篇指南的贡献：


 * Andrew Gaffney
 * Joshua Saddler