Блог о Gentoo и около-линуксовым штукам

16 июля 2009 г.

DistCC — Руководство по кросс-компиляции

22:11 Опубликовал Дмитрий Исаенко , Нет комментариев

Собственно делать было нечего, попытался сделать что-то для русскоязычного сообщества Gentoo.
Далее предлагаю Вам прочесть черновой вариант перевода статьи DistCC Cross-compiling Guide на русский язык.
Но сначала хочется сказать спасибо alinofka, которая также внесла свой вкдад в перевод, и [HL-UBL]VSJCFM, который откорректировал.

DistCC — Руководство по межархитектурной кросс-компиляции

1. Кросс-компиляция с помощью distcc

Введение

distcc — это утилита, которая позволит вам разделить бремя компиляции программ между несколькими объеденёнными по сети компьютерами. До тех пор, пока эти сетевые хосты используют одни и те же инструментарии сборки для одинаковых процессорных архитектур, никаких специфических настроек distcc не требуется. Но что же делать, если Вам потребуется скомпилировать что-то для другой архитектуры, используемой другими компьютерами? Это руководство поможет Вам правильно сконфигурировать distcc для компиляции под различные архитектуры процессоров.

Закачка необходимых утилит.

Во-первых, Вам понадобится утановить crossdev на все компьютеры, которые будут участвовать в процессе компиляции. сrossdev — это утилита, которая делает межархитектурную настройку межплатформенного инструментария (тулчейн) легче. Она была впервые написана Джошуа Кинардом (Joshua Kinard), и позже полностью переписана Майком Фрисинджером (Mike Frysinger). Понять её применение довольно просто: crossdev -t sparc соберёт полный тулчейн, нацеленный на sparc архитектуру. Это включает в себя настройку таких пакетов, как binutils, gcc, glibc, и linux-headers. Для получения более подробной справочной информации воспользуйтесь командой crossdev —help.

Далее, если вы ещё этого не сделали, Вам потребуется скачать distcc на все участвующие в процессе компиляции машины. Это включает в себя систему, на которой будет запущена установка (собственно с целевой архитектурой), и компьютеры, участвующие в кросс-компиляции. Для получения более полной информации по настройке и использованию distcc, пожалуйста, смотрите «Описание distcc в Gentoo»

Некоторые заметки по поводу специфики архитектур.

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

Конфигурация distcc для корректной кросс-компиляции

В начальной настройке distcc межплатформенная кросс-компиляция работает некорректно. Проблема заключается в том, что многие сборки просто вызывают основной GCC взамен использования полного имени компилятора(т.е. sparc-unknown-linux-gnu-gcc).Т.е. когда компиляция будет распределена на вспомогательныую систему с distcc, вызывается родной компилятор вместо того, чтобы вызвать Ваш новый кросс-компилятор.

К счастью, есть способ обойти эту небольшую проблему. Всё решается скриптом и несколькими символическими ссылками на вспомогательных системах. Я буду использовать мою, сконфигурированную для sparc, систему в качестве примера. Везде, где Вы увидите sparc-unknown-linux-gnu, Вам стоит вставить имя вашего собственного CHOST (например x86_64-pc-linux-gnu для amd64 системы). После того, как Вы впервые установите distcc, ваша директория /usr/lib/distcc/bin будет выглядеть так:

Помните! Последующие инструкции должны быть выполнены только на компьютере, с которого в перспективе будет выполнятся emerge.

Листинг 1.1: Доступные компиляторы
# cd /usr/lib/distcc/bin
# ls -l
total 0
lrwxrwxrwx 1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc

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

Листинг 1.2: Модификация distcc

# rm c++ g++ gcc cc

Далее, мы создадим скрипт на этой-же машине. Запустите Ваш любимый текстовый редактор и создайте файл со следующим текстом (Листинг 1.3). Далее сохраните его как sparc-unknown-linux-gnu-wrapper. Не забудьте сменить CHOST (в данном случае с sparc-unknown-linux-gnu) на необходимый Вам
CHOST той архитектуры, для которой и предполагается последующая компиляция.

Листинг 1.3: Содержание скрипта
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"

Далее мы делаем скрипт исполняемым и создаём необходимые символические ссылки:

Листинг 1.4: Создание символических ссылок
# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper g++
# ln -s sparc-unknown-linux-gnu-wrapper c++

Когда вы проделаете все эти действия, директория /usr/lib/distcc/bin должна будет выглядеть следующим образом:

Листинг 1.5: Корректно настроенные компиляторы
# ls -l
total 4
lrwxrwxrwx 1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper

Поздравляем! Вы только что получили рабочую межплатформенную кросскомпиляционную установку.


Как всё это работает? (возможно некорректное изложение)

Когда вызывается distcc, он проверяет, под каким он был вызван именем(т.е. i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++ и т.п.). Когда distcc распределяет компиляцию на вспомогательные компьютеры, он проходит под тем именем, под которыми и был вызван. Далее distcc-демон ищет бинарный код с таким же именем на других вспомогательных системах . Если он видит просто GCC, то он ищет GCC, который скорее всего будет нативным компилятором вспомогательной системы, если это не та же архитектура, как та, что используется на компьютере запустившем emerge. Когда передаётся полное имя компилятора(напр. sparc-unknown-linux-gnu-gcc), то путаницы не возникает.

p.s. и немного бюрократии в соответствии с оригинальной статьёй - The contents of this document are licensed under the Creative Commons - Attribution / Share Alike license.

0 коммент.:

Отправить комментарий