Disclaimer :
Dit document is niet juist en is niet meer onderhouden.
|
De distcc Cross-compilatie Gids
1.
Cross-compilatie met distcc
Inleiding
distcc is een hulpmiddel dat je toelaat om het werk dat een
softwarecompilatie met zich meebrengt, te verdelen over meerdere computers in
een netwerk. Zolang al die computers dezelfde hulpmiddelen gebruiken en dat
gereedschap gebouwd is voor dezelfde architectuur gebruiken, is er geen speciale
distcc-instelling nodig.
Maar wat als je wil compileren voor een andere architectuur met verschillende
computers? Deze gids zal je tonen hoe je distcc instelt om voor
verschillende architecturen te compileren.
Installeer de nodige hulpmiddelen
Je moet beginnen met crossdev te installeren op alle machines die in het
compilatieproces zullen betrokken worden. crossdev is een programma dat
het je gemakkelijk maakt gereedschap voor meerder architecturen te bouwen. Het
is oorspronkelijk geschreven door Joshua
Kinard en volledig van niets herschreven door
Mike Frysinger. Het gebruik is heel
eenvoudig: crossdev -t sparc zal de volledige gereedschapskist bouwen die
nodig is voor de Sparc-architectuur. Dit bevat binutils, gcc, glibc en
linux-headers. Als je meer hulp wil, voer dan crossdev --help uit. Je
moet natuurlijk het nodige gereedschap installeren op alle computers die gaan
helpen met de compilatie.
Vervolgens moet je distcc installeren op alle machines die betrokken
worden in het proces. Dit omvat ook het systeem dat het emerge commando zal
uitvoeren, samen met de systemen voor cross-compilatie. Zie de
Gentoo distcc documentatie voor meer
informatie over het instellen en gebruiken van distcc.
Architectuurspecifieke opmerkingen
Als je wil cross-compileren tussen verschillende subarchitecturen voor Intel x86
(bvb. i586 en i686), moet je ook het volledige cross-compilatiegereedschap
bouwen voor de gewenste CHOST, anders zal de compilatie mislukken. Dit komt
doordat i586 en i686 verschillende CHOSTs zijn, ondanks het feit dat ze beiden
onder de noemer "x86" vallen. Hou dit in het achterhoofd bij de bouw van je
gereedschap. Als bijvoorbeeld het doel een i586-computer is, dan moet je het
i586-gereedschap bouwen op alle i686-hulpcomputers.
distcc instellen om correct te cross-compileren
In de standaard distcc-opzet, zal cross-compilatie niet naar wens werken. Het
probleem is dat veel ebuilds gewoon gcc oproepen in plaats van de
volledige naam van de compiler (bvb. sparc-unknown-linux-gnu-gcc).
Wanneer deze compilatie verdeeld wordt naar een hulpcomputer, zal de gewone
compiler opgeroepen worden i.p.v. je nieuwe cross-compiler.
Gelukkig kan je om dit probleem heen werken. Het enige dat je nodig hebt is een
inpakscript en een paar symbolische linken op het systeem dat
emerge uitvoert. Ik gebruik mijn Sparc als voorbeeld. Overal waar je
hieronder sparc-unknown-linux-gnu ziet staan, moet je je eigen CHOST
invullen (bvb. x86_64-pc-linux-gnu voor een AMD64). Wanneer je distcc
voor het eerst installeert zal de map /usr/lib/distcc/bin er als
volgt uitzien:
Nota:
De volgende instructies moeten enkel uitgevoerd worden op het systeem dat
emerge oproept. Voer ze niet uit op de hulpcomputers.
|
Codevoorbeeld 1.1: Beschikbare compilers |
# 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
|
Dit is wat je wil doen:
Codevoorbeeld 1.2: distcc wijzigen |
# rm c++ g++ gcc cc
|
Vervolgens maken we een script op dit systeem. Start je favoriete tekstverwerker
en maak een bestand met onderstaande tekst in en sla het op als
sparc-unknown-linux-gnu-wrapper. Denk eraan om de CHOST (in dit
geval sparc-unknown-linux-gnu) aan te passen aan de CHOST van het systeem
dat emerge uitvoert.
Codevoorbeeld 1.3: Het nieuwe inpakscript |
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
|
Nu maken we het script uitvoerbaar en leggen we de nodige symbolische linken:
Codevoorbeeld 1.4: De symbolische linken leggen |
# 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++
|
Wanneer je klaar bent, zal /usr/lib/distcc/bin er als volgt
uitzien:
Codevoorbeeld 1.5: Een goede set compilers |
# 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
|
Proficiat! Je beschikt nu (hopelijk) over een werkende cross-distcc opzet.
Hoe dit werkt
Wanneer distcc wordt opgeroepen, controleert het om te zien hoe hij
genoemd werd (bvb. i686-pc-linux-gnu-gcc,
sparc-unknown-linux-gnu-g++, enz.) Wanneer distcc dan de compilatie
verdeeld naar een hulpcomputer, geeft hij de gegeven naam mee. De distcc
op de hulpcomputer zoekt dan een programma met dezelfde naam. Als het gewoon
gcc ziet, zal het naar gcc zoeken, wat waarschijnlijk uitkomt
bij de compiler van de hulpcomputer, met alle gevolgen vandien indien het niet
dezelfde architectuur is als het systeem dat emerge uitvoert. Wanneer
de volledige naam van de compiler wordt verstuurd (bvb.
sparc-unknown-linux-gnu-gcc), is er geen verwarring mogelijk.
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|