Kompilacja skrośna za pomocą DistCC w Gentoo
1.
Kompilacja skrośna z distcc
Wstęp
distcc jest narzędziem, które pozwala podzielić kompilację pomiędzy
komputery połączone w sieć. Dopóki te komputery używają tego samego toolchaina
oraz pracują na tej samej architekturze nie jest wymagana specjalna
konfiguracja distcc. Ale co zrobić, gdy w sieci znajdują się całkowicie
różne komputery? Ten poradnik pomoże skonfigurować użytkownikowi distcc
tak, aby umożliwiało współpracę pomiędzy różnymi architekturami.
Instalacja potrzebnych narzędzi
Po pierwsze musimy zainstalować pakiet crossdev na wszystkich
komputerach, które będą wykorzystywane w procesie kompilacji. crossdev
jest narzędziem, które ułatwia kompilację na róznych architekturach
jednocześnie. Napisał go Joshua Kinard,
potem program został przepisany od podstaw przez Mike'a Frysingera. Jego użycie jest proste:
crossdev -t sparc zbuduje pełny skrośny toolchain ukierunkowany na
architekturę Sparc. W skład toolchaina wchodzą: binutils, gcc, glibc, oraz
linux-headers. Jeżeli potrzebujemy pomocy, możemy wpisać crossdev
--help. Najprawdopodobniej zajdzie potrzeba instalacji odpowiednich
skrośnych toolchainow na wszystkich komputerach pomagających w kompilacji.
Następnie trzeba zainstalowaćdistcc na wszystkich komputerach, które
zostaną użyte w procesie kompilacji. Czyli komputer na którym będzie działać
emerge oraz na wszystkich z kompilacją skrośną. Po więcej informacji na temat
używania i konfiguracji distcc należy zajrzeć do dokumentu Praca z distcc w Gentoo.
Informacje specyficzne dla różnych architektur
Jeżeli kompilujemy skrośnie pomiędzy podarchitekturami x86 (np. i586 i i686),
wciąż musimy zbudować pełny skrośny toolchain dla odpowiednich ustawień CHOST,
w przeciwnym wypadku kompilacja nie powiedzie się. Dzieje się tak ponieważ i586
i i686 są aktualnie innymi ustawieniami CHOST, pomimo faktu przynależenia do
x86. Najlepiej więc o tym pamiętać podczas budowania skrośnych toolchainów.
Dla przykładu, jeżeli celem jest komputer i586, oznacza to iż musimy zbudować
cross-toolchain dla i586 na naszym i686 który będzie pomagał w kompilacji.
Konfiguracja distcc do poprawnej kompilacji skrośnej
Przy domyślnych ustawieniach distcc kompilacja skrośna nie będzie działać
poprawnie. Problemem jest to, iż wiele programów podczas budowania będzie
wywoływać gcc zamiast pełnej nazwy kompilatora (np.
sparc-unknown-linux-gnu-gcc). W momencie gdy kompilacja jest rozpraszana
do komputerów pomagających w kompilacji, zostanie wywołany lokalny kompilator
zamiast nowego skrośnego kompilatora.
Na szczęście jest rozwiązanie dla tego małego problemu. Wszystko co potrzebne
to 'wrapper script' oraz kilka dowiązań symbolicznych na komputerze na którym
uruchomimy emerge. Użyjemy tu architektury Sparc jako przykładu.
Gdziekolwiek poniżej ujrzymy sparc-unknown-linux-gnu, będzie to oznaczać
iż powinniśmy tam wstawić naszą zmienną CHOST (np. x86_64-pc-linux-gnu
dla AMD64). Kiedy pierwszy raz zainstalujemy distcc, folder
/usr/lib/distcc/bin powinien wyglądać mniej więcej tak:
Uwaga:
Poniższe instrukcje są przygotowane tylko dla komputera na którym uruchomimy
emerge. Nie należy wykonywać ich na komputerach które wspomagają kompilację.
|
Listing 1.1: Dostępne kompilatory |
# 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
|
Oto co powinniśmy zrobić:
Listing 1.2: Modyfikowanie distcc |
# rm c++ g++ gcc cc
|
Następnie zrobimy nowy skrypt. Otwórzmy zatem nasz ulubiony edytor i stwórzmy
plik sparc-unknown-linux-gnu-wrapper do którego wstawimy poniższych
kilka linijek. Pamiętając o zmianie ustawień CHOST (w tym wypadku,
sparc-unknown-linux-gnu) na ustawienie z komputera na którym uruchomimy
emerge.
Listing 1.3: Nowy `wrapper script` |
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
|
Następnie nadamy mu atrybut wykonywalności i utworzymy odpowiednie dowiązania
symboliczne:
Listing 1.4: Tworzenie dowiązań symbolicznych |
# 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++
|
Gdy skończymy /usr/lib/distcc/bin powinno wyglądać tak:
Listing 1.5: Ustawienie właściwych kompilatorów |
# 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
|
Gratulacje! Właśnie poprawnie skonfigurowaliśmy skrośne distcc.
Jak to działa?
W momencie wywołania distcc sprawdza przez co zostało wywołane (np.
i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++, itd.) i wysyła
odpowiednie informacje do komputera, który pomaga w kompilacji (m.in nazwę
kompilatora). Demon distcc na tym pomagającym komputerze wywołuje binarkę o
takiej samej nazwie. Jeżeli otrzyma informacje o gcc, uruchomi
gcc, które z reguły jest natywnym kompilatorem na pomagającym komputerze
i najprawdopodobniej nie będzie działać dobrze jeżeli nie jest to ta sama
architektura co na komputerze wywołującym emerge. Nie powinno być
natomiast żadnych problemów kiedy zostanie przesłana pełna nazwa
kompilatora (np. sparc-unknown-linux-gnu-gcc).
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|