Кросс-DistCC в Gentoo

Опубликовано 5 Октября, 2009 под тегами Compilation, Distcc, Gentoo, Cheats, Gentoo, Soft

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

На самом деле, все довольно просто. Чтобы настроить кросс-тулчейн, в комплект стандартной поставки Gentoo входит замечательная утилита crossdev. Устанавливается она из портеджей. Чтобы посмотреть, какие архитектуры она умеет, нужно сделать

crossdev -t help

. Чтобы собрать кросс-тулчейн, нужно выполнить

crossdev -t arch

где arch – требуемая архитектура, например, x86_64. Следует, однако, заметить, что для правильной работы crossdev нужен настроенный локальный оверлей и его путь должен быть первым в списке оверлеев. Таким образом, если вы используете layman, make.conf должен выглядеть примерно следующим образом:

#Here we setup PORTDIR_OVERLAY so that first one is /usr/local/portage
PORTDIR_OVERLAY=""
source /usr/local/portage/layman/make.conf
PORTDIR_OVERLAY="/usr/local/portage
${PORTDIR_OVERLAY}"

Итак, после установки кросс-компилятора, distcc должен сам его понять и утилизировать. Однако, вскоре вы заметите, что некоторые ебилды ставятся нормально, в то время как другие выпадают с ошибками компиляции. Это происходит потому, что нередко ебилды используют не полное название компилятора (например, i686-pc-linux-gnu-gcc), а сокращенное (gcc). distcc вызывает соответственно gcc удаленной машины и обламывается, получив на 64-битной архитектуре 32-битный объектный файл. Чтобы этого избежать, достаточно сделать на distcc-клиенте следующее: 1. Создать скрипт /usr/lib/distcc/bin/${CHOST}-wrapper, где ${CHOST} – это CHOST из make.conf, следующего содержания:

#!/bin/bash
exec /usr/lib/distcc/bin/${CHOST}-g${0:$[-2]} "$@"

и сделать его исполняемым. 2. Сделать так, чтобы симлинки в /usr/lib/distcc/bin указывали на этот скрипт:

cd /usr/lib/distcc/bin
rm cc c++ g++ gcc
echo cc c++ g++ gcc | xargs -n1 ln -s ${CHOST}-wrapper

, не забыв заменить ${CHOST} на его значение (или сделать source /etc/make.conf).

После этого distcc будет работать с кросс-компилятором.

Еще одно замечание: при сборке x86 на x86_64-процессорах, можно вместо честного кросс-компилятора выполнять x86_64-pc-linux-gnu-* с параметром -m32, однако этот метод, вообще говоря, неподдерживаемый и я не гарантирую его работоспособность. Используйте на свой страх и риск.

Ссылки по теме: Gentoo Linux Documentation - DistCC cross-compiling guide