¿Cuál es la diferencia de la opción "./configure" "--build", "--host" y "--target"?

121

El script ./configureacepta 3 opciones --build, --hosty --target. Estoy confundiendo sus roles. ¿Cuál es la diferencia y la semántica de ellos?

eonil
fuente
Autotools usará la cadena de herramientas incorrecta para una compilación cruzada, incluso usando --hosty --build. Tengo dos proyectos en C ++ y es imposible compilar para Android porque Autotools está muy jodido. Insiste en ejecutar pruebas utilizando la cadena de herramientas del host.
jww

Respuestas:

109

Como se señaló en esta publicación de blog y aludido en los Términos de configuración de GCC , --targetsolo se aplica cuando compila cadenas de herramientas. Cuando realiza una compilación cruzada normal de una biblioteca o binario que utiliza

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

Sin embargo, cuando está creando cadenas de herramientas, las cosas pueden volverse más complicadas. Creo que lo siguiente es correcto (aunque no puedo decir que haya compilado manualmente un depurador cruzado):

Digamos que tienes:

  • una máquina de compilación powerpc en la que vas a hacer toda la compilación
  • varios dispositivos integrados, con procesadores mips, en los que se va a ejecutar su código
  • una computadora portátil x86 que va a utilizar para depurar estos dispositivos en el campo

Configurar y construir su servidor de depuración (por ejemplo, gdbserver) para que se ejecute en su dispositivo integrado con

./configure --build=powerpc --host=mips

para que pueda poner masilla en su dispositivo integrado y ejecutar "gdbserver: 1234 a.out" para comenzar a depurar y escuchar en el puerto 1234.

Luego construiría su cliente de depuración (que se conecta y controla el gdbserver) con

./configure --build=powerpc --host=i686 --target=mips 

que copiarías a tu computadora portátil x86 para que en el campo puedas ejecutar "gdbclient embedded.device: 1234" para depurar tu programa a.out.

Todo esto también se aplica a los compiladores para los que es posible que desee consultar el enlace de GCC anterior o esta sección sobre la compilación cruzada canadiense .

También tenga en cuenta que, en la práctica, es posible que no vea especificación de compilación, host o destino porque, de acuerdo con esta página del manual de Autoconf , "el objetivo predeterminado es host, host para compilar y compilar según el resultado de config.guess".

En una palabra, compile el código --build, ejecútelo --hostcon el --targetentorno de arquitectura.

usuario124850
fuente
11
¿Cómo saber qué poner para "host" y "target"?
Negro
44
Supongo que estás hablando de crear un nuevo compilador, ya que "--target" solo es relevante para los compiladores. * "host" es donde debe ejecutarse tu nuevo compilador. * "target" es donde deberían ejecutarse los ejecutables producidos por su nuevo compilador.
user1735594
¿No hace esto una respuesta incorrecta, porque --host = i686 no es válido aquí?
infoclogged
1
La respuesta proporcionada menciona que la compilación se realizó para el objetivo MIPS y esta es la compilación, y el host es el depurador de la máquina MIPS. ¿Significa esto que el depurador / compilador también fue construido por powerpc? Este es un comentario que recibí de otro usuario (Ned): build = dónde estoy compilando el compilador, host = dónde se ejecutará el compilador, target = qué código producirá el compilador. Referencia: stackoverflow.com/questions/7088576/…
supmethods
Según Ned, ¿no significa esto que el powerpc es tanto el build / host, la máquina x86 un objetivo del depurador y el objetivo como sistema MIPS? ¿Puedes explicar más qué es "construir para" y "construir sobre"? Me refiero a gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
Supmethods
75

Nota: El argumento --targetsolo tiene sentido cuando se compila el compilador (por ejemplo, GCC). Cuando se ejecuta configureantes de construir GCC:

  • --build: la máquina en la que está construyendo
  • --host: la máquina para la que está construyendo
  • --target: la máquina que GCC producirá binario para

De la documentación de GCC ( notas de instalación específicas de Host / Target ):

Si build, host y target son todos iguales, esto se llama nativo. Si build y host son iguales pero el objetivo es diferente, esto se llama una cruz. Si la construcción, el anfitrión y el objetivo son diferentes, esto se llama canadiense (por razones oscuras que tratan con el partido político de Canadá y los antecedentes de la persona que trabaja en la construcción en ese momento). Si el host y el destino son iguales, pero la compilación es diferente, está utilizando un compilador cruzado para compilar un nativo para un sistema diferente. Algunas personas lo llaman host-x-host, nativo cruzado o nativo cruzado. Si compilación y destino son iguales, pero el host es diferente, está utilizando un compilador cruzado para construir un compilador cruzado que produzca código para la máquina en la que está construyendo. Esto es raro, por lo que no hay una forma común de describirlo. Hay una propuesta para llamar a esto un retroceso.

Delan Azabani
fuente
2
Lo que aparentemente significa --targetque no es relevante para ningún proyecto que no sea en sí mismo un compilador. Entonces, ¿por qué es una opción de configuración estándar? Confuso.
dhardy
1
@dhardy: configureno es exactamente un pináculo del diseño bueno y limpio; Supongo que es solo el resultado del deslizamiento de características específicas de la aplicación.
Tim Čas
Si quiero obtener un gcc, por ejemplo, ejecutar "./configure --build = powerpc --host = i686 --target = mips", ¿el ejecutable de salida está paralizado? por lo general, gcc es una herramienta poderosa que puede construir código c y luego generar muchos resultados para muchas plataformas. Aquí, si uso '--target = mips', ¿el gcc especificado perdió la habilidad?
gfan
Lo que también podría funcionar es actualizar los archivos config.guess y config.sub, para que el compilador conozca más plataformas de destino. Puede obtenerlas aquí: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi