class=»Apple-interchange-newline» Antes de configurar GCC, tenemos que saber lo que se tiene que configurar para GCC. El script de configuración de fuente de GCC nos dirá lo que son todos los que las opciones de configuración. Muchas de las opciones tienen valores vagos si no sabemos cómo estas opciones de configuración afectan el comportamiento de GCC. ¿Cómo debe comportarse GCC en un entorno bien configurado? GCC no es una sola pieza de software, que vive en un ecosistema. Primero lo primero, tenemos que tener viaje en el ecosistema.
1. Lo que está en GCC? /> ¿Qué componente vivo en GCC ecosistema de software? La respuesta más clara que puedo encontrar viene de propia fuente GCC. El guión autoconf nivel superior bajo «$ gccsrc / configure.ac» le dirá GCC propia opinión sobre todos aquellos componentes de software. He aquí las compendia relacionados de nivel superior «configure.ac» en gcc 4.8.2:
# # # Para añadir un nuevo directorio para el árbol, primero elige si se trata de un objetivo # # # o una herramienta dependiente de acogida. Luego lo puso en la lista correspondiente # # # (biblioteca o herramientas , host o destino), haciendo una especie de dependencia. # subdirectorios se configurará en el orden indicado en build_configdirs, # configdirs o target_configdirs;. consulte la sección serialización abajo clasificación # Dependencia sólo es necesario cuando * Configuración * debe hacerse en # un orden determinado. En todos los casos una dependencia debe ser especificado en # Makefile, si es o no es implícitamente especificado aquí. # entradas dobles en build_configdirs, configdirs o target_configdirs puede # causan dependencias circulares y romper todo lo horriblemente # éstos biblioteca es usada por varios programas integrados para la construcción # entorno # build_libs =» construir- libiberty « # estas herramientas están diseñadas para el entorno de construcción build_tools =» build-m4 acumulación fixincludes « # estas bibliotecas son utilizadas por diversos programas integrados para el entorno de host # host_libs = « intl libiberty opcodes BFD readline tcl tk itcl libgui zlib libcpp libbacktrace libdecnumber gmp MPFR mpc isl cloog libelf libiconv» # estas herramientas están diseñadas para el entorno de acogida # Nota , la acumulación de powerpc eabi depende de sim se produzca antes de gdb para # Sabemos que estamos construyendo el simulador. # binutils, gas y ld aparecen en ese orden porque tiene sentido para ejecutar # «make check» en ese particular, . order # Si – se utiliza enable-oro, «oro» puede reemplazar «ld». host_tools = «texinfo flex bison binutils gas ld fixincludes gcc CGEN sid sim gdb gprof etc esperar dejagnu m4 utils astucia fastjar gnattools « # libgcj representa las bibliotecas de tiempo de ejecución sólo utilizados por gcj libgcj =» meta- libffi span style meta-<= "color: red;" > zlib apuntar- libjava « # estas bibliotecas se construyen para el entorno de destino, y se construyen después de # las bibliotecas de acogida y las herramientas de acogida (que puede ser un compilador cruzado) # Tenga en cuenta que es libiberty no es una biblioteca de destino. target_libraries = « libgcc meta- libbacktrace meta-libgloss apuntar-newlib meta- libgomp
; meta- libatomic
meta- libitm
libstdc + +-v3
span style meta-<=" color: rojo ; "> libmudflap
libsanitizer
meta- libssp
meta- libquadmath
libgfortran
meta- boehm- gc
libgcj }
lapso de objetivos
meta- libada
apuntar- libgo "
# estas herramientas se construyen utilizando las bibliotecas de destino, y se pretende que
# ejecutar sólo en el entorno de destino
#
# nota: cualquier programa que utiliza * * las bibliotecas que son en los "target_libraries"
# lista pertenece en esta lista.
#
target_tools = "meta-rda"
Por favor recuerde que no todos los componentes enumerados anteriormente provienen de fuentes de gcc. Para ver todos los módulos sub configurables en Origen gcc:
Otros paquetes son paquetes independientes externos, como mpc, libelf, newlib, etc ya que se consideran como componentes en GCC ecosistema, si usted pone sus fuentes en gcc dir fuente de nivel superior, que serán configurados y compilados junto a las fuentes originales de gcc. Por ejemplo, si usted pone "gmp" origen del paquete en el directorio "$ gcctopsrcdir / gmp", cuando se construye gcc, "gmp" también quedó incorporado. El configure GCC guión "configure.ac" nivel superior pasará todos los parámetros de nivel superior de configuración que especifique, como "- prefix", para sub-nivel de paquete configure.ac. Así que la acumulación de todos los paquetes de sub-nivel están todas coordinadas por el nivel superior script configure />
En el diagrama anterior, hay dos cadenas de herramientas GCC: "Construir GCC" y "Cruz del CCG". "Construir GCC" es el GCC que ya tenemos, que se ejecuta en la acumulación / compile máquina. "Cruz GCC" es la cadena de herramientas que vamos a generar. Para la generalidad, ambas cadenas de herramientas son "cadena de herramientas de cruz."
Por lo general, los "Build-tools/libs", como "flex/bison/awk/m4/texinfo", debería haber sido instalado en el equipo de generación. Si no es así, sólo les puede instalarse con un gestor de paquetes (rpm, apt-get). Usted todavía puede compilar desde las fuentes. Pero se necesita un otro nativo (*-BB) de la cadena de herramientas con la "máquina de destino" como "B", ya que todas estas herramientas / libs se ejecuta en "construir la máquina". "Build-libs (libiberty)" "Build-herramientas (libiberty)" se construirá como parte del GCC.
Para "Host-tools/libs", ya que se ejecutan en " . ordenador central (H) ", por lo que la" construcción de la cadena de herramientas GCC (*-BH) se utilizará para generarlos En el diagrama anterior, esta parte del proceso corresponde a la span style = "color de <: amarillo ; ".> bloques amarillos y las líneas
Para" target-libs/tools ", ya que se ejecutan en la máquina de destino (T), se generan usando la nueva herramienta de cruz . cadena (BHT) Esta parte del proceso corresponde a bloques verdes y las líneas en el diagrama anterior
Ahora "build / host / objetivo" herramientas / libs son generados, Vamos a utilizar nuestra nueva herramienta de la cadena cruzada para construir una nueva aplicación. Este proceso corresponde a LEA bloques y líneas en el diagrama anterior. Para ejecutar el GCC cruz generado, vamos a necesitar el apoyo de "host-tools/libs" . GCC impulsará binutils para montar / códigos de enlace. El enlazador se necesita vincular startupfile gcc y glibc archivo de inicio (crtbegin.o, crtend.o, crt1.o, crti.o ...) y otra biblioteca de destino en binario de destino. Ahí es donde "target-libs/tools" se utilizan en la construcción de una aplicación en la cadena de herramientas de cruz. /> Algunas palabras más sobre el "target-libs". Para la aplicación generada binario se ejecute en la máquina de destino, se necesita el apoyo de muchas bibliotecas de tiempo de ejecución relacionados con gcc. Por ejemplo, c + + binario necesitará libstdc + +, programa de MP abierta se libgomp necesidades. Si habilita características adicionales en que la aplicación , al igual que la pila romper la protección, operación atómica, cálculo de precisión matemática quad, (a través de diversos "-f ***" Opciones de gcc), entonces usted tendrá libs tiempo de ejecución de "libssp / libatomic / libquadmath." Es por eso que tenemos una larga lista de "objetivo-libs". Todos los códigos fuente de la biblioteca de destino son parte de GCC, excepto "newlib / libgloss", que es una implementación de libc incrustado.
Desde GCC trabaja en una entorno alojado, se necesita el apoyo de una implementación de libc estándar. En teoría, el apoyo libc pertenece a los dos "host-libs" y "meta-libs". libc seguramente no es parte de GCC. Esto es tan fundamental , casi cada voluntad aplicación depende de ello. Es por eso que no se menciona en el nivel superior "configure.ac" de gcc como "host-libs." Pero todavía tenemos que construir dos versiones de libc para GCC, uno corriendo en sede de la máquina y uno corriendo en la máquina de destino. Generalmente, nuestra cadena de herramientas cruz utilizará la libc existente en la máquina de construcción, si la versión de libc es compatible con el GCC cruz construida. En teoría, se puede construir un libc separado para máquina host , pero rara vez es necesaria. Esta parte del tratamiento correspondiente a PALE bloques verdes y las líneas en el diagrama anterior.
2. gasoducto cruz edificio GCC /> Espero que usted todavía está conmigo después de la sección 1 doloroso. cadena de herramientas de cruz es en sí un concepto confuso que justifica más explicaciones. Ahora GCC sí catalogar su ecosistema en 3 clases:. build-tools/lib, host-tools/lib, target-tools/lib Aunque muchos de los componentes son paquetes de terceros, si usted pone sus códigos en árbol de fuentes gcc, gcc sólo los considera parte de él y construirá de acuerdo a su clasificación. Algunos componentes pertenece a más de una clase. Por ejemplo, "libiberty" es a la vez "construir-libs" y "host-libs" .
Si el GCC se configura como (ABC), el script de configuración buscará tres cadenas de herramientas dirigidas específicamente a A / B / C, desde la cadena de herramientas instalado en el equipo de generación. Por destino bibliotecas (C), si no existe cadena de herramientas existente, configurar script también verificará la cadena de herramientas-construir-voluntad se puede ejecutar para generar bibliotecas de destino. Si es así, configure la escritura dirigirá proceso de construcción utilizados cadena de herramientas de nueva construcción a construir bibliotecas de destino. La cadena de herramientas existentes tienen prioridad durante estos procesos de búsqueda. Si se cumplen todos los requisitos de la cadena de herramientas, a través de los ya existentes o de nueva construcción, entonces GCC sólo comenzará a recopilar feliz. Si alguno de ellos no se encuentra, script de configuración fallará. />
El escenario más típico de construcción cruz cadena herramienta sí pertenece a la cadena de herramientas nativas (AAA) para cruzar la cadena de herramientas (AAB). Para los "build-tools/libs", no son más que simples aplicaciones que se ejecutan en el equipo de compilación, o descargan las bibliotecas, para que puedan ser introducidos en (AAA) de la cadena de herramientas, entonces estamos listos. "host-tools/libs" seguirán siendo compilado a través de (AAA), ya que todavía se ejecutan en la máquina de construcción (A). Target-tools/libs serán compilados a través de la host-tools/lib nueva construcción de (AAB).
Hay una truco aquí. Los destinatarios de gcc-libs todos dependen de libc. En una acumulación fase de GCC, por defecto serán construidas todas compoents build / host / objetivo. Desde libc está fuera del ámbito de la construcción de gcc, todo estos objetivos-libs se fracasado al tratar de vincular con libc (B) GCC proporciona la opción de configuración. "- disable-xxx" por lo que estas libs objetivo no se construirán en un pase gcc compilar Así que podemos construir. la parte "activa" de la cadena de herramientas (AAB) en primer lugar, los instalará en la ruta del sistema, y los utilizan para construir libc para la máquina (B). Entonces vamos a utilizar la primera cadena de herramientas de pase (con carencias de muchas características debido . "- disable-xxx" configuración) para construir la segunda ronda de la cadena de herramientas Esta vez, podemos hacer que todo lo que nos gusta ya funciones libc (B) está lista La opción config. "- with-sysroot" especificará que el gcc buscará esos objetivos libs mientras que la construcción de aplicaciones de la máquina (B). Así libc y metas libs deben instalarse en "sysroot". Este "sysroot" es para la construcción de aplicaciones cruzadas sólo en GCC. No lo confunda con el sysroot "/" en su máquina Linux. Ahí es donde los "anfitriones-herramientas activas" componentes gcc buscará las bibliotecas de los que depende, es decir, linux cargador dinámico, o gcc no pueden correr. Una imagen sirve a miles de palabras. A continuación se muestra una "fábrica gasoducto" que representa cómo se construye a través de gcc (AAA) a (AAB).
Ahora tenemos cadena de herramientas (AAA) y (AAB), podemos usarlos para construir la cadena de herramientas canadiense (ABC). ; Otra imagen de nuevo sirve a más de mil palabras
Recuérdese por favor que (ABC: bootstrap).. necesita ejecutarse en la máquina (B) Por lo que necesita otra máquina de compilación Si sólo tiene una máquina de construcción (A), otro camino para construir (ABC) de la cadena de herramientas es:
(AAA) ----> (AAB) (AAA) ----> (AAC) (AAB) | (AAA) .; | ------> (ABC) (AAC) | /> El último paso se muestra en el siguiente cuadro El punto clave aquí es: ¿Cuándo GCC origen está configurado como (ABC), el script de configuración buscará cadenas de herramientas existentes dirigidas colectivamente en A / B / C. Desde se encuentran en todo la cadena de herramientas, las bibliotecas finales de destino serán generados por la cadena (AAC) en lugar de la recién generado (ABC), que en realidad no se puede ejecutar bajo la máquina (A).
3 .. opciones de configuración GCC
Ahora tenemos unos grandes cuadros en los componentes de un sistema de herramientas GCC cadena, es decir, los componentes de "build / host / objetivo", y la forma en que se construyen. Ya es hora de entender cómo las opciones de configuración del CCG afecta la forma en que son construido.
Como se mencionó antes, tercera parte "build-tools/libs", que debería haber estado listo en equipo de generación, por lo que no se moleste con ellos aquí. Si no, los instaló utilizando un gestor de paquetes. La cadena de herramientas nativo puede construir propios "build-tools/libs" de gcc. Hecho.
Para "host-libs", la configure.ac GCC nivel superior ofrece la. "- with-***" opciones para identificar su ubicación si no se construyen con CCG con codo para construir una GCC, los "host-libs/tools" obligatorias externos son " gmp MPFR mpc isl cloog / usr ", se puede decir GCC su ubicación con las opciones de configuración a continuación: - with- gmp = / usr - with-MPFR = / usr - with-isl = / usr - with-isl = / usr - with-cloog = / usr
y GCC intentará localizar sus archivos de cabecera en "/ usr / include" y archivos de biblioteca "*. un archivo *. así" (estático o compartido) en "/ usr / lib".
Para las bibliotecas anfitrionas originales del CCG, como "intl libiberty zlib libbacktrace libcpp libdecnumber", ya que son parte de la distribución de fuentes de GCC, que siempre será construido. En "host-herramientas", "fixincludes / gcc" son parte de GCC, siempre van a ser construidas. "gnattools" también se construyen si necesita un compilador de Ada.
Hay algunas dependencias entre las librerias de acogida obligatorias del CCG. Si usted elige para construirlas fuera del árboles de código fuente del CCG, es necesario seguir el orden de dependencia derecha durante la construcción.
Por "objetivo-libs", ya que todos ellos son fuente original GCC, GCC considerarlos como "características". Eso significa que, si habilita ciertas características en GCC, los códigos relacionados se recopilarán en GCC, . y las correspondientes bibliotecas de destino se construirá Las opciones de configuración de "características" en GCC es "- enable-***" Por ejemplo, si habilita "libitm" a través. "- enable-libitm", . un "libitm.a" biblioteca de destino o "libitm.so" se construirá Usted puede usar la característica de "memoria transnacional" en su aplicación de fuentes de código como los siguientes:
" main.c " # include int main (int argc, char * argv []) {
__transaction_atomic { a = b + c;
x = u * y; }
..... } $ gcc- fgnu-tm main.c-o principal-llibitm
Al compilar el programa, usted necesita decirle a GCC para activar la función de generación de código "-fgnu-tm", por lo que se generará el código de memoria transacción. Con la ayuda de target biblioteca "libitm.a / so", su programa se puede ejecutar en la máquina de destino con la semántica de la memoria de la transacción.
Todas las bibliotecas de destino se puede activar o desactivar. Al compilar estas bibliotecas de destino, GCC necesitan tener acceso a un derecho c biblioteca en tiempo de ejecución total, es decir, libc, para vincular en el código c inicialización como "crt1.o, crtn.o, crts.o", o la compilación fallará. Por eso, cuando compilamos nuestra etapa 1 C compilador cruzado, ya que no contamos con una libc, sin embargo, tenemos que desactivar todas estas bibliotecas de destino.
Hay cuatro opciones de configuración conexas en relación con la construcción de bibliotecas en GCC, tanto para albergar bibliotecas y bibliotecas de destino:
En el entorno de compilación de GCC, todas las bibliotecas se construirán a través de" libtool. "Las opciones de configuración de arriba son en realidad" Opciones libtool ". ;. Por defecto, GCC se basará tanto en estática y la versión compartida de las bibliotecas, si el soporte de la máquina en funcionamiento bibliotecas compartidas Si desea que sólo la versión estática de las bibliotecas que se construirán, puede usar "- disable-shared". Si desea que sólo versión compartida que se construirá, se puede especificar "- disable-static - enable-shared".
Hay una opciones de configuración que especifican cuántas GCC idioma front-end se ... generar Es "- enable-languages = *" La lista de idiomas soportados completo es: "c / c + + / fortran / ada / go / objc / obj-c + + / java" Aquí es algunos ejemplos de configuración:
- enable-languages = c, c + + - enable-languages = c, fortran - enable-languages = all
Cuando un frente idioma extremo se configura, GCC generará automáticamente los idiomas en tiempo de ejecución bibliotecas objetivo para usted. Por ejemplo, si habilita c + +, la biblioteca + + objetivo libstdc se construirá de manera implícita. Si usted no quiere construir esta biblioteca de destino, se puede desactivar de forma explícita a través de "- disable-libstdc + +".
En GCC 4.8 o superior, el documento de instalación (http://gcc.gnu.org/install/prerequisites.html) mandatos de un compilador C + + que se compile GCC. Así que tenemos que permitir a C y C + + en la construcción de nuestro compilador cruzado.
3. Opciones de configuración relativos a la arquitectura directorio GCC
Después de un GCC está construido e instalado, ¿dónde están esas librerias o herramientas "host / objetivo" se colocan en una arquitectura de directorios Un directorio de arquitectura cuidadosamente organizada es obligatorio para GCC para que funcione correctamente, debido a que:?
a gcc es sólo un programa piloto, tiene que llamar "cc1/collect2/as/ld" etc compilar realmente los códigos fuente lo tanto, necesita saber dónde esos "host-herramientas" son:. <. br /> b Al compilar una aplicación de destino, gcc necesidad de incluir las bibliotecas de encabezado del archivo en la etapa de pre-proceso, y un enlace para apuntar las bibliotecas en la vinculación de la etapa necesidades tanto de gcc para saber dónde encontrar esos objetivos-libs;.
Hay opciones de configuración afectarán a donde se van a instalar todos estos componentes del CCG en una arquitectura de directorios:
- prefix - -exec-prefix - with-sysroot
En principio, todos los artefactos independientes de la plataforma se instalarán bajo "- prefix". Para ejemplo, toda la documentación, bibliotecas cabecera archivos, archivos de configuración, etc A directorios típicos prefijo se verá así: