Distcc/Cross-Compiling/ru

Данное руководство показывает как настроить distcc на кросс-компиляцию между различными архитектурами процессоров.

Введение
- это инструмент, который позволит Вам распределить процесс компиляции программного обеспечения по нескольких компьютерам, соединенным в сеть. Пока соединенные по сети машины используют одни и те же средства компиляции и генерации кода - toolchain, никакие особенные настройки  не требуются.

Собираем необходимые утилиты
Сперва, Вам необходимо установить  на всех компьютерах, которые будут вовлечены в процесс компиляции. - это инструмент, который облегчает сборку кросс-платформенных toolchain-ов. Первоначально, он был написан Joshua Kinard и был переписан с самого нуля Mike Frysinger. Его использование достаточно прямолинейно: например, команда  соберет полную cross-toolchain для архитектуры Sparc. Она включает binutils, gcc, glibc, и заголовки ядра Linux. Если Вам требуется дополнительная помощь, попробуйте ввести. Очевидно что Вам не нужно устанавливать подходящую cross-toolchain на все вспомогательные машины.

Если вы хотите произвести более точную настройку cross-toolchain, то вот скрипт, который даст командную строку с точными версиями пакетов для кросс-разработки, которые необходимо собрать на вспомогательных машинах (скрипт нужно запускать на целевой машине).

Скрипт для изучения версий инструментов разработчика

Затем, Вам необходимо установить  на все машины, которые будут вовлечены в процесс. Это включает и машину, на которой будет запущен emerge, и машины с кросс-компиляторами. Пожалуйста, посмотрите документацию Gentoo по Distcc для поиска более подробной информации по настройке и использованию.

Подархитектуры Intel x86
Если Вы проводите кросс-компиляцию между различными субархитектурами для процессора Intel x86 (например, i586 и i686), Вам все так же требуется собрать полную cross-toolchain для необходой архитектуры, указанной в CHOST, или иначе компиляция завершится неудачей. Это потому, что i586 и i686 обладают разными архитектурами CHOST, вопреки тому, что их обе относят к "x86." Пожалуйста, держите это в уме, когда Вы собираете свои cross-toolchain-ы. Например, если целевая платформа - i586, это значит, что Вы должны построить i586 cross-toolchain-ы на Ваших вспомогательных i686 машинах.

SPARC
При использовании  может появиться одна из следующих ошибок:

Ошибки, появляющиеся при запуске crossdev -t sparc

Если это произойдет, попробуйте использовать другую команду:

Конфигурация distcc для корректной кросс-компиляции
В настройках distcc по умолчанию, кросс-компиляция не будет работать так как надо. Проблема в том, что много сборок просто вызывают, вместо полного имени компилятора (например,   ). Когда процесс компиляции распространяется на вспомогательную машину с distcc, вызывается нативный компилятор, вместо Вашего абсолютно нового кросс-компилятора.

К счастью, для этой небольшой проблемы существует решение. Все, что требуется, это оберточный сценарий и несколько символьных ссылок на том компьютере, на котором будет вызван. Будем использовать в качестве примера мой компьютер архитектуры Sparc. Ниже, где бы Вы ни видели текст, вам нужно вставить свой собственный CHOST (   для компьютера с архитектурой AMD64, например). Когда вы собираете distcc в первый раз, каталог выглядит следующим образом:

Это то, что Вам необходимо сделать:

Затем, мы создадим новый сценарий на этой машине. Запустите Ваш любимый редактор и создайте файл со следующим текстом, затем сохраните его как. Помните об изменении переменной CHOST (в данном случае  ) на действительный CHOST того компьютера, на котором будет запущен emerge.

Далее, мы сделаем сценарий исполнимым и создадим соответствующие символьные ссылки:

Когда Вы закончили, будет выглядеть следующим образом:

Далее нам нужно убедиться, что эти ссылки останутся после обновления пакета distcc, так как при этом символические ссылки будут перезаписаны. Мы можем сделать это с помощью файла, примерно такого:

/etc/portage/bashrc

Поздравляем; теперь у вас есть (надеемся) работающая настройка cross-distcc.

Как это работает
При вызове, он проверяет в качестве чего он был вызван (например,   ,   , и т.д.) Когда distcc затем передает компиляцию на вспомогательную машину, он передает название, с которым он был вызван. Демон distcc на другой вспомогательной машине затем ищет исполняемый файл с подобным именем. Если он видит только , он будет искать   , что, скорее всего, будет нативным компилятором на вспомогательной машине, если это не та же самая архитектура, как и компьютер с запущенной командой. Когда отправляется полное имя компилятора, (например,  ), путаница исключена.

Благодарности
Мы хотели бы поблагодарить следующих авторов и редакторов за их вклад в это руководство:


 * Andrew Gaffney
 * Joshua Saddler