Gentoo Logo

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).



Drukuj

Zaktualizowano 17 lutego 2006

Podsumowanie: Ten artykuł ukazuje w jaki sposób ustawić distcc do kompilacji skrośnej pomiędzy różnymi architekturami.

Andrew Gaffney
Autor

Joshua Saddler
Redaktor

Artur Czepiel
Tłumacz

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Bytemark

Bytemark

Linux World Expo

Linux World Expo

Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.