Cross compiling/hu

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) magyar (hu) português (pt) русский (ru) 中文(中国大陆) (zh_CN) 中文(臺灣) (zh_TW)

Előszó

Ez egy rövid bevezető kezdőknek. A következőkben leírjuk hogyan állítsd be a rendszert keresztfordításhoz, ami azt jelenti, hogy futtatható állományokat hozhatsz létre más rendszerekhez mint amin a fordítást végzed - pl. Linux rendszeren dolgozva készíthetsz Win32 alkalmazásokat (és ugyanígy FreeBSD, Darwin, stb.). A rendszert melyen a fordítást végzed általában "gazdarendszer"-nek (fentebb ez a Linux) és azt a rendszert melyen a létrehozott binárist futtatni akarod majd "célrendszer"-nek nevezzük. A FreePascal egy fordító és forráskódból gépi kódodú bináris állományokat készít. Ez a bináris tartalmaz információkat arról is hogy az operációs rendszer milyen módon kezelje az állományt. Ezen kívül a binárisban hivatkozások vannak az operációs rendszeren alkalmazható műveletekre (API), ezért van különbség a Run-Time Library különböző operációs rendszerekhez szükséges változatai között. Mindezek miatt a készített bináris állományok rendszerfüggők. Maga a FreePascal nem igényel sok beállítást. Képes binárisokat készíteni sok rendszerhez, csak kérd meg rá.

Gazda- és célrendszer ugyanolyan CPU-n

Az FPC úgy lett kialakítva hogy a fordító képes gépi kódot előállítani bizonyos CPU-khoz (a különböző CPU-k különböző gépi kódot igényelnek) és ismeri az adott CPU-n támogatott operációs rendszerek egyedi követelményeit. Ez azt jelenti, hogy keresztfordítást végezhetsz ugyanazzal a fordítóval (egyszerű kódfordításra használva) amíg kitartasz ugyanazon CPU mellett.

Gazda és célrendszer eltérő CPU-n

Ha más típusú CPU számára kell binárist készíteni, akkor speciális keresztfordítóra van szükség, olyanra amely a gazdarendszeren fut, de képes a más típusú CPU gépi kódját létrehozni (az FPC esetében egy ilyen keresztfordítónak ismételten tudnia kell megcélozni az összes támogatott rendszert a cél CPU-n). Ez a keresztfordító általában ugyanabban a könyvtárban tárolható ahol az eredeti fordító is van. Ilyen keresztfordítót készíthetsz magad is, vagy használhatod a néhány rendszerhez előre elkészített és az FPC csapat által közvetlenül terjesztett változatokat is (általában hordozható eszközökön futó rendszerek ezek melyek többnyire nincsenek gazdarendszerként használva). Az FPC ezután képes kiválasztani a megfelelő fordítót (az eredetit vagy a keresztfordítót) a -P paraméterrel megadott cél CPU-hoz.

Assembler és linker

A fordító csak egy rész. Szükségünk van még assemblerre és a linkerre is. Az FPC rendelkezik beépített assemblerrel és/vagy linkerrel néhány rendszerhez, más rendszereken külső eszközökre van szüksége. Ezek az eszközök általában nem képesek binárisokat létrehozni eltérő rendszerek számára. Ezért van, hogy speciális linkert 'ld' és assemblert 'as' használunk minden célrendszeren. Ezeket nevezzük binutils-nak.

Unit-ok a célrendszerhez

Miután létrehoztuk (vagy megszereztük/telepítettük) a keresztfordító eszközöket, szükség lesz még az FPC RTL és további unitokra a választott célrendszerre lefordítva. Például minden célrendszerhez eltérő system.ppu (System unit) fájlra van szükség, stb. Ezek a unitok létrehozhatók akár a célrendszerre fordításhoz beállított fordítóval, vagy esetleg használhatod a hivatalosan terjesztett unitokat, amelyek pontosan megegyező FPC változattal készültek illetve lettek kiadva (ha elérhető a gazdarendszeren használható formátumban).

Konfiguráció

Miután az fpc config fájl beállítása megtörtént, a keresztfordítás könnyűvé válik, elfeledkezhetsz az unalmas részletekről. Ugyanezt kell tenni az LCL (lazarus component lybrary) esetén is (ha Lazarus-t használsz). Ezután már fordíthatod is a pascal programokat az eltérő célrendszerre. Az elkészült binárisok átmásolhatok egy olyan gépre amin a célrendszer fut vagy futtathatók emulátorban (pld.: Wine - Win32 binárisok futtatására Linux rendszeren, stb.).

Alap műveletek

Van néhány általános művelet a keresztfordításban amit minden esetben el kell végezned:

  1. Szükség van a FreePascal fordítóra ahhoz a rendszerhez amelyen a fordítást el akarod végezni.
  2. Szükség van a FreePascal forráskódjára (kivéve akkor ha valaki már elkészített mindent).
  3. Szükség van olyan binutils programokra, melyek a gazdarendszeren futtathatók és a célrendszeren futtatható binárist hoznak létre. Ezeket vagy lefordítod forráskódból vagy megszerzed.
  4. Néha szükség lesz fájlokra a célrendszerből amelyre fordítasz.

