Distcc/Keresztfordítás
Ez az útmutató bemutatja az olvasónak, hogy miként állíthatja be a distcc szoftvert különböző processzor-architektúrák közötti keresztfordításhoz.
Keresztfordítás distcc segítségével
Bevezetés
A distcc egy olyan szoftvereszköz, amely lehetővé teszi, hogy a szoftverfordítás terhét több hálózatra kapcsolt számítógép között megossza. Amennyiben a hálózatra kapcsolt számítógépek ugyanazt az eszközláncot használják, amely ugyanarra a processzor-architektúrára készült, nincs szükség különleges distcc beállításra.
Ez az útmutató útmutatást ad a distcc beállítására különböző architektúrákra történő fordításhoz.
A distcc kódfordítási idővel kapcsolatos problémákat okozhat, például a bug #691544 hibát, ezért az ilyen problémák esetén az első hibaelhárítási lépés az kell legyen, hogy letiltjuk a distcc szotvert, és megnézzük, hogy ez megoldja-e a problémát.
Egy második, gyorsabb számítógép használata bináris szoftvercsomagok készítéséhez és a bináris szoftvercsomag fogadó beállítása a keresztfordításhoz előnyösen helyettesítheti a distcc egyes használati eseteit. Ez könnyebben beállítható lehet, és minden kódfordítót és létrehozási rendszert lefed.
Szükséges segédprogramok telepítése
Először telepítenie kell a crossdev segédprogramot minden olyan számítógépen, amely részt vesz a kódfordítási folyamatban. A crossdev egy szoftvereszköz, amely megkönnyíti a különböző architektúrákra vonatkozó eszközláncok létrehozását. Használata egyszerű: A crossdev -t sparc parancs egy teljes kereszt-eszközláncot épít a Sparc architektúra célzására. Ez magában foglalja a binutils-t, a gcc-t, a glibc-t és a linux-headers-t.
Az összes segítő számítógépen telepítenie kell a megfelelő kereszt-eszközláncot. Ha további segítségre van szüksége, akkor próbálja meg futtatni a crossdev --help parancsot.
Ha finomhangolni szeretné a kereszt-eszközláncot, itt egy script, amely előállít egy parancssort a segítő számítógépeken létrehozandó keresztfejlesztési szoftvercsomagok pontos verzióival (a scriptet a célgépen kell futtatni).
#!/bin/bash
BINUTILS_VER=$(qatom -F '%{PV}' $(qfile -v $(realpath /usr/bin/ld) | cut -d' ' -f1))
GCC_VER=$(qatom -F '%{PV}' $(qfile -v $(realpath /usr/bin/gcc) | cut -d' ' -f1))
KERNEL_VER=$(qatom -F '%{PV}' $(qlist -Ive sys-kernel/linux-headers))
LIBC_VER=$(qatom -F '%{PV}' $(qlist -Ive sys-libs/glibc))
echo "crossdev --b '~${BINUTILS_VER}' --g '~${GCC_VER}' --k '~${KERNEL_VER}' --l '~${LIBC_VER}' -t $(portageq envvar CHOST)"
Ezután telepítenie kell a distcc segédprogramot minden olyan számítógépen, amely részt vesz a folyamatban. Ez magában foglalja azt a számítógépet is, amelyen az emerge futni fog, valamint azokat a számítógépeket, amelyeken a keresztfordítók találhatók. A distcc beállításáról és használatáról további információt a Gentoo Distcc Documentation leírásban talál.
A crossdev jelenlegi verzióiban elérhető a
-S
(--stable
) kapcsoló, amely lehetővé teszi csak stabil verziók telepítését a kódfordító szoftvereszközök számára. (Például: crossdev -t i686-pc-linux-gnu --stable --ex-gcc --ex-gdb --portage --pretend). Ennek az opciónak a hiányában a crossdev a legújabb kísérleti kódfordító szoftvereszköz szoftvercsomagokat telepíti! Máskülönben a fent említett script már nem szükséges, kivéve ha specifikus verziók az szoftvereszköz szoftvercsomagokból és/vagy a fejlécekből fel vannak oldva.Architektúra-specifikus megjegyzések
Az architektúra nevét a célfordítás CHOST változójának ellenőrzésével szerezheti meg a /etc/make.conf fájlban. Ha az architektúra nevét átalakítja a crossdev -t opcióhoz, a crossdev gond nélkül kitalálja, és az átalakított architektúra nevet használva eszközöket telepít a könyvtárnevekhez a /usr alatt (például /usr/i686-pc-linux-gnu/, /usr/i686-linux-gnu/, ...). Ennek megoldásához minden átalakított architektúra/könyvtárnevet adjon meg a crossdev --clean parancsnak a telepített eszközök eltávolításához, vagy kézzel távolítsa el a könyvtárakat a rendszerből.
Intel x86 al architektúrák
Ha különböző al architektúrák között végez keresztfordítást Intel x86 esetében (pl. i586 és i686), akkor teljes kereszt-eszközláncot kell készítenie a kívánt CHOST számára, ellenkező esetben a kódfordítás sikertelen lesz. Ennek oka, hogy az i586 és i686 valójában különböző CHOST-ok, annak ellenére, hogy mindkettőt "x86"-nak tekintik. Kérjük, tartsa ezt szem előtt, amikor kereszt-eszközláncokat készít. Például, ha a célgép i586, ez azt jelenti, hogy i586 kereszt-eszközláncokat kell építenie az i686 segítő számítógépeken.
SPARC
A crossdev -t sparc használata az alábbi hibák egyikével sikertelen lehet:
linker with -z relro support required
support for the tls_model attribute is required
this configuration requires -mlong-double-128 support
Ha ez történik, akkor próbálja meg helyette az alábbi parancsot használni:
user $
crossdev --lenv "CC=sparc-unknown-linux-gnu-gcc" -t sparc-unknown-linux-gnu
A distcc helyes beállítása a keresztfordítás számára
Az ebben a szakaszban leírt kerülőmegoldás már nem szükséges a distcc-3.2 verzió óta, mivel a kódfordító hívások teljes fordítónevével történő helyettesítésének funkciója azóta meg lett valósítva, amennyiben a distcc szoftvert a
crossdev
USE jelölőzászló beállításával fordítjuk le.Az alapértelmezett distcc beállításban a keresztfordítás nem működik megfelelően. A probléma az, hogy sok kódfordítás egyszerűen a gcc hívást használja a teljes kódfordító név helyett (például sparc-unknown-linux-gnu-gcc). Amikor ez a kódfordítás egy distcc segítő számítógépre kerül, a natív kódfordító kerül meghívásra az új keresztfordító helyett.
Szerencsére van megoldás erre a kis problémára. Mindössze egy csomagoló scriptre és néhány szimbolikus linkre van szükség azon a számítógépen, amelyen az emerge futni fog. Példaként egy Sparc számítógépet fogunk használni. Ahol az alábbiakban a sparc-unknown-linux-gnu
szerepel, oda saját CHOST értékét kell beillesztenie (például x86_64-pc-linux-gnu
egy AMD64 számítógép esetében). Amikor először telepíti a distcc szoftvert, a /usr/lib/distcc/bin könyvtár így néz ki:
Az alábbi utasításokat kizárólag azon a számítógépen kell végrehajtani, amelyen az emerge fut. Ne hajtsa végre ezeket a lépéseket a segítő számítógépen.
root #
cd /usr/lib/distcc/bin
root #
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
Itt vannak a teendők:
root #
rm c++ g++ gcc cc
Ezután létrehozzuk az új szkriptet ezen a számítógépen. Nyissa meg a kedvenc szövegszerkesztőjét, és hozzon létre egy fájlt az alábbi szöveggel, majd mentse el sparc-unknown-linux-gnu-wrapper néven. Ne felejtse el a CHOST értékét (ebben az esetben sparc-unknown-linux-gnu
) a számítógép tényleges CHOST értékére módosítani, amelyen az emerge futni fog.
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
Ezután futtathatóvá tesszük a szkriptet, és létrehozzuk a megfelelő szimbolikus linkeket:
root #
chmod a+x sparc-unknown-linux-gnu-wrapper
root #
ln -s sparc-unknown-linux-gnu-wrapper cc
root #
ln -s sparc-unknown-linux-gnu-wrapper gcc
root #
ln -s sparc-unknown-linux-gnu-wrapper g++
root #
ln -s sparc-unknown-linux-gnu-wrapper c++
Amikor elkészült, a /usr/lib/distcc/bin könyvtár így fog kinézni:
root #
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
Az újabb distcc verzióknál az alábbi lépésekre már nincs szükség. Helyette a
crossdev
USE jelölőzászló beállításával telepítheti a distcc szoftvert a kliens számítógépen, hogy ugyanazt az eredményt elérje.Ezután gondoskodnunk kell arról, hogy ezek a csomagoló szkriptek elérhetők maradjanak a distcc szoftvercsomag frissítése után is, mivel az felülírja a szimbolikus linkeket. Ezt egy /etc/portage/bashrc fájl használatával érhetjük el, amely így néz ki:
/etc/portage/bashrc
case ${CATEGORY}/${PN} in
sys-devel/distcc | sys-devel/gcc | sys-devel/clang)
if [ "${EBUILD_PHASE}" == "postinst" ]; then
/usr/local/sbin/distcc-fix &
fi
;;
esac
Ezután készítse el az alábbi fájlok egyikét a szükséges alkalmazás szerint. Ha nem használ clang-ot, akkor:
/usr/local/sbin/distcc-fix
#!/bin/bash
sleep 20
# We extract $TUPLE from make.conf to avoid editing the script for each architecture.
TUPLE=$(portageq envvar CHOST)
GCC_VER=$(gcc-config -c|cut -d "-" -f5)
cd /usr/lib/distcc/bin
rm cc c++ gcc g++ gcc-${GCC_VER} g++-${GCC_VER} ${TUPLE}-wrapper
echo '#!/bin/bash' > ${TUPLE}-wrapper
echo "exec ${TUPLE}-g\${0:\$[-2]}" "\"\$@\"" >> ${TUPLE}-wrapper
chmod 755 ${TUPLE}-wrapper
ln -s ${TUPLE}-wrapper cc
ln -s ${TUPLE}-wrapper c++
ln -s ${TUPLE}-wrapper gcc
ln -s ${TUPLE}-wrapper g++
ln -s ${TUPLE}-wrapper gcc-${GCC_VER}
ln -s ${TUPLE}-wrapper g++-${GCC_VER}
Ha használ clang-ot, akkor:
/usr/local/sbin/distcc-fix
#!/bin/bash
#clang aware, now your >chromium-65 ebuilds will use distcc just like before ;)
sleep 20
# We extract $TUPLE from make.conf to avoid editing the script for each architecture.
TUPLE=$(portageq envvar CHOST)
GCC_VER=$(gcc-config -c|cut -d "-" -f5)
CLANG_VER=$(clang --version|grep version|cut -d " " -f3|cut -d'.' -f1,2)
cd /usr/lib/distcc/bin
rm cc c++ gcc g++ gcc-${GCC_VER} g++-${GCC_VER} clang clang++ clang-${CLANG_VER} clang++-${CLANG_VER} ${TUPLE}-wrapper ${TUPLE}-clang-wrapper
echo '#!/bin/bash' > ${TUPLE}-wrapper
echo "exec ${TUPLE}-g\${0:\$[-2]}" "\"\$@\"" >> ${TUPLE}-wrapper
echo '#!/bin/bash' > ${TUPLE}-clang-wrapper
echo "exec ${TUPLE}-\$(basename \${0}) \"\$@\"" >> ${TUPLE}-clang-wrapper
chmod 755 ${TUPLE}-wrapper
chmod 755 ${TUPLE}-clang-wrapper
ln -s ${TUPLE}-wrapper cc
ln -s ${TUPLE}-wrapper c++
ln -s ${TUPLE}-wrapper gcc
ln -s ${TUPLE}-wrapper g++
ln -s ${TUPLE}-wrapper gcc-${GCC_VER}
ln -s ${TUPLE}-wrapper g++-${GCC_VER}
ln -s ${TUPLE}-clang-wrapper clang
ln -s ${TUPLE}-clang-wrapper clang++
ln -s ${TUPLE}-clang-wrapper clang-${CLANG_VER}
ln -s ${TUPLE}-clang-wrapper clang++-${CLANG_VER}
Adjon megfelelő jogosultságokat a fájlnak:
root #
chmod 755 /usr/local/sbin/distcc-fix
Gratulálunk! Remélhetőleg most már egy működő cross-distcc rendszere van.
Ez hogyan működik?
Amikor a distcc hívásra kerül, ellenőrzi, hogy milyen néven hívták meg (pl. i686-pc-linux-gnu-gcc
, sparc-unknown-linux-gnu-g++
, stb.). Amikor a distcc ezután továbbítja a fordítást egy segítő számítógéphez, továbbítja azt a nevet, amelyen hívták. A másik segítő számítógépen lévő distcc szolgáltatás ezután keres egy binárist ugyanazzal a névvel. Ha csak a gcc név szerepel, akkor a gcc kódfordítót fogja keresni, amely valószínűleg a segítő számítógép natív kódfordítója, ha annak architektúrája eltér attól a számítógéptől, amelyen a emerge fut. Ha a fordító teljes neve kerül továbbításra (pl. sparc-unknown-linux-gnu-gcc
), akkor nem merül fel semmilyen zavar.
Hibaelhárítás
Ez a szakasz számos gyakori problémát tárgyal a distcc használatával kapcsolatban keresztfordítás esetén.
Távoli számítógép distccd FORDÍTÁSI HIBÁK
Amikor egy távoli számítógép /var/log/distccd.log fájljában a COMPILE ERRORS
üzenetet kapja, tekintse át a fenti megjegyzéseket a helyes architektúranév megadásával kapcsolatban (pl. crossdev -t $TARGET).
Egy másik megoldás a crossdev kódfordító eszközök eltávolítása és újratelepítése a crossdev --clean opció használatával, vagy annak biztosítása, hogy a /usr/$TARGET már ne létezzen, majd a keresztfordító teljes újratelepítése.
Érdemes lehet szerkeszteni a távoli számítógép /usr/$TARGET/etc/portage/make.conf fájlját, és biztosítani, hogy a CFLAGS változó tartalma hasonló legyen az összes számítógépen vagy host gépeken, amely fordító műveleteket végez. Ezenkívül győződjön meg arról, hogy a keresztfordítóhoz tartozó USE jelölőzászlók megfelelőek: Ha a GCC kódfordítót USE=graphite
opcióval hozta létre a kliens számítógépen, akkor szükséges egy olyan sor, mint például cross-i686-pc-linux-gnu/gcc graphite
az /etc/portage/package.use fájlba is.
Failed to exec $TARGET-unknown-linux-gnu-gcc: No such file or directory
Az átmeneti szkriptek nem biztos, hogy végrehajtásra kerülnek, még akkor sem, ha a jogosultságok helyesek:
distcc[6195] (dcc_execvp) ERROR: failed to exec i686-unknown-linux-gnu-gcc: No such file or directory)
A probléma megoldásához győződjön meg arról, hogy az átmeneti szkriptet az architektúracél teljes nevével lett létrehozva:
user $
ls -alh /usr/lib/distcc/bin/c++
/usr/lib/distcc/bin/c++ ->./i686-pc-linux-gnu-wrapper
További olvasnivaló a témában
- Crossdev — a set of bash scripts that utilize emerge to provide a system integrated cross-compilation capability.
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Andrew Gaffney, Joshua Saddler
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.