This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Distcc/Compilation croisée
Ce guide vous explique comment configurer distcc pour la compilation croisée à travers différentes architectures de processeur.
La compilation croisée avec distcc
Introduction
distcc is a tool that lets you share the burden of software compiling across several networked computers. As long as the networked boxes are all using the same toolchain built for the same processor architecture, no special distcc setup is required.
This guide provides instructions on how to configure distcc to compile for different architectures.
Installer les utilitaires nécessaires
First, you will need to emerge crossdev on all the machines that will be involved in the compiling process. crossdev is a tool that makes building cross-architecture toolchains easy. Its usage is straightforward: crossdev -t sparc will build a full cross-toolchain targeting the Sparc architecture. This includes binutils, gcc, glibc, and linux-headers.
You will need to emerge the proper cross-toolchain on all the helper boxes. If you need more help, try running crossdev --help.
Si vous voulez régler finement la chaine de compilation croisée (cross-toolchain), voici un script qui produira une ligne de commande avec la version exacte du paquet de développement croisé à construire sur les machines assistantes (le script est à exécuter depuis la machine cible).
#! /bin/bash A="binutils" ; B=`eselect $A show` ; BINUTILS_VER=`echo $B | cut -d- -f5-` A=`/usr/bin/gcc-config -c` ; B=`echo $A | cut -d- -f5` ; GCC_VER=`equery l sys-devel/gcc | grep $B | cut -d- -f3-` KERNEL_VER=`uname -r | sed s/-gentoo//` A="sys-libs/glibc" ; B=`equery l $A` ; LIBC_VER=`echo $B | cut -d- -f3-` echo "crossdev --b =$BINUTILS_VER --g =$GCC_VER --k =$KERNEL_VER --l =$LIBC_VER -t `uname -m`"
Next, you will need to emerge distcc 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 distcc.
Current versions of crossdev have a
-S
(--stable
) flag for installing only stable versions of compiler tools. (ie. crossdev -t i686-pc-linux-gnu --stable --ex-gcc --ex-gdb --portage --pretend). Without this option, crossdev installs the latest experimental compiler tools packages! Otherwise, the above script is no longer needed, unless specific versions of package tools and/or headers have been unmasked.Notes spécifiques à Arch
Obtain the architecture name by looking at the compile target's CHOST variable within /etc/make.conf. When mangling the architecture name for the crossdev -t option, crossdev will merrily guess and install tools using the mangled architecture name for folder names within /usr (ie. /usr/i686-pc-linux-gnu/, /usr/i686-linux-gnu/, ...). To resolve this, specify each mangled architecture/folder name to crossdev --clean for uninstalling, or manually remove the folders from the system.
Intel x86 sub-architectures
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
Using crossdev -t sparc might fail with one of the following errors:
linker with -z relro support required support for the tls_model attribute is required this configuration requires -mlong-double-128 support
Si cela vous arrive, essayez la commande suivante à la place de la précédente :
user $
crossdev --lenv "CC=sparc-unknown-linux-gnu-gcc" -t sparc-unknown-linux-gnu
Configurer distcc pour des compilations croisées correctes
In the default distcc setup, cross-compiling will not work properly. The problem is that many builds just call gcc instead of the full compiler name (e.g. sparc-unknown-linux-gnu-gcc). When this compile gets distributed to a distcc helper box, the native compiler gets called instead of your shiny new cross-compiler.
Fortunately, there is a workaround for this little problem. All it takes is a wrapper script and a few symlinks on the box that will be running emerge. We'll use a Sparc box as an example. Wherever you see sparc-unknown-linux-gnu
below, you will want to insert your own CHOST value (x86_64-pc-linux-gnu
for an AMD64 box, for example). When you first emerge distcc, the /usr/lib/distcc/bin directory looks like this:
Les instructions suivantes doivent être exécutées seulement sur la machine qui exécute la commande emerge. N'effectuez pas ces étapes sur les machines assistantes.
root #
cd /usr/lib/distcc/bin
root #
ls -l
total 0 lrwxrwxrwx 1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
Voici ce que vous devez faire :
root #
rm c++ g++ gcc cc
Next, we'll create the new script on this box. Fire up your favorite editor and create a file with the following text in it, then save it as sparc-unknown-linux-gnu-wrapper. Remember to change the CHOST value (in this case, sparc-unknown-linux-gnu
) to the actual CHOST of the box that will be running the emerge.
#!/bin/bash exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
Ensuite, nous allons rendre le script exécutable et créer les liens symboliques corrects :
root #
chmod a+x sparc-unknown-linux-gnu-wrapper
root #
ln -s sparc-unknown-linux-gnu-wrapper cc
root #
ln -s sparc-unknown-linux-gnu-wrapper gcc
root #
ln -s sparc-unknown-linux-gnu-wrapper g++
root #
ln -s sparc-unknown-linux-gnu-wrapper c++
Voilà, c'est terminé. /usr/lib/distcc/bin devrait ressemble à ceci :
root #
ls -l
total 4 lrwxrwxrwx 1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc -rwxr-xr-x 1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper
With new distcc versions, the following steps are unnecessary—you can emerge distcc on the client with the
crossdev
USE flag set instead to achieve the same result.Ensuite nous devons nous assurer que ces enveloppes restent disponibles après la mise à jour du paquet distcc car il écrase les liens symboliques. Nous pouvons le faire grâce au fichier /etc/portage/bashrc qui ressemble à ceci :
case ${CATEGORY}/${PN} in '"`UNIQ--pre-00000007-QINU`"' if [ "${EBUILD_PHASE}" == "postinst" ]; then /usr/local/sbin/distcc-fix & fi ;; esac
Then create this file:
'"`UNIQ--pre-0000000A-QINU`"'
Give it the proper permissions:
root #
chmod 755 /usr/local/sbin/distcc-fix
Félicitations ! Vous disposez maintenant d'une configuration distcc avec compilation croisée fonctionnelle.
Comment ça marche
When distcc is called, it checks to see what it was called as (e.g. i686-pc-linux-gnu-gcc
, sparc-unknown-linux-gnu-g++
, etc.) When distcc then distributes the compile to a helper box, it passes along the name it was called as. The distcc daemon on the other helper box then looks for a binary with that same name. If it sees just gcc, it will look for gcc, which is likely to be the native compiler on the helper box, if it is not the same architecture as the box running emerge. When the full name of the compiler is sent (e.g. sparc-unknown-linux-gnu-gcc
), there is no confusion.
Dépannage
This section covers a number of common problems when using distcc for cross-compiling.
COMPILE ERRORS sur l’hôte distccd distant
When receiving the message COMPILE ERRORS
within a remote host's /var/log/distccd.log file, see the above notes concerning specifying the correct architecture name (ie. crossdev -t $TARGET).
Another solution is to uninstall and re-install crossdev compiler tools, using the crossdev --clean option, or ensuring /usr/$TARGET no longer exists, and then completely reinstall the cross compiler.
It might also be wise to edit the remote host's /usr/$TARGET/etc/portage/make.conf, and ensure the contents of the CFLAGS variable are similar on all computers or hosts performing compiler operations. Also make sure the USE flags for the cross compiler are sufficient: if you built GCC with USE=graphite
on the client, you need a line like cross-i686-pc-linux-gnu/gcc graphite
in /etc/portage/package.use too.
Failed to exec $TARGET-unknown-linux-gnu-gcc: No such file or directory
Il est possible que le script d'emballage (wrapper) ne parvienne pas à s’exécuter, même avec les bonnes permissions :
distcc[6195] (dcc_execvp) ERROR: failed to exec i686-unknown-linux-gnu-gcc: No such file or directory)
Pour résoudre ceci, assurez vous d'avoir créé le script d'emballage (wrapper) en utilisant le nom complet de l'architecture cible:
user $
ls -alh /usr/lib/distcc/bin/c++
/usr/lib/distcc/bin/c++ ->./i686-pc-linux-gnu-wrapper
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Andrew Gaffney, Joshua Saddler
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.