В чем разница между параметрами «./configure», «--build», «--host» и «--target»?

121

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

eonil
источник
Autotools будет использовать неправильный набор инструментов для кросс-компиляции, даже используя --hostи --build. У меня есть два проекта на C ++, и их невозможно собрать для Android, потому что Autotools сильно испорчен. Он настаивает на запуске тестов с использованием цепочки инструментов хоста.
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архитектурной средой.

user124850
источник
11
Как узнать, что поставить для "хоста" и "цели"?
Black
4
Я предполагаю, что вы говорите о создании нового компилятора, поскольку "--target" актуально только для компиляторов. * "host" - это место, где должен работать ваш новый компилятор. * «target» - это место, где должны запускаться исполняемые файлы, созданные вашим новым компилятором.
user1735594
Разве это не означает, что это неправильный ответ, потому что --host = i686 здесь недопустим?
сообщено в инфо-журнале
1
В предоставленном ответе упоминается, что компиляция была выполнена для цели MIPS, и это сборка, а хост - отладчик для машины MIPS. Означает ли это, что отладчик / компилятор также был создан powerpc? Это комментарий, который я получил от другого пользователя (Ned): build = где я компилирую компилятор, host = где компилятор будет запускаться, target = какой код будет генерировать компилятор. Ссылка: stackoverflow.com/questions/7088576/…
supmethods
По словам Неда, не означает ли это, что powerpc одновременно является сборкой / хостом, машина x86 является целью отладчика, а цель - системой MIPS. Не могли бы вы подробнее объяснить, что такое «строительство для» и «развитие»? Я ссылаюсь на gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods
75

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

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

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

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

Делан Азабани
источник
2
Это, по-видимому, означает, что --targetэто не относится к любому проекту, который сам не является компилятором. Так почему же это стандартный вариант конфигурации? Смешение.
dhardy 03
1
@dhardy: configureне совсем удачный и чистый дизайн; Я предполагаю, что это просто результат расползания функций конкретного приложения.
Тим Час
Если я хочу получить gcc, например, запустите "./configure --build = powerpc --host = i686 --target = mips", испорчен ли выходной исполняемый файл? Обычно gcc - это мощный инструмент, который может создавать код на языке C, а затем выводить различные результаты для многих платформ. Здесь, если я использую '--target = mips', не теряет ли указанный gcc способность?
gfan
Что также может работать, чтобы обновить config.guess и config.sub файлы, так что компилятор знает больше целевых платформ .. Вы можете получить их здесь: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi