Spanish/Doc/TutorialCrossCompiling

From The Player Project

Revision as of 10:40, 6 June 2009 by Thjc (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

/** @ingroup tutorials @defgroup tutorial_crosscompiling Cross-compiling @brief Como construir Player para un sistema empotrado

@section Introdución

Aunque Player es principalmente usado en ordenadores de sobremesa o portátiles, también está diseñado pra ser ejecutado en sistemas empotrados menos potentes. Según han pasado los años, Player ha sido usado en una gran variedad de estos sistemas, incluyendo iPaq, Intel Stayton, nanoEngine, y Gumstix.. Estos sistemas no son suficientemente potentes para ejecutar un compilador y en general tienen una arquitectura diferente a la de una máquina de sobremesa (por ejemplo ARM en vez de x86), lo que significa que se necesita hacer compilación cruzada (cross-compile) de los programas que se quieran ejecutar sobre él.

Este documento da algunas pistas para ayudar a compilar Player para otro sistema. Hay que tener en cuenta que compilar de forma cruzada es algo bastante complejo y que la información en el presente documento no puede dar un tratamiento completo al tema.

@section anexample Un ejemplo

Cuando se hace compilación cruzada, el sistema fuente es donde se está compilando y el sistema destino es el sistema donde se ejecutará el programa. Durante todo este documento, asumiré que el sistema donde se va a realizar la compilación es x86-linux ( por ejemplo, un ordenador de sobremesa o portatil con Linux instalado) y que el sistema destino es un arm-linux ( por ejemplo un sistema Gumstix). Seguramente este es el caso más común para Player y otros muchos sistemas empotrados. Si la situación es diferente, simplemente habría que cambiar los nombres específicos de los sistemas que se utilizan a continuación.

@section Prerequisitos

Primero, se necesita una toolchain x86-linux a arm-linux. Hay muchas formas de obtenerlo, incluyendo construirla por uno mismo. Pero dado la complejidad que conlleva, sugiero conseguir una previamente empaquetada, si es posible de la propia distribución.

La toolchain debe incluir soporte para C++, ya que gran cantidad del código de Player es C++.

@note (Gumstix): En gumstix-buildroot/Makefile, hay que ajustar INSTALL_LIBSTDCPP:=true.

Player usa XDR para el formato de los datos, asi que la toolchain debe tambien tener una complete implementación de RPC que incluya todas las funciones xdr_*(), en particular xdr_float() y xdr_double().

@note (uClibc): Hay que poner UCLIBC_HAS_FULL_RPC=y en el fichero .config de la biblioteca uClibc.

@note (Gumstix): Para que el anterior cambio tenga efecto hay que poner UCLIBC_HAS_FULL_RPC=y en gumstix-buildroot/uClibc.config.

La toolchain debe tener un directorio bin donde residen las herramientas usadas para la compilación cruzada como arm-linux-gcc y arm-linux-ld . Hay que añadir ese directorio al PATH.

@note (Gumstix) : Estas herramientas estan en gumstix-buildroot/build_arm_nofpu/staging_dir/bin.

@section Configuración

Las autotools tienen soporte nativo para compilación cruzada. La configuración básica de Player es así: @code $ ./configure --build=x86-linux --host=arm-linux @endcode El script configure automáticamente busca las herramientas arm-linux- que deberían estar en el PATH.

Esta configuración construirá la configuración predeterminada de Player, por lo tanto todos los drivers que puedan ser construidos serán incluidos. Si el objetivo de esta configuración es minimizar el tamaño de Player en el sistema empotrado, entonces se puede habilitar individualmente solamente los drivers que se necesitan. Por ejemplo, cuando se construye Player pra controlar el robot Roomba que viene equipado con un laser Hokuyo URG, se configura como sigue: @code $ ./configure --build=x86-linux --host=arm-linux --disable-alldrivers --enable-roomba --enable-urglaser @endcode Sólamente los drivers @ref driver_roomba y @ref driver_urglaser serán incluidos. Si sólamente está usando sus propios drivers creados como plugin, entonces no se necesitaría usar --enable para ningún driver.

La configuración predeterminada tambien usa bibliotecas compartidas si esto es posible. Esto puede complicar la transferencia de Player al sistema empotrado porque se tienen que copiar un conjunto de ficheros de soporte. Se puede inhabilitar el soporte a bibliotecas compartidas:

@code $ ./configure --build=x86-linux --host=arm-linux --disable-shared --disable-alldrivers --enable-roomba --enable-urglaser @endcode Then I get a player binary that is statically linked and self-contained.

@section Compilación Si no hubo problemas con la configuración, la compilación es similar a un sistema normal. @code $ make @endcode Hay un último paso que se puede ejecutar para ahorrar espacio, ejecutar strip para eliminar la información de símbolos o de debug del binario.

@code $ arm-linux-strip server/player @endcode El binario ya está listo pasa ser pasado al sistema empotrado (por ejemplo, usando scp).

  • /
Personal tools