Quelle est la différence entre les options «./configure», «--build», «--host» et «--target»?

121

Le script ./configureaccepte 3 options --build, --hostet --target. Je confond leurs rôles. Quelle est leur différence et leur sémantique?

éonil
la source
Autotools utilisera la mauvaise chaîne d'outils pour une compilation croisée, même en utilisant --hostet --build. J'ai deux projets C ++ et il est impossible de construire pour Android car Autotools est tellement f ** k'd up. Il insiste pour exécuter des tests en utilisant la chaîne d'outils de l'hôte.
jww

Réponses:

109

Comme indiqué dans ce billet de blog et auquel il est fait allusion dans les conditions de configuration de GCC , --targetne s'applique que lorsque vous compilez des chaînes d'outils. Lorsque vous effectuez une compilation croisée normale d'une bibliothèque ou d'un binaire que vous utilisez

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

Toutefois, lorsque vous êtes construire toolchains, les choses peuvent se compliquer. Je pense que ce qui suit est correct (bien que je ne puisse pas dire que j'ai déjà compilé manuellement un débogueur croisé):

Disons que vous avez:

  • une machine de construction powerpc sur laquelle vous allez faire toute la compilation
  • plusieurs périphériques embarqués, avec des processeurs mips, sur lesquels votre code va s'exécuter
  • un ordinateur portable x86 que vous allez utiliser pour déboguer ces appareils sur le terrain

Vous configurez et construisez votre serveur de débogage (par exemple gdbserver) pour qu'il s'exécute sur votre appareil intégré avec

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

afin que vous puissiez coller sur votre périphérique embarqué et exécuter "gdbserver: 1234 a.out" pour démarrer le débogage et écouter sur le port 1234.

Vous construirez alors votre client de débogage (qui se connecte et contrôle le gdbserver) avec

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

que vous copieriez sur votre ordinateur portable x86 afin que dans le champ vous puissiez exécuter "gdbclient embedded.device: 1234" afin de déboguer votre programme a.out.

Tout cela s'applique également aux compilateurs pour lesquels vous voudrez peut-être consulter le lien GCC ci-dessus ou cette section sur la compilation croisée canadienne .

Notez également que, dans la pratique, il se peut que vous ne voyiez pas la build, l'hôte ou la cible spécifiés car, selon cette page de manuel Autoconf , "la cible est par défaut l'hôte, l'hôte à construire et la génération au résultat de config.guess."

En un mot, construisez le code --build, exécutez-le --hostavec l' --targetenvironnement d'architecture.

user124850
la source
11
Comment savoir quoi mettre pour «hôte» et «cible»?
Noir
4
Je suppose que vous parlez de construire un nouveau compilateur, car "--target" n'est pertinent que pour les compilateurs. * "host" est l'endroit où votre nouveau compilateur doit s'exécuter. * "cible" est l'endroit où les exécutables produits par votre nouveau compilateur doivent s'exécuter.
user1735594
cela ne fait-il pas cela comme une mauvaise réponse, car --host = i686 n'est pas valide ici?
enregistré
1
La réponse fournie mentionne que la compilation a été faite pour la cible MIPS et c'est la construction, et l'hôte est le débogueur pour la machine MIPS. Cela signifie-t-il que le débogueur / compilateur a également été construit par le powerpc? C'est un commentaire que j'ai reçu d'un autre utilisateur (Ned): build = où suis-je en train de compiler le compilateur, host = où le compilateur s'exécutera, target = quel code le compilateur produira. Référence: stackoverflow.com/questions/7088576/…
supmethods
Selon Ned, cela ne signifierait-il pas que le powerpc est à la fois le build / host, la machine x86 une cible du débogueur et la cible en tant que système MIPS. Pouvez-vous expliquer davantage ce qu'est «construire pour» et «construire sur»? Je fais référence à gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods
75

Remarque: l' argument --targetn'a de sens que lors de la construction du compilateur (par exemple GCC). Lors de l'exécution configureavant la construction de GCC:

  • --build: la machine sur laquelle vous construisez
  • --host: la machine pour laquelle vous construisez
  • --target: la machine pour laquelle GCC produira le binaire

À partir de la documentation GCC ( notes d'installation spécifiques à l'hôte / cible ):

Si la construction, l'hôte et la cible sont identiques, cela s'appelle un natif. Si la construction et l'hôte sont identiques mais que la cible est différente, cela s'appelle une croix. Si la construction, l'hôte et la cible sont tous différents, cela s'appelle un Canadien (pour des raisons obscures concernant le parti politique du Canada et les antécédents de la personne travaillant sur la construction à ce moment-là). Si l'hôte et la cible sont identiques, mais que la construction est différente, vous utilisez un compilateur croisé pour créer un natif pour un système différent. Certaines personnes appellent cela un hôte-x-hôte, un natif croisé ou un natif croisé. Si la construction et la cible sont identiques, mais que l'hôte est différent, vous utilisez un compilateur croisé pour créer un compilateur croisé qui produit du code pour la machine sur laquelle vous construisez. C'est rare, il n'y a donc pas de manière courante de le décrire. Il y a une proposition pour appeler cela un crossback.

Delan Azabani
la source
2
Ce qui signifie apparemment --targetn'est pertinent pour aucun projet qui n'est pas lui-même un compilateur. Alors pourquoi est-ce une option de configuration standard? Déroutant.
dhardy
1
@dhardy: configuren'est pas exactement le summum du design bon et propre; Je suppose que c'est juste le résultat de la dérive des fonctionnalités spécifiques à l'application.
Tim Čas
Si je veux obtenir un gcc, par exemple, lancez "./configure --build = powerpc --host = i686 --target = mips", l'exécutable de sortie est-il paralysé? généralement, gcc est un outil puissant qui peut créer du code c, puis générer de nombreux types de résultats pour de nombreuses plates-formes. Ici, si j'utilise '--target = mips', le gcc spécifié a-t-il perdu la capacité?
gfan
Ce qui pourrait également fonctionner est de mettre à jour les fichiers config.guess et config.sub, afin que le compilateur connaisse plus de plates-formes cibles .. vous pouvez les obtenir ici: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi