¿Cómo construyo una cadena de herramientas GCC 4.7 para la compilación cruzada?

82

Ya hice esta pregunta en Stack Overflow, pero me gustaría saber si alguien logró construir una cadena de herramientas GCC 4.7 para la compilación cruzada ARM (para un host Linux x86 / x86-64). Hay muchas instrucciones para construir GCC desde la fuente y muchos compiladores cruzados disponibles para versiones anteriores a 4.7 GCC, pero no la última.

Compilar en Rasp Pi funciona bien, pero es demasiado lento para fines prácticos.

Estoy ansioso por compilar y me gustaría utilizar las últimas y mejores herramientas.

tlhIngan
fuente
Esto parece similar a lo que necesito hacer también. Estamos desarrollando un ARM5 con Arch Linux. El desarrollo está en Ubuntu Linux 10.04 LTS (hoy, tal vez lo actualicemos mañana, aún no lo sé). Actualmente estamos ejecutando GCC 4.4, pero las cosas que necesito hacer serán útiles si no requieren GCC 4.7 (mínimo) si no GCC 4.8 (si podemos administrarlo), para las características del lenguaje C ++ 11. Parece que todas las cadenas de herramientas disponibles para ARM (5 o cualquier otra cosa) están desactualizadas sin remedio. ¿Es posible construir una cadena de herramientas de compilación cruzada desde la fuente y apoyar el CCG que queremos?
mwpowellhtx
Tengo un pequeño problema en el segundo paso. de hecho, hice el ./configure y hice comandos. Todo funciona bien pero cuando escribí "instalar", recibí un mensaje de error que decía: instalar: archivo faltante operando
Ver también: raspberrypi.stackexchange.com/q/14587/5538 Lo cerré como un tonto, pero pensé que valía la pena vincularlo aquí porque la respuesta aceptada allí entra en detalles considerables no incluidos aquí.
Ricitos de oro

Respuestas:

60

Encontré estas instrucciones Cómo construir un compilador cruzado para su Raspberry Pi . Es un gran recorrido mediante el uso de una crosstool-ngherramienta que simplifica la configuración de una compilación de compilación cruzada MUCHO (tiene una buena interfaz basada en maldiciones) y es compatible con GCC 4.7.

Seguí estos pasos y terminé con una compilación exitosa de un compilador cruzado 4.7.

Requisitos previos: se requieren los siguientes paquetes: bison , flex , gperf , gawk , libtool , automake , g ++ , asegúrese de que estén instalados antes de continuar.

  1. Primera descarga crosstool-ngdesde aquí (utilicé la versión 1.15.2).
  2. Desempaquete la distribución y haga un ./configure/ make/install
  3. Cree un directorio nuevo en algún lugar del sistema de archivos para incorporarlo y cdcrearlo.
  4. Ejecutar ct-ng menuconfig. Se le presentará un buen conjunto de menús para configurar su compilación.
  5. Ve a Rutas y opciones misceláneas. Habilite las funciones de prueba marcadas como EXPERIMENTAL.
  6. Elija un directorio de prefijo adecuado . Este es el directorio en el que se instalarán su compilador y bibliotecas (todo está bien básicamente, solo asegúrese de que el directorio esté vacío).

    • NOTA: También es importante que tenga acceso de escritura a la carpeta elegida
  7. Vaya al menú de opciones de Target .

    • Arquitectura objetivo: brazo
    • Endianness: little endian
    • Bitness: 32 bits
  8. También es posible que desee establecer el parámetro de punto flotante en softfp (consulte esto para obtener más información), pero hardfp es más apropiado para Raspbian.

  9. Vaya al menú del sistema operativo y cambie el sistema operativo de destino a Linux .
  10. Vaya al menú del compilador de C y elija gcc versión 4.7.0 (el artículo recomienda Linaro, pero logré que funcione con vanilla gcc). También elija idiomas adicionales que desee poder compilar (C ++, Fortran, ...)
  11. Vaya al menú de la biblioteca C y elija uno. El valor predeterminado es eglibc, pero ese no me funcionó bien, así que utilicé glibc (la versión más nueva).

    • NOTA: durante el paso de compilación 13. eglibc puede fallar al compilar si no está instalada la subversión, ya que la fuente no se puede recuperar del repositorio
    • NOTA: eglibc ya no forma parte de la versión 1.21.0 debido a su falta de desarrollo. Ver Adiós a eglibc . Use glibc por defecto. crosstool-ng
  12. Salga de la herramienta de configuración mientras guarda sus cambios.
  13. Ejecutar ct-ng builden el mismo directorio. Espere un momento (aproximadamente 45 minutos en mi caso) y su compilador cruzado debería estar listo.

Parece que funciona muy bien!

