HowTo:705es:Crosscompiling
De Luispa
Compilación distribuida
En este artículo describo cómo usar "Cross compiling" y "distcc" para poder compilar los paquetes en el Compaq utilizando además mi servidor "bolica".
Nota: "bolica" es el nombre de mi servidor. Xeon 5540 64bits (8 cpus): x86_64-pc-linux-gnu "sysroot" es el directorio toolchain utilizado para crosscompiling, está en "bolica": /usr/i686-pc-linux-gnu "minilur" es el nombre del Compaq. Atom N270 (2 cpus): i686-pc-linux-gnu
Instalación de Crossdev en "bolica"
Creación del toolchain
- Desde "bolica" y como root:
# USE="-*" crossdev -v --binutils 2.18-r3 --gcc 4.4.2 --kernel 2.6.30-r6 --libc 2.9_p20081201-r3 --ex-gdb --target i686-pc-linux-gnu El toolchain queda instalado en /usr/i686-pc-linux-gnu/ <== A este directorio se le conoce como "sysroot"
Preparar el Host "bolica"
- Añado la variable SYSROOT a /etc/bash/bashrc
# Para cross compiling export SYSROOT="/usr/i686-pc-linux-gnu/"
- Salgo de root y vuelvo a entrar y verifico que la variable está.
# echo $SYSROOT /usr/i686-pc-linux-gnu/
- Creo el make.conf en $SYSROOT/etc/make.conf
# Intel(R) Atom(TM) CPU N270 con GCC >= 4.3
ACCEPT_KEYWORDS="x86"
CHOST="i686-pc-linux-gnu"
CFLAGS="-O2 -march=core2 -mtune=generic -fomit-frame-pointer -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j9"
USE="-font-server fontconfig xcb -motif -mozilla -firefox xulrunner alsa gnome oggvorbis jpeg png truetype udev X ffmpeg imagemagick java exif x264 gtk lm_sensors acpi pmu qt3support"
LINGUAS="es en"
VIDEO_CARDS="intel"
INPUT_DEVICES="keyboard synaptics mouse"
- Copio make.globals y creo el profile
# cp /etc/make.globals "${SYSROOT}/etc"
# mkdir -p "${SYSROOT}/etc/portage/profile"
- Link simbólico para el profile a utilizar en SYSROOT
ln -sn /usr/portage/profiles/default/linux/x86/10.0 "${SYSROOT}/etc/make.profile"
- Creo un script "/usr/bin/xmerge" para facilitar el cross compiling
#!/bin/bash
CBUILD=$(portageq envvar CHOST)
PORTAGE_CONFIGROOT="$SYSROOT"
if [[ "$1" == "--root" ]] ; then
ROOT="$2"
shift 2
else
ROOT="$SYSROOT"
fi
export CBUILD PORTAGE_CONFIGROOT ROOT
emerge $*
- Creo un script "/usr/bin/xmake" para facilitar el cross compiling del kernel
#!/bin/bash make CROSS_COMPILE="i686-pc-linux-gnu-" INSTALL_MOD_PATH="$SYSROOT" $*
Ejemplo de compilación
- Un ejemplo para compilar ntp
# xmerge -av ntp
- Nota:
Para hacer el despliegue se prepara con el programa "qpkg"
* Una vez que los paquetes se compilan y quedan en "sysroot", se podrán empaquetar para luego poder instalarlos en el equipo destino "minilur" usando el programa pkg. Un ejemplo:
# ROOT="$SYSROOT" qpkg -P "${SYSROOT}/var/tmp/binpkgs" ntp
El paquete se archiva en se salva en $SYSROOT/var/tmp/binpkgs with a .tbz2 extension.
- crossdev está ya preparado en "bolica"
Ya tengo preparado el sistema "bolica". No utilizaré la compilación desde bolica, sino que emplearé "distcc"
Instalación de distcc en "bolica" y "minilur"
Distcc permite distribuir tareas de compilación en diferentes ordenadores de la red. Está formado por un servidor "distccd" y un cliente "distcc"
- emerge de distcc en ambos equipos
bolica # emerge -v distcc minilur # emerge -v distcc Salida en bolica: * * IPv6 has not supported yet by distcc-3.1. * * Tips on using distcc with Gentoo can be found at * http://www.gentoo.org/doc/en/distcc.xml * * How to use pump mode with Gentoo: * # distcc-config --set-hosts "foo,cpp,lzo bar,cpp,lzo baz,cpp,lzo" * # pump emerge -u world * * To use the distccmon programs with Gentoo you should use this command: * # DISTCC_DIR="" distccmon-text 5 * Or: * # DISTCC_DIR="" distccmon-gnome * * ***SECURITY NOTICE*** * If you are upgrading distcc please make sure to run etc-update to * update your /etc/conf.d/distccd and /etc/init.d/distccd files with * added security precautions (the --listen and --allow directives) *
- Modifico el /etc/make.conf en "minilur", para que utilice distcc. No lo hago en "bolica" ya que es el ordenador potente y de momento no quiero que emplee distcc como cliente
Fichero /etc/make.conf FEATURES="distcc"
- Añado los dos ordenadores a la lista en ambos equipos
bolica # distcc-config --set-hosts "192.168.1.1/8,cpp,lzo" minilur # distcc-config --set-hosts "192.168.1.1/8,cpp,lzo"
# distcc-config --set-log /var/log/distcc.log
- Edito el fichero /etc/conf.d/distccd
En bolica:
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.1.0/24"
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.1.1"
En minilur:
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.1.0/24"
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.1.20"
- Arranco el daemon y lo configuro para que arranque siempre
bolica # rc-update add distccd default bolica # /etc/init.d/distccd start minilur # rc-update add distccd default minilur # /etc/init.d/distccd start
Crossdev y Distcc
- Por defecto distcc no está bien preparado para unirse a crossdev, así que realizamos lo siguiente en ambos equipos:
- En bolica:
# cd /usr/lib/distcc/bin/
# rm c++ cc g++ gcc
# e x86_64-pc-linux-gnu-wrapper
#!/bin/bash
exec /usr/lib/distcc/bin/x86_64-pc-linux-gnu-g${0:$[-2]} "$@"
# chmod 755 x86_64-pc-linux-gnu-wrapper
# ln -s x86_64-pc-linux-gnu-wrapper cc
# ln -s x86_64-pc-linux-gnu-wrapper gcc
# ln -s x86_64-pc-linux-gnu-wrapper g++
# ln -s x86_64-pc-linux-gnu-wrapper c++
- En minilur: (PENDIENTE)
# cd /usr/lib/distcc/bin/
# rm c++ cc g++ gcc
# e i686-pc-linux-gnu-wrapper
#!/bin/bash
exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"
# chmod 755 i686-pc-linux-gnu-wrapper
ln -s i686-pc-linux-gnu-wrapper cc
ln -s i686-pc-linux-gnu-wrapper gcc
ln -s i686-pc-linux-gnu-wrapper g++
ln -s i686-pc-linux-gnu-wrapper c++
Ejecución
- A partir de ahora simplemente se ejecuta emerge en "minilur" y debería funcionar ... (PENDIENTE DE PROBAR)
Un ejemplo: # emerge -v bmon
Con uso de pump # pump emerge -v bmon
Monitorización
- En modo gráfico con distccmon-gnome o distccmon-gui
# DISTCC_DIR=/var/tmp/portage/.distcc distccmon-gnome 1
- O bien en modo texto
# DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1
Enlaces y Créditos
- http://www.gentoo.org/proj/en/base/embedded/cross-development.xml
- http://www.gentoo.org/doc/en/distcc.xml
- http://www.gentoo.org/doc/en/cross-compiling-distcc.xml
Volver a Página inicial del Compaq Mini 705ES
--Luis 11:57 31 dic 2009 (CET)

