DistCC Cross-compiling Guide

Andrew Gaffney  Author
Joshua Saddler  Editor
John Christian Stoddart  Traductor

Actualizado 17 de febrero, 2006

1.  Compilación cruzada con distcc

Introducción

distcc es una herramienta que permite compartir la carga de compilación de software entre varios computadores en una red. Mientras los computadores todos usen las mismas herramientas de sistema (toolchain) construidas para la misma arquitectura o procesador no hace falta ninguna configuración especial para distcc. Pero ¿qué hacer si necesita compilar para una arquitectura diferente usando computadores diferentes? Esta guía enseñará cómo configurar distcc para compilar para diferentes arquitecturas.

Instale las herramientas necesarias

Primero debe hacer emerge crossdev en cada una de los equipos involucrados en el proceso de compilación. crossdev es una herramienta que hace más fácil la construcción de herramientas de sistema para arquitcturas en forma cruzada. Fue escrito originalmente por Joshua Kinard y fue re-escrito completamente por Mike Frysinger. Su uso es sencillo: crossdev -t sparc construirá un conjunto de herramientas de sistema cruzado para la arquitectura sparc. Esto incluye binutils, gcc, glibc y linux-headers. Si necesita más ayuda, intente ejecutar crossdev --help. Obviamente, solo necesitará hacer emerge al conjunto de herramientas del sistema cruzado adecuado en los equipos que asisten a la compilación.

A continuación, debe hacer emerge distcc en todas los equipos involucrados en la compilación compartidas. Esto incluye el equipo que ejecutará el emerge y los computadores con los compiladores cruzados. Por favor vea la documentación Gentoo distcc para más información acerca de la configuración y uso de distcc.

Notas específicas por arquitectura

Si está haciendo una compilación cruzada entre distintas subarquitecturas para Intel x86 (por ejemplo, i586 e i686), debe contruir el conjunto de herramientas de sistema cruzado para el CHOST requerido o sino fallará la compilación. Esto es porque el i586 y el i686 son CHOSTs diferentes a pesar que ambos son considerados "x86." Por favor tome esto en cuenta al construir sus herramientas de sistema cruzado. Por ejemplo, si el sistema objetivo es i586, tiene que construir las herramientas de sistema cruzado en los equipos i686 coadyuvantes.

Configurando distcc para compilaciones cruzadas correctas

En la configuración por defecto de distcc, la compilación cruzada no funcionará correctamente. El problema es que muchos paquetes solo llaman gcc en vez de usar el nombre completo instead (por ejemplo, sparc-unknown-linux-gnu-gcc). Cuando esta tarea de compilación se distribuye a un equipo coadyuvante, este es pasado al compilador nativo y no al compilador cruzado.

Afortunadamente existe una solución para este pequeño problema. Lo único que se requiere es un guión tipo envoltorio y algunos enlaces simbólicos en el equipo que hace el emerge. Usaré mi equipo Sparc como ejemplo. Dondequiera que vea sparc-unknown-linux-gnu a continuación, sistitúyalo por su propio CHOST (por ejemplo, x86_64-pc-linux-gnu para un equipo AMD64). Al hacer emerge distcc inicialmente, el directorio /usr/lib/distcc/bin será así:

Nota: Las siguientes instrucciones son solamente para el equipo que corre el emerge. No las ejecute en los equipos coadyuvantes.

Listado de Código 1.1: Compiladores disponibles

# cd /usr/lib/distcc/bin
# 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

A continuación lo que debemos hacer:

Listado de Código 1.2: Modificando nuestro distcc

# rm c++ g++ gcc cc

A continuación crearemos un guión nuevo para este computador. Use su editor de texto y cree un archivo con el siguiente texto, luego sálvelo como sparc-unknown-linux-gnu-wrapper. Recuerde cambiar el CHOST (en est caso sparc-unknown-linux-gnu) al CHOST del equipo que correrá el emerge.

Listado de Código 1.3: El nuevo guión envoltorio

#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"

Luego, haremos que el guión sea ejecutable y crearemos los enlaces sinbólicos adecuados:

Listado de Código 1.4: Creando los enlaces sinbólicos

# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper g++
# ln -s sparc-unknown-linux-gnu-wrapper c++

Al terminar, el directorio /usr/lib/distcc/bin se verá así:

Listado de Código 1.5: Como debe ser nuestro conjunto de compiladores

# 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

¡Felicitaciones! Ahora tiene (esperemos que si, de veras) el esquema de compilación cruzada funcionando correctamente.

¿Cómo funciona todo esto?

Cuando llamamos a distcc, este programa revisa cómo fue llamado (por ejemplo, como i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++, etc.). Entonces, cuando distcc distribuya la tarea de compilación a un equipo coadyuvante, pasa también el mismo nombre con el que fue llamado. El demonio distcc en el equipo coadyuvante buscará un binario con el mismo nombre. Si solo ve un gcc, buscará un gcc, que probablemente será el compilador nativo en el equipo coadyuvante si la arquitectura no es igual que el equipo que corre el emerge. Cuando pasamos el nombre completo del compilador (como por ejemplo sparc-unknown-linux-gnu-gcc), entonces no habrá confusión.