usuario13
fuente
Wow, 45 minutos es mucho tiempo. ¿Qué tan rápido es su sistema? Estoy esperando ahora
Jivings
Bueno, tal vez fue un poco menos, pero primero tiene que compilar todos los requisitos previos y después de bintools y gcc también libc y libstdc ++, por lo que 45 min me parece razonable.
¿Podríamos agregar detalles sobre cómo instalarlos correctamente y actualizar la ruta, una vez probado, por supuesto?
Alex Chamberlain
2
Además, creo que deberíamos estar usando hardfp, ya que el RPi lo admite.
Alex Chamberlain
Puede ser, pero IIRC, el GCC de Arch está configurado con softfp. No tengo tiempo para probar esto ahora, pero hice el wiki de la comunidad de respuestas, así que siéntete libre de mejorarlo.
19

Estoy ansioso por compilar y me gustaría utilizar las últimas y mejores herramientas.

De hecho, las últimas y mejores herramientas no necesitan ser creadas por usted mismo. En el Repositorio de Raspberry Pi Tool GitHub encontrará las cadenas de herramientas X86_64y x686para el software de compilación cruzada.

Recomiendo usar la x86-linux64-cross-arm-linux-hardfpcadena de herramientas, ya que compilará para Hard Floating Point, lo que dará como resultado un sistema mucho más rápido.

$ arm-bcm2708hardfp-linux-gnueabi-gcc --version

arm-bcm2708-linux-gnueabi-gcc-4.5.1 (Broadcom-2708) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.

Nota: Si está utilizando un núcleo existente, entonces deberá usar la cadena de herramientas que coincida con el núcleo. Las aplicaciones HardFP no funcionarán en un núcleo SoftFP.


Para usar la cadena de herramientas, simplemente consulte el repositorio:

git clone https://github.com/raspberrypi/tools.git --depth 1

El --depthparámetro significará que no tiene que esperar a que también se descargue el historial del repositorio (ya que no lo usaremos).

Luego agregue los binarios a su variable PATH:

export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH

O para persistir el CAMINO:

echo "export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

Para compilar con la cadena de herramientas, ahora puede agregar el CROSS_COMPILEparámetro. Por ejemplo, cuando se ejecuta make:

make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- 

O para facilitar esto, puede guardar la variable bashrcnuevamente:

echo "export TARGET=arm-bcm2708hardfp-linux-gnueabi" >> ~/.bashrc
source ~/.bashrc

y ahora usa la variable al compilar:

make CROSS_COMPILE=${TARGET}
Jivings
fuente
1
Esto parece ser gcc-4.5.1.
@Tibor ¿Eso es malo?
Jivings
@Jivings ¡No responde totalmente la pregunta!
Alex Chamberlain
1
Desapruebo los votos negativos. @AlexChamberlain Sugiere un método alternativo valioso para el acto que lleva mucho tiempo de construir su propia cadena de herramientas.
Jivings
2
@Jivings: Esto es muy útil. Mientras tanto, es gcc4.7.1 (el mejor que he tenido) y el punto flotante funciona de inmediato. No pude hacer que el punto flotante funcionara con la descripción original de Chris que Tibor publicó. Muchas gracias.
4

Tenga en cuenta que al compilar la cadena de herramientas utilizando ct-ng en centos 6.3 en un sistema de 64 bits, me vi obligado a anular la selección de la opción de vincular estáticamente libstdc ++ porque el enlace estático no era compatible en la plataforma (aparentemente).

Además, aunque sería genial usar la cadena de herramientas preconstruida del repositorio de git, esa cadena no parece funcionar en Centos 6.3, probablemente porque está construida para un sistema más moderno o algo así. Realmente no traté de ejecutar esto.

Shane McCarron
fuente
3

Si desea beneficiarse de un host rápido para compilar cosas para su RPI, le sugiero que trabaje en entornos cruzados a través de chroot y QEMU. Esto, por cierto, reemplaza a un compilador cruzado sin problemas.

Simplemente configure un entorno cruzado de Debian usando deboostrap / multistrap

(vea el capítulo QEMU / enfoque de debootstrap) y ya está.

chispa
fuente
3

En caso de que vaya a realizar una compilación cruzada desde OS X: aquí está el gran artículo (y el único que funciona en la web que encontré).

Lo mejor es que el autor proporciona una cadena de herramientas precompilada completa , por lo que solo necesita descargar, descomprimir y montar la imagen dmg. Y eso es todo, estás listo para realizar una compilación cruzada.

Anton Matosov
fuente
2

Si instaló Ubuntu 64 bits edition y las herramientas de Raspberry Pi SVN y obtiene el error:

-bash: /home/I/toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-c++: 
No such file or directory

solo corre:

sudo apt-get install ia32-libs
PájaroDePrey
fuente
1

Carlson-Minot Inc. proporciona una cadena de herramientas preconstruida para objetivos ARM tanto de metal desnudo como GNU / Linux. Esta cadena de herramientas se basa en la cadena de herramientas Mentor Graphics Sourcery Lite con correcciones y adopciones para construir en el OS X. Ver

Anton Matosov
fuente