HOWTO Кросскомпиляция
Материал из Gentoo Linux Wiki
Содержание |
[править] Зачем оно надо
Заставим distcc компилировать на других системах(архитектурах).
[править] Установка кросс-компилятора под Linux для другой платформы
[править] Установка crossdev
Для установки кросс-компиляторов в gentoo существует пакет crossdev:
emerge sys-devel/crossdev.
Далее необходимо настроить какой-либо PORTDIR_OVERLAY, например /usr/local/portage. Для этого необходимо создать директорию: /usr/local/portage и добавить строку PORTDIR_OVERLAY=/usr/local/portage в файл /etc/make.conf. Сделать это можно командами:
| Code: root@localhost:~ |
mkdir /usr/local/portage echo PORTDIR_OVERLAY=/usr/local/portage >> make.conf |
crossdev -t i686 nptl nptlonly dev-libs/mpfr
[править] Настройка кросс-компилятора под Linux для Windows
Для компиляции Windows приложений под Linux необходимо установить XMinGW. Для этого необходимо следующее:
| Code: root@localhost:~ |
emerge dev-util/xmingw-binutils emerge dev-util/xmingw-runtime |
После этого необходимо поставить пакеты:
| Code: root@localhost:~ |
dev-util/xmingw-gcc dev-util/xmingw-w32api |
| Примечание: Если установить dev-util/xmingw-gcc до emerge dev-util/xmingw-runtime то не будет скомпилирован компилятор для языка C++. |
[править] Компиляция приложений
[править] Настройка distcc для работы с кросс-компилятором
| Примечание: В данном разделе подразумевается, что distcc у Вас уже установлен. Как его установить можно прочитать в статье: HOWTO Ускорение компиляции при помощи distcc. |
Как показала практика, distcc в поставке "из коробки" не использует кросс-компиляцию. Связано это со следующей особенностью его работы: он пытается вызвать на удаленной машине тот же компилятор, что и на локальной машине. То есть, например, если Вы вызвали на i686 компилятор командой "g++", то на удаленной машине (допустим, AMD64) он то же вызовет "g++", но этот "g++" будет уже под AMD64.
Для исправления этой проблемы надо обернуть distcc скриптом, подставляющим ему полное имя компилятора, включающего в себя название платформы. В данный момент речь идет о настройке distcc на клиентских машинах
После установки distcc символические ссылки должны были выглядеть примерно следующим образом:
| Code: root@localhost:~ |
# cd /usr/lib/distcc/bin # ls -l total 10 drwxr-xr-x 2 root root 4096 Июн 4 15:24 . drwxr-xr-x 3 root root 4096 Авг 23 2005 .. lrwxrwxrwx 1 root root 15 Авг 23 2005 c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 cc -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 gcc -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-gcc -> /usr/bin/distcc |
| Примечание: В данном конкретном случае у меня компьютер архитектуры i686-pc-linux-gnu. У Вас он может быть любой другой. Поэтому здесь и далее все i686-pc-linux-gnu надо заменить на название архитектуры вашего компьютера. |
Первым делом удаляем старые сслыки:
rm c++ cc g++ gcc
Затем созаем скрипт-обертку:
| Файл: /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper |
#!/bin/bash
exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"
|
| Файл: Выполним |
# chmod a+x /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper |
И создаем на него символические ссылки:
| Code: root@localhost:/usr/lib/distcc/bin |
# ln -s /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper c++ # ln -s /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper cc # ln -s /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper g++ # ln -s /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper gcc |
В результате мы должны получить следующую картину:
| Code: root@localhost:~ |
# cd /usr/lib/distcc/bin # ls -l total 11 drwxr-xr-x 2 root root 4096 Июн 4 15:24 . drwxr-xr-x 3 root root 4096 Авг 23 2005 .. lrwxrwxrwx 1 root root 25 Июн 4 15:22 c++ -> i686-pc-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Июн 4 15:22 cc -> i686-pc-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Июн 4 15:22 g++ -> i686-pc-linux-gnu-wrapper lrwxrwxrwx 1 root root 25 Июн 4 15:22 gcc -> i686-pc-linux-gnu-wrapper lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-c++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-g++ -> /usr/bin/distcc lrwxrwxrwx 1 root root 15 Авг 23 2005 i686-pc-linux-gnu-gcc -> /usr/bin/distcc -rwxr-xr-x 1 root root 72 Июн 4 15:24 i686-pc-linux-gnu-wrapper |