Linux rendszeren

Linux rendszerre

A következő szöveg a linux(x86_64) rendszerről linux(i386) rendszerre történő keresztfordítást írja le. Információk az ARM processzoron futó linux-okra (pl. Zaurus) fordításról a Keresztfordítás beállítása ARM rendszerhez részben találhatók. A különbség annyi, hogy a 64-bites rendszer képes lesz 32-bites programokat fordítani, de ehhez az FPC fordítási folyamata miatt jó néhány dolgot el kell még végezni.

  • Először ellenőrizni kell hogy rendelkezel-e az i386-linux-ld és i386-linux-as fájlokkal:
 bash $ which i386-linux-ld
 bash $ which i386-linux-as

Ha megvannak ezek a fájlok akkor "Az FPC fordítása" címsorral folytasd.

Nekem nem voltak meg, ezért írtam néhány szkriptet:

#!/bin/bash
# ez a fájl legyen a /usr/bin/i386-linux-ld
ld -A elf32-i386 $@
#!/bin/bash
# ez a fájl legyen a /usr/bin/i386-linux-as
as --32 $@
  • Futtathatóvá kell őket tenni:
bash $ chmod +x /usr/bin/i386-linux-as
bash $ chmod +x /usr/bin/i386-linux-ld
  • Az FPC fordítása:
bash $ make all CPU_TARGET=i386

ez után:

bash $ su -c "make install CPU_TARGET=i386"

Ennyi. Szerkeszd az /etc/fpc.cfg fájlt az igényeid szerint.

Windows rendszerre

A Lazarus-szal történő keresztfordításról információkat a Keresztfordítás Windows-ra Linux rendszeren című részben találsz.

Ha a 2.1.1 vagy újabb változatú FPC-t hazsnálsz akkor csak kettő parancsot kell futtatni:

bash $ make all OS_TARGET=win32 CPU_TARGET=i386
bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"

Figyelem: a win64 rendszerre fordításhoz az első parancs:

bash $ make all OS_TARGET=win64 CPU_TARGET=x86_64

Az egyszerűség oka, hogy a linker be van építve az FPC ezen változatába.

Darwin vagy macOS rendszerre

  • Először szükséged van a binutils programokra amelyek bináris kódot tudnak készíteni a rendszerhez amelyre fordítani akarsz. Töltsd le az odcctools csomagot (használd a cvs változatot) és kövesd a telepítési utasításokat: http://www.opendarwin.org/projects/odcctools/ (tükör: http://www.opendarwin.info/opendarwin.org/en/projects/odcctools/)
  • Létre kell hoznod egy (hamis) gyökérkönyvtárat $HOME/darwinroot néven. Másold át a következő könyvtárakat az Apple vagy Darwin rendszerről a $HOME/darwinroot könyvtárba: /System /Frameworks /usr (továbbiakat is átmásolhatsz).
  • A $HOME/darwinroot könyvtárban hozz létre egy alkönyvtárat cross néven. A könyvtárban ahová az odcctools programokat telepítetted hivatkozásokat kell készítened, az FPC-vel való jobb együttműködésért. Van néhány program a odcctools csomagban powerpc-apple-darwin-* néven amelyekhez linkeket kell készítened (vagy átnevezned őket) a következőképpen: powerpc-apple-darwin-ld legyen powerpc-darwin-ld, ugyanígy a *-ar és *-as esetében is.
  • most készen állsz az FPC keresztfordítására. Természetesen szükséged van az FPC forráskódjára és a terminálnak nyitva kell lennie ott.

írd be:

$PATH=$PATH:$HOME/darwinroot/cross (vagy ahol a szimbolikus linkektalálhatók)

írd be (iirc):

make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"

ha ez sikerült, telepítheted ahová akarod a következővel:

make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc

most másold a ./compiler/ppccross fájlt valahová ahol biztosan megtalálod majd, ez a fordító amire szükséged lesz powerpc programok fordításához.

  • szerkeszd az /etc/fpc.cfg fájlt.

írj bele egy ehhez hasonló részt:

#IFDEF powerpc
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
-k-systemroot $HOME/darwin/cross
#ENDIF

amikor keresztfordítani akarsz a ppccross-nak és a linkeknek (symlinks) melyek a powerpc-darwin-* fájlokra mutatnak a PATH-ban felsorolt helyek egyikében kell lenniük ezután már egy egyszerű parancssal (ppccross someprogie.pas) létrehozható a darwin bináris fájl.

Lehet, hogy rosszul írtam le valamit (vagy mindent) mert már régen csináltam ilyet.

Windows rendszeren

