Какая разница в опции "./configure" "--build", "--host" и "--target"?

script ./configure принимает 3 опции --build, --host и --target. Я запутываю их роли. Какая разница и семантика?

Ответ 1

Как отмечено в этом сообщении в блоге и упоминается в GCC Configure Terms, --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 архитектурной средой.

Ответ 2

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

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

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

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