Distcc/Cross-Compiling/ru

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

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

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

Если вы хотите произвести более точную настройку cross-toolchain’а, то вот скрипт, который генерирует команду с точными версиями 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