Qual è la differenza tra l'opzione "./configure" "--build", "--host" e "--target"?


121

Lo script ./configureaccetta 3 opzioni --build, --hoste --target. Confondo i loro ruoli. Qual è la differenza e la semantica di loro?


Autotools utilizzerà la toolchain sbagliata per una compilazione incrociata, anche usando --hoste --build. Ho due progetti C ++ ed è impossibile crearlo per Android perché Autotools è così fottuto. Insiste sull'esecuzione di test utilizzando la toolchain dell'host.
jww

Risposte:


109

Come indicato in questo post del blog e accennato nei Termini di configurazione di GCC , --targetsi applica solo quando si compilano toolchain. Quando si esegue una normale compilazione incrociata di una libreria o di un binario, si utilizza

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

Tuttavia, quando si sta costruendo toolchain, le cose possono diventare più complicate. Penso che quanto segue sia corretto (anche se non posso dire di aver mai compilato manualmente un cross-debugger):

Diciamo che hai:

  • una build machine powerpc su cui farai tutte le compilazioni
  • diversi dispositivi incorporati, con processori mips, sui quali verrà eseguito il codice
  • un laptop x86 che utilizzerai per eseguire il debug di questi dispositivi sul campo

Dovresti configurare e costruire il tuo server di debug (ad esempio gdbserver) da eseguire sul tuo dispositivo incorporato con

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

in modo che tu possa mettere il mastice sul tuo dispositivo incorporato ed eseguire "gdbserver: 1234 a.out" per avviare il debug e ascoltare sulla porta 1234.

Dovresti quindi costruire il tuo client di debug (che si connette e controlla gdbserver) con

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

che copieresti sul tuo laptop x86 in modo che nel campo tu possa eseguire "gdbclient embedded.device: 1234" per eseguire il debug del tuo programma a.out.

Tutto ciò si applica anche ai compilatori per i quali potresti voler guardare il collegamento GCC sopra o questa sezione sulla compilazione incrociata canadese .

Si noti inoltre che, in pratica, si potrebbe non vedere build, host o target specificati perché, secondo questa pagina di manuale di Autoconf , "il target predefinito è host, host da compilare e build in base al risultato di config.guess."

In una parola, crea il codice --build, eseguilo --hostcon l' --targetambiente dell'architettura.


11
Come scoprire cosa mettere per "host" e "target"?
Nero

4
Immagino che tu stia parlando della creazione di un nuovo compilatore, poiché "--target" è rilevante solo per i compilatori. * "host" è dove dovrebbe essere eseguito il nuovo compilatore. * "target" è dove dovrebbero essere eseguiti gli eseguibili prodotti dal nuovo compilatore.
user1735594

questo non lo rende una risposta sbagliata, perché --host = i686 non è valido qui?
infocloggato il

1
La risposta fornita menziona che la compilazione è stata eseguita per il target MIPS e questa è la build e l'host è il debugger per la macchina MIPS. Questo significa che anche il debugger / compilatore è stato creato dal powerpc? Questo è un commento che ho ricevuto da un altro utente (Ned): build = dove sto compilando il compilatore, host = dove verrà eseguito il compilatore, target = quale codice produrrà il compilatore. Riferimento: stackoverflow.com/questions/7088576/...
supmethods

Secondo Ned, questo non significherebbe che il powerpc è sia il build / host, la macchina x86 un obiettivo del debugger, sia l'obiettivo come sistema MIPS. Puoi spiegare di più cosa sono "costruire per" e "costruire su"? Mi riferisco a gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods

75

Nota: l' argomento --targetha senso solo quando si costruisce un compilatore (ad esempio GCC). Quando si esegue configureprima di creare GCC:

  • --build: la macchina su cui stai costruendo
  • --host: la macchina per cui stai costruendo
  • --target: la macchina per la quale GCC produrrà il binario

Dalla documentazione di GCC ( note di installazione specifiche per host / destinazione ):

Se build, host e target sono tutti uguali, questo viene chiamato nativo. Se build e host sono uguali ma il target è diverso, si parla di cross. Se build, host e target sono tutti diversi, questo viene chiamato canadese (per oscuri motivi si tratta del partito politico canadese e del background della persona che lavorava alla build in quel momento). Se host e destinazione sono uguali, ma build è diversa, stai utilizzando un cross-compilatore per creare un nativo per un sistema diverso. Alcune persone lo chiamano host-x-host, nativo incrociato o nativo incrociato. Se build e target sono uguali, ma l'host è diverso, stai usando un cross compiler per creare un cross compiler che produce codice per la macchina su cui stai costruendo. Questo è raro, quindi non esiste un modo comune per descriverlo. C'è una proposta per chiamare questo un crossback.


2
Il che apparentemente significa che --targetnon è rilevante per nessun progetto che non sia esso stesso un compilatore. Allora perché è un'opzione di configurazione standard? Confondere.
dhardy

1
@dhardy: configurenon è esattamente l'apice del design buono e pulito; Immagino sia solo il risultato dello scorrimento delle funzionalità specifiche dell'applicazione.
Tim Čas

Se voglio ottenere un gcc, ad esempio esegui "./configure --build = powerpc --host = i686 --target = mips", l'eseguibile di output è paralizzato? di solito, gcc è uno strumento potente che può creare codice c, quindi produrre molti tipi di risultati per molte piattaforme. Qui se uso '--target = mips', il gcc specificato ha perso l'abilità?
gfan

Potrebbe funzionare anche aggiornare i file config.guess e config.sub, in modo che il compilatore conosca più piattaforme di destinazione .. puoi ottenerli qui: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.