Heterogeneidad de entornos informáticos mediante la compilación cruzada

Con la llegada del software de código abierto y la aceptación de estas soluciones en la creación de sistemas complejos, la capacidad de desarrollar aplicaciones que puedan ejecutarse sin problemas en múltiples plataformas de hardware se vuelve inherentemente importante. Existe una necesidad constante de desarrollar el software en una arquitectura pero tener la capacidad de ejecutarlo en otras arquitecturas objetivo. Una técnica común para lograr esto es la compilación cruzada de la aplicación para la arquitectura objetivo.

La compilación cruzada es significativa en sistemas embebidos donde la intención es ejecutar aplicaciones en hardware especializado como placas ARM y PowerPC. Estos sistemas tienen limitaciones de recursos y, por lo tanto, la compilación directa no es una opción. Por lo tanto, los desarrolladores aprovecharán la arquitectura común x86 como anfitrión y utilizarán cadenas de herramientas específicas para el hardware de destino, generando binarios compatibles con el hardware de destino.

Este artículo cubre un estudio de caso donde se realizó la compilación cruzada de un paquete de código abierto para PowerPC. El artículo cubrirá los detalles de las herramientas y cadenas de herramientas utilizadas y un tutorial paso a paso sobre cómo se logró la compilación cruzada para esta arquitectura.

The Declaración del problema  

Dado un tablero de destino con arquitectura PowerPC, se pretendía agregar capacidades de enrutamiento L3 a este tablero. Con este propósito, se consideró un popular conjunto de protocolos de enrutamiento de código abierto, FRRouting (FRR). 

FRR es un conjunto de protocolos que permite que cualquier máquina Linux se comporte como un enrutador completo. Está empaquetado para amd64, arm64, armhf, e i386 pero no para PowerPC.   Esto necesitó la compilación cruzada de FRR.

Build host target host

Arquitectura de CPU 

x86_64 

Powerpc(32-bit)

Sistema Operativo

Ubuntu 18.4

QorIQ SDK

CPU

12 

2 (e5500)

RAM

12GB

1GB

TTabla 1. Diferencia en la plataforma de construcción y la plataforma objetivo

TEl viaje de la compilación cruzada

Hay dos etapas principales en la compilación cruzada:

Configuración del entorno de compilación y herramientas precompiladas

1. Instalar las herramientas de compilación requeridas en el entorno. Las herramientas comunes de compilación incluyen autoconf, make, cmake, build-essential, pkg-config, libtool, etc.

2. Configurar la herramienta precompilada específica para el entorno del host de destino. Los proveedores de CPU/Board ofrecen sus propias herramientas específicas de arquitectura. La herramienta específica para la placa de destino se obtuvo del sitio web del producto del proveedor.

3. La herramienta viene con un archivo de entorno, que se utiliza para configurar las variables de entorno como CC, GCC, PKG_CONFIG_PATH, etc., que son necesarias para la compilación cruzada. Edite el archivo de entorno /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux y actualice la ruta de las variables con respecto a la ruta del directorio de la herramienta.

Shell

 

Resolviendo Dependencias en Herramientas Precompiladas

Cada software tiene su propio conjunto de dependencias (herramientas/bibliotecas), que deben ser resueltas antes de la compilación cruzada.

Dependiendo de la disponibilidad de paquetes de estas herramientas/bibliotecas en la arquitectura de destino, hay dos opciones para resolverlas. Instalarlas directamente desde los paquetes disponibles o compilarlas cruzadamente también desde la fuente.

Específicamente para la compilación de FRR, las bibliotecas libpcre2, libyang, clippy, libelf y json-c deben ser construidas desde la fuente. Aparte de estas, los paquetes de bibliotecas protobuf y libcap estaban disponibles para la arquitectura PPC (PowerPC), los cuales pueden ser instalados directamente en la herramienta de compilación.

1. Instalando Bibliotecas desde Paquetes

Los paquetes de bibliotecas disponibles para la arquitectura de destino pueden ser instalados en el sysroot de la herramienta utilizando dos métodos:

  1. La primera forma utiliza la herramienta dpkg-deb basada en Ubuntu/Debian para instalar directamente paquetes Debian como se menciona a continuación:
    Shell

    Nota:

    • Descarga todos los paquetes de dependencias e instálalos en orden.
    • Es posible que los paquetes de bibliotecas se instalen en una estructura de directorios diferente. Copia esos archivos de biblioteca en los directorios correctos según la herramienta utilizada.
  2. De la segunda forma, se extraen los paquetes debian/rpm y se colocan manualmente en la ruta del directorio de la cadena de herramientas como se menciona a continuación:

    Para extraer el paquete debian, use las herramientas ar y tar como se menciona a continuación:

    Texto plano

     

    Nota: Este método es útil para sistemas sin soporte para dpkg-deb.

    Para la extracción del paquete rpm, utilice la herramienta rpm2cpio con el siguiente comando:

    Texto plano

     

  3. Ejemplo de extracción de paquetes y colocación de archivos con libcap:

    Shell

     

  4. Para verificar si los paquetes/bibliotecas se instalaron correctamente, ejecute el siguiente comando:

    Shell

     

    Nota: Instale pkg-config si aún no está instalado.

2. Compilación Cruzada de Bibliotecas

Los paquetes de biblioteca no están disponibles para la arquitectura de destino y se compilan desde la fuente. Antes de comenzar la compilación, cargue el archivo de entorno empaquetado con la cadena de herramientas para configurar todos los parámetros necesarios requeridos para la compilación cruzada.

Shell

 

Siga los pasos de compilación indicados en el archivo README de la biblioteca. Además, configure los siguientes parámetros en los pasos del procedimiento de construcción:

  1. Establezca el parámetro --host al ejecutar el script ./configure

    Shell

    $ ./configure –host=<target_host_parameter>
    # Example:
    $ ./configure –host=powerpc-fsl-linux

    Nota:

    <target_host_parameter> es el sistema para el cual se está construyendo la biblioteca/herramienta. Se puede encontrar en el archivo de entorno de la cadena de herramientas. Es un prefijo común que se encuentra en $CC, $LD, etc.
    Habrá dos tipos de bibliotecas dependientes. Uno es solo necesario para el proceso de compilación, y el otro es un requisito de dependencia para la ejecución en el host de destino. Establezca el parámetro --host en consecuencia.

  2. Al usar “make install” para compilar bibliotecas dependientes, establezca DESTDIR en el directorio raíz de la cadena de herramientas.
    Shell

     

Conclusión

Las diferencias en arquitecturas de sistemas, bibliotecas, dependencias y cadenas de herramientas hacen que la compilación cruzada sea una técnica compleja de ejecutar. Para facilitar las complejidades, este artículo desvela las fases de la compilación cruzada. Se tomaron FRR y PowerPC como ejemplos del software deseado y el hardware objetivo, respectivamente. Sin embargo, los pasos cubiertos en este artículo proporcionan una estrategia razonable para la compilación cruzada de cualquier software en un hardware específico. La configuración del entorno, la cadena de herramientas y las dependencias variarán según los requisitos.

Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation