Distcc/Cross-Compiling/zh-cn

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

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

This guide will show you how to configure  to compile for different architectures.

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

You will need to emerge the proper cross-toolchain on all the helper boxes. If you need more help, try running.

如果你想对交叉工具链进行微调，这里有个脚本可以在命令行中输出要在帮助编译的机器上安装的交叉开发包的的确切版本（这个脚本需要在目标机器上运行）.

然后，你需要在所有参与交叉编译的机器上安装. 这些机器包括将运行emerge的机器和进行交叉编译的机器. 更多的关于配置和使用 的信息请参考Gentoo Distcc Documentation.

Intel x86 subarchitectures
如果你要在不同的intel x86子架构（例如i586和i686）上进行交叉编译，你仍然必须为目标CHOST编译完整的交叉工具链，否则编译会失败. 这是因为i586和i686实际上是不同的CHOST，尽管它们都被认为是“x86”. 当你建立交叉工具链的时候请谨记这一点. 例如，如果目标机器是i586，这意味着你必须在i686机器上建立i586的交叉编译链.

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

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

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

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

这里你需要做：

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

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

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

然后我们要确保这些封装脚本在升级distcc包之后不会被替换成之前的符号链接. 我们可以提通过在中添加下面的 代码来实现：

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

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

故障排除
这一节涵盖了一些使用 distcc 做交叉编译时的常见问题.

远程主机 distccd 编译错误
当在远程主机的 文件中发现    的信息，请查看上面的关于指定正确的架构名称（如 crossdev -t $TARGET）的附注.

其他的解决方案有卸载 crossdev 再重新安装，使用 crossdev --clean选项，或者确保 不存在后重新安装.

一个明智的做法是编辑远程主机上的 ，确保所有的要进行便已操作的电脑或主机的  变量是相似的.

Failed to exec $TARGET-uknown-linux-gnu-gcc: No such file or directory
封装脚本也许无法执行，即使有正确的权限：

要解决这一问题，请确保创建的封装脚本包含目标架构的全名：