В чем разница между опциями "./configure" "--build", "--host" и "--target"? - PullRequest
107 голосов
/ 28 февраля 2011

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

Ответы [ 2 ]

97 голосов
/ 09 апреля 2013

Как отмечено в этом сообщении в блоге и упоминается в Условиях настройки 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 , "target по умолчанию - хост, хост для сборки и сборка с результатом config.guess. "

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

68 голосов
/ 28 февраля 2011

Примечание: Аргумент --target имеет смысл только при сборке компилятора (например, GCC).При работе configure перед сборкой GCC:

  • --build: машина, на которой вы строите
  • --host: машина, для которой вы строите
  • --target: машина, на которой GCC будет производить двоичные файлы для

Из документации GCC ( Замечания по установке для хоста / цели * ):

Если build, host и target одинаковы, это называется native.Если build и host одинаковы, но target отличается, это называется крестом.Если сборка, хост и цель различны, это называется канадцем (по непонятным причинам, связанным с политической партией Канады и происхождением человека, работавшего над сборкой в ​​то время).Если хост и цель совпадают, но сборка отличается, вы используете кросс-компилятор для сборки нативного кода для другой системы.Некоторые люди называют это host-x-host, пересеченный нативный или перекрестный нативный.Если build и target одинаковы, но host отличается, вы используете кросс-компилятор для построения кросс-компилятора, который генерирует код для машины, на которой вы строите.Это редко, поэтому нет общего способа описать это.Есть предложение назвать это кроссбеком.

...