Red de conocimiento informático - Material del sitio web - Cómo utilizar gentoo para realizar una compilación cruzada de un sistema básico

Cómo utilizar gentoo para realizar una compilación cruzada de un sistema básico

Entorno de compilación para sistemas integrados

Para desarrollar software para una plataforma, primero necesita un entorno de compilación. En términos generales, el entorno de compilación consta de tres partes: cadena de herramientas/entorno de ejecución/método de compilación. Para los sistemas integrados, existen tres entornos de compilación comunes:

Entorno local. Por ejemplo, Ubuntu para ARM es muy popular y utiliza imágenes de destino oficiales (que generalmente contienen un entorno de compilación) para compilar/instalar software directamente en la máquina de destino, exactamente como el desarrollo de PC. Este método es simple y sin problemas. Las desventajas también son obvias: la velocidad de compilación es lenta y lleva mucho tiempo, especialmente para paquetes de software más grandes (como xbmc). Los programadores no pueden detenerse a tomar una taza de café, me temo que tendrán que jugar a Dota toda la noche. resultados... (Tal vez se pueda mejorar distcc)

Entorno virtual. Cree un entorno virtual en la PC para la máquina de destino, como QEMU-ARM, y luego acceda al entorno virtual para compilar/instalar el software. Este método utiliza la potencia de procesamiento de la PC y es mucho más rápido que en un entorno local. Sin embargo, QEMU no simula perfectamente el entorno de destino. Por ejemplo, no admite ciertas llamadas al sistema, etc., lo que puede provocar que no se pueda compilar correctamente cierto software.

Recopilación cruzada. El software de compilación cruzada para la máquina de destino es el método más común y es la base de los dos métodos anteriores. La compilación cruzada es un "trabajo sucio", ya que implica resolver manualmente todas las dependencias de los paquetes, compilar manualmente cada paquete y resolver los problemas de compatibilidad del paquete con el objetivo... Solo eche un vistazo a La cantidad de solicitudes de asesoramiento/orientación sobre cómo La compilación cruzada adecuada de un paquete específico le indica cuántos programadores abusan de él.

Compilación cruzada en Gentoo

Gentoo es una metadistribución que construye todo el sistema a partir del código fuente y admite muchos sistemas diferentes, como alpha/arm/hppa/ppc/ sh. /sparc/s390, que proporciona herramientas convenientes para la compilación cruzada que ninguna otra distribución binaria puede igualar. Esto no tiene comparación con otras distribuciones binarias (scratchbox también es débil).

La compilación cruzada en Gentoo se logra mediante crossdev y portage. La ventaja de Portage es que resuelve automáticamente las dependencias y actualiza el sistema como un entorno local.

Creación de una cadena de herramientas

crossdev se utiliza para crear una cadena de herramientas cruzadas y proporciona scripts auxiliares para emerger en un entorno de compilación cruzada. Por ejemplo, para construir una cadena de herramientas para la plataforma arm:

$ sudo crossdev -t arm-supertux-linux-gnueabi

De esta manera, crossdev eventualmente generará un archivo "gentoo- compatible" compilador cruzado de brazo.

De esta manera, crossdev finalmente obtuvo un compilador cruzado arm "compatible con gentoo".

Entorno de ejecución

crossdev genera el directorio /usr/arm-supertux-linux-gnueabi/ ya que el sistema de destino ($buildroot, pkgconfig, etc.) también está en $buildroot.

Compilación cruzada

En la cadena de herramientas/entorno de ejecución, la encapsulación del entorno de desarrollo cruzado de emerge puede aparecer libremente.

Por ejemplo, para realizar una compilación cruzada de bash:

$ sudo emerge-arm-supertux-linux-gnueabi -avu bash

porage combinará automáticamente las dependencias de bash (como ncurses/readline) con emerge implementado junto a $buildroot. La compilación cruzada se ha vuelto tan fácil...

Problemas encontrados

Parados sobre los hombros de los gigantes, podemos ver más lejos, siempre que subamos primero Los hombros de los gigantes. Por lo tanto, cuando intenta instalar un entorno gráfico (como $emerge -avu iluminación), es probable que obtenga un error. Sin embargo, Portage proporciona un control detallado para ayudar a resolver este problema. Las siguientes son algunas situaciones que encontré y sus soluciones:

Los problemas causados ​​por las variables de entorno del paquete de software, como la biblioteca de enlaces que apunta a /usr/bin en lugar de $buildroot, se pueden encontrar en $buldroot/etc. /portage/ Configure el archivo correspondiente en el directorio env/ y portage proporcionará automáticamente el código fuente para el archivo, cambiando así el entorno durante la compilación.

El portage no contiene el software o contiene errores, como habilitar funciones de forma predeterminada que no están disponibles en la plataforma de destino. Cree superposiciones para el destino y escriba sus propios archivos ebuild para los paquetes correspondientes para guiar el transporte a través del proceso de compilación cruzada.

Por ejemplo, cuando se compila un paquete en etapas, perl se compila usando miniperl y la imagen de destino de perl se genera con miniperl. Debido a que el compilador cruzado usa miniperl para generar la imagen de destino, generalmente no es posible ejecutar miniperl en el entorno host para generar la imagen de destino final. Para hacer esto, usamos qemu-arm binfmt para emular el entorno de destino para que miniperl pueda ejecutarse sin problemas en la máquina host.

De hecho, lidiar con los escenarios anteriores también es un "trabajo sucio". No sólo es necesario comprender el entorno en el que se compilan los paquetes, sino que también es necesario comprender los principios de portage y la sintaxis de ebuild. Sin embargo, en comparación con la compilación cruzada tradicional, este es un trabajo de una sola vez, y otros usarán mi entorno de ejecución y superposiciones, lo que significa que no necesitan hacer nada más para generar el sistema de destino final.