Linux rendszerre

Információkat a buildfaq részben találsz erről.

GO32v2 rendszerre

A részletes információk megtalálhatók a Keresztfordítás Windows rendszeren GO32v2-re című részben.

Darwin (macOS) i386 rendszeren

i386-ról powerpc-re

  • binutils programok

Először ellenőrizni kell, hogy megvannak-e a powerpc-darwin-ld és a powerpc-darwin-as fájlok:

 $ which powerpc-darwin-ld
 $ which powerpc-darwin-as

Ha megvannak, hagyd ki a szimbolikus linkek (symlinks) létrehozását és folytasd "Az FPC fordítása" címsortól.

Jelenleg a "normál" binutils programok használhatók, mivel ezek univerzálisak. Ezért egyszerű szimbolikus linkek (symlinks) elegendők:

 $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
 $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld

A szimbolikus linkek bármelyik könyvtárban lehetnek, amíg a hely a $PATH-ban fel van sorolva.

  • Az FPC fordítása:
 $ cd fpc/compiler
 $ make cycle CPU_TARGET=powerpc

Ez létrehozza a powerpc fordítót (fpc/compiler/ppcppc) és az RTL unit-okat.

Az így létrehozott powerpc binárisok nem igényelnek egyéb keresztfordító eszközt. A powerpc fpc és a ppcppc tökéletesen fut Rosetta-t használó IntelMacs rendszeren.

További tesztek és dokumentációk szükségesek párhuzamos telepítésről és használatról.

Ha hiányoznak unit-ok, nézd át a konfigurációs fájlt ($HOME/.fpc.cfg vagy /etc/fpc.cfg vagy /sw/etc/fpc.cfg) Lehet hogy hozzá kell adnot valami ehhez hasonlót (természetesen azokkal a könyvtárnevekkel ahol a te unit-jaid vannak).

-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*

Megjegyzés: Az univerzális binárisok a különálló (i386 and powerpc) binárisokból készültek lipo használatával.

Windows és Linux rendszerre (32 bit)

A fink csomagkezelő rendelkezik a keresztfordító csomagokkal Windows és Linux célrendszerekhez (32 bit) IntelMacs-on.

$ fink install fpc-win32

és

$ fink install fpc-i386-linux

parancsokkal telepíthetők a keresztfordítók.

A fordításhoz használd ezeket a parancsokat:

 fpc -Tlinux FILENAME
 fpc -Twin32 FILENAME

Currently (fpc 3.0.4), it gives:

fpc-cross-arm-gba
fpc-cross-arm-linux
fpc-cross-arm-nds
fpc-cross-arm-wince
fpc-cross-arm-armv4t-embedded
fpc-cross-arm-armv7m-embedded
fpc-cross-i386-darwin
fpc-cross-i386-freebsd
fpc-cross-i386-go32v2
fpc-cross-i386-linux
fpc-cross-i386-nativent
fpc-cross-i386-netbsd
fpc-cross-i386-solaris
fpc-cross-i386-win32
fpc-cross-i386-wince
fpc-cross-jvm-android
fpc-cross-jvm-java
fpc-cross-m68k-linux
fpc-cross-mipsel-linux
fpc-cross-powerpc-linux
fpc-cross-sparc-linux
fpc-cross-x86-64-dragonfly
fpc-cross-x86-64-freebsd
fpc-cross-x86-64-linux
fpc-cross-x86-64-win64

For other platforms (processors and systems) you have to do the setup by yourself. It is basically the same scheme: First, you need the corresponding binutils (See Binutils) and second, the crosscompiler and the run time library. Some more details of the building procedure can be learned from the fink package description files of the crosscompilers from above.

Keresztfordítás GYIK (faq)

Mire jó a keresztfordítás?

Így fejleszthetsz programokat egy OS/CPU-n és lefordíthatod egy másik OS/CPU-ra a számítógép újraindítása vagy másik számítógép használata nélkül.

Miért Unix-ról Windws-ra és nem a másik irányba?

A legfőbb ok az, hogy Unix binárisok létrehozása más rendszereken (másik Unix vagy akár Linux is) jóval bonyolultabb.

Az alapvető problémák:

  1. Szükséged van függvénytárakra (library-ik) a gazdarendszeren (amelyen a keresztfordítást el akarod végezni)
  2. Nincs ilyen egységes gyűjtemény függvénytárakból (library) a nagyon összetett és dinamikus Unix verziókezelés eredményeként.
  3. Rengeteg (linker) paraméterezés és finomhangolás elvégzésére van szükség, amiket a legtöbb esetben nagyon nehéz elmagyarázni.

Ha a figyelmeztetések ellenére mégis kitartasz, olvasd el a crossnotes című feljegyzést, amely fentebb van megemlítve vagy a buildfaq fejezetet.

Több információt szeretnék a Free Pascal építéséről. Hol találok?

Olvasd el a buildfaq fejezetet.