У чому різниця опцій "./configure" "--build", "--host" та "- target"?


121

Скрипт ./configureприймає 3 варіанти --build, --hostі --target. Я плутаю їх ролі. Яка різниця та семантика їх?


Autotools використовуватиме неправильну ланцюжок інструментів для перехресної компіляції, навіть використовуючи --hostта --build. У мене є два C ++ проекти, і це неможливо створити для Android, оскільки Autotools настільки f ** k'd вгору. Він наполягає на запуску тестів за допомогою інструментальної мережі хоста.
jww

Відповіді:


109

Як зазначено в цій публікації в блозі і на яку згадується в Умовах конфігурування GCC , --targetзастосовується лише тоді, коли ви збираєте ланцюги інструментів. Коли ви робите звичайну перехресну компіляцію використовуваної бібліотеки чи двійкових файлів

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

Тим НЕ менше, коли ви будете будувати компілюють інструменти, речі можуть отримати більш складні. Я думаю, що правильне наступне (хоча я не можу сказати, що коли-небудь вручну компілював перехресний налагоджувач):

Скажімо, що у вас є:

  • машина побудови powerpc, на якій ви збираєтеся робити всі компіляції
  • кілька вбудованих пристроїв з процесорами mips, на яких буде працювати ваш код
  • ноутбук x86, який ви збираєтеся використовувати для налагодження цих пристроїв у польових умовах

Ви б налаштували і створили ваш сервер налагодження (наприклад, gdbserver) для роботи на вбудованому пристрої

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

щоб ви могли нанести шпаклівку на свій вбудований пристрій і запустити "gdbserver: 1234 a.out", щоб почати налагодження і слухати на порту 1234.

Потім ви створили б свого клієнта налагодження (який підключається до gdbserver і керує ним) за допомогою

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

який ви скопіювали на свій ноутбук x86, щоб у полі можна було запустити "gdbclient embedded.device: 1234" для налагодження вашої програми a.out.

Це все стосується і компіляторів, для яких ви можете переглянути посилання GCC вище або цей розділ про канадський перехресний компілятор .

Також зауважте, що на практиці ви не можете побачити вказані збірки, хости або цілі, оскільки, згідно з цією сторінкою керівництва Autoconf , "орієнтовано за замовчуванням на хост, хост для збирання та побудову до результату config.guess".

Словом, побудуйте код --build, запустіть його --hostз --targetархітектурним середовищем.


11
Як дізнатися, що поставити для "хост" та "ціль"?
Чорний

4
Я думаю, ви говорите про створення нового компілятора, оскільки "--target" стосується лише компіляторів. * "хост" - це місце, де повинен працювати ваш новий компілятор. * "target" - це те, де повинні працювати виконувані файли, створені вашим новим компілятором.
користувач1735594

хіба це не робить це неправильною відповіддю, тому що --host = i686 тут не дійсний?
infoclogged

1
У відповіді було зазначено, що компіляція була зроблена для цілі MIPS, і це збірка, а хост - це налагоджувач машини MIPS. Чи означає це, що налагоджувач / компілятор також був побудований powerpc? Це коментар, який я отримав від іншого користувача (Ned): build = де я компілюю компілятор, host = де буде працювати компілятор, target = який код буде створювати компілятор. Довідка: stackoverflow.com/questions/7088576 / ...
supmethods

За словами Неда, чи не це означатиме, що powerpc є і збіркою / хостом, х86 машина ціллю налагоджувача, так і ціллю як система MIPS. Чи можете ви пояснити більше, що таке "будівництво для" та "будівництво на"? Я посилаюся на gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
супметоди

75

Примітка: Аргумент --targetмає сенс лише при складанні компілятора (наприклад, GCC). Під час запуску configureперед створенням GCC:

  • --build: машина, на якій ви будуєте
  • --host: машина, яку ви будуєте
  • --target: машина, для якої GCC виробляє двійковий код

З документації GCC ( конкретні примітки щодо встановлення хоста / цілі ):

Якщо збірка, хост і ціль однакові, це називається нативним. Якщо збірка та хост однакові, але ціль відрізняється, це називається хрестом. Якщо будувати, розміщувати та націлювати все - це різниця, це називається канадським (з незрозумілих причин, що стосуються політичної партії Канади та передумови людини, яка працювала над будівництвом на той час). Якщо хост і ціль однакові, але збірка відрізняється, ви використовуєте крос-компілятор для створення нативного для іншої системи. Деякі люди називають це хостом-x-хостом, перехрещеним рідним або перетвореним натурою. Якщо збірка та ціль однакові, але хост відрізняється, ви використовуєте крос-компілятор для створення компілятора перехресних даних, який створює код для машини, на якій ви будуєте. Це рідко, тому немає загального способу її опису. Є пропозиція назвати це перехресним.


2
Що, мабуть, означає --target, що не стосується жодного проекту, який сам по собі не є компілятором. То чому це стандартний варіант налаштування? Заплутаний.
безтурботний

1
@dhardy: configureне зовсім вершина хорошого та чистого дизайну; Я думаю, це лише результат повзучості функції, що залежить від програми.
Тім Час

Якщо я хочу отримати gcc, наприклад, запустити "./configure --build = powerpc --host = i686 --target = mips", чи є показовий файл виконаний каліком? Зазвичай, gcc - це потужний інструмент, який може створювати код коду, а потім виводити результат для багатьох платформ. Тут, якщо я використовую '--target = mips', чи вказаний gcc втратив здатність?
gfan

Також може бути оновлено файли config.guess та config.sub, тому компілятор знає більше цільових платформ. Ви можете отримати їх тут: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.