Difference between revisions of "Cross compiling for Win32 under Linux/hu"

From Lazarus wiki
Jump to navigationJump to search
m (New page: {{Cross compiling for Win32 under Linux}} Hamarosan...<!-- == Hints to Cross Compile Win32 binaries under Linux == Since 0.9.10 there is an rpm 'fpc-crosswin32', that installs the needed ...)
 
(Allow for a name change on another page)
 
(46 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{Cross compiling for Win32 under Linux}}
+
{{Cross compiling for Windows under Linux}}
Hamarosan...<!--
 
== Hints to Cross Compile Win32 binaries under Linux ==
 
  
Since 0.9.10 there is an rpm 'fpc-crosswin32', that installs the needed binutils (e.g. cross assembler, cross linker), the fpc .ppu files cross compiled for win32 and modifies /etc/fpc.cfg.
+
<font size="7">Keresztfordítás Windows-ra Linux rendszeren</font>
  
It does not contain the cross compiled LCL .ppu files. You need to compile them yourself, after installing fpc-crosswin32.
 
  
== Lazarus and the Free Pascal Compiler ==
+
__TOC__
 +
== Tippek Win32 binárisok keresztfordításához Linux rendszeren ==
  
=== About Cross compiling - Knowing, what you are doing ===
+
A 0.9.10 óta létezik egy rpm 'fpc-crosswin32' néven, ami telepíti szükséges binutils eszközöket (assembler, linker), az FPC .ppu fájljait win32-re keresztfordítva és a módosított /etc/fpc.cfg.
  
This is a short introduction for newbies.
+
A csomag nem tartalmazza a keresztfordított LCL .ppu fájlokat. Neked kell lefordítanod őket az fpc-crosswin32 telepítése után.
The following sections describe how to setup a system to cross compile, that means working under linux and creating win32 executables (or freebsd or dawin, or ...).
 
Why cross compiling: FreePascal is a compiler and basically converts source into binaries (machine language). These binaries also contains information, how the operating system starts the executable. Therefore these binaries are platform specific.
 
FreePascal itself does not need much setup. It can create binaries for many platforms. Just tell it to do so. But the compiler is only one part. There is also the assembler and the linker. And these tools are not able to create cross code. That's why we have to create special linker 'ld' and assembler 'as' for every target platform. These are the binutils.
 
After creating the cross tools, all the fpc pascal units will be cross compiled. For example, then there is one system.ppu file for every target platform.  
 
Then your fpc config file will be setup, so that cross compilation becomes so easy, that you can forget all the boring details.
 
The same will be done for the LCL - the lazarus component library.
 
And after this you can cross compile pascal programs for win32. Either start them with wine or copy them to a windows machine and test them there.
 
  
=== Why *nix to windows and not the other way around. ===
+
== A Lazarus és a Free Pascal Compiler ==
  
The main reason for this is that generating unix binaries on a foreign platform (another unix or even Linux distro included) is more complicated. Static linking is already complicated, let alone shared.
+
=== A keresztfordításról - Hogy tudd mit csinálsz ===
  
You would need the used libraries from the target platform's (gtk, glib,libc etc), and a lot of additional configuring for ld. (library paths, dynlinker path etc)
+
Ez egy rövid bevezetés kezdőknek.
 +
A következőkben leírjuk hogyan állítsd be a rendszert keresztfordításhoz, ami azt jelenti, hogy Linux rendszeren dolgozva készíthetsz Win32 alkalmazásokat (és ugyanígy FreeBSD, Darwin, stb.).
 +
Amiért jó a keresztfordítás: A FreePascal egy fordító és forráskódból gépi kódú 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. 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á. A fordító azonban 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.
 +
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.
 +
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 library) esetén is (ha Lazarus-t használsz).
 +
Ezután már fordíthatod is a pascal programokat a win32 rendszerre. Az elkészült binárisok futtathatók a Wine segítségével vagy átmásolhatók egy olyan gépre amin win32 fut és ott kipróbálhatók.
  
This has been partially done (for the static case), but it is hard since it needs manual postediting of linker files and linker commandline, and a deep understanding about what makes Unix binaries tick.
+
=== Miért *nix rendszerről windows rendszerre és nem a másik irányba? ===
  
=== Download the FPC Sources ===
+
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. <!--Static linking is already complicated, let alone shared.-->
  
The binaries are not enough, you need the complete fpc sources.
+
Szükséged lehet függvénytárakra (library) a célrendszerről (gtk, glib,libc etc), és rengetek finomhangolás elvégzésére van szükség az ld számára (függvénytárak helyei, dynlinker helye, stb.).
See www.freepascal.org. You can use the cvs or a daily snapshot.
 
For the following examples the fpc sources were downloaded to ~/sources/fpc.
 
  
=== Download the gnu binutils. ===
+
Ezek részlegesen megoldottak (a statikus linkelés esetén), de nehéz feladat mert utólagos kézi szerkesztést igényel a linker fájlokban és a parancssorban, és széles ismereteket arról ahogy a Unix binárisok működnek.
  
For example binutils-2.18.tar.gz downloaded to
+
=== Töltsd le az FPC forráskódját ===
 +
 
 +
A binárisok letöltése nem elég, szükséged van a teljes FPC forráskódra.
 +
Megtalálod az www.freepascal.org címen. Használhatod a CVS-t vagy a napi kódot (snapshot).
 +
A következő példák esetében az FPC forráskódja a ~/sources/fpc könvtárba lettek letöltve.
 +
 
 +
=== Töltsd le a GNU binutils programokat. ===
 +
 
 +
Például a binutils-2.18.tar.gz fájlt töltsd le ide:
 
~/download/binutils-2.18.tar.gz.
 
~/download/binutils-2.18.tar.gz.
  
=== Cross build binutils ===
+
=== A binutils programok keresztfordítása ===
 +
Az fpcbuild tárhelyén megtalálható egy szkript amivel létre lehet hozni a binutils programokat minden rendszerre: install/cross/buildcrossbinutils
  
In the fpcbuild repository there is a script to build the binutils for all
+
Töltsd le és telepítsd az fpcbuild csomagot:
cross platforms: install/cross/buildcrossbinutils
 
 
 
Download install of fpcbuild:
 
 
   []$ cd ~
 
   []$ cd ~
 
   []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_2/install install
 
   []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_2/install install
  
Create a copy of the script:
+
Készíts másolatot a szkriptről:
  
 
   []$ cd ~/install/cross/
 
   []$ cd ~/install/cross/
 
   []$ cp buildcrossbinutils buildcrossbinutils.sh
 
   []$ cp buildcrossbinutils buildcrossbinutils.sh
  
Edit the variables at the start of the new script.
+
Szerkesztd a változókat az új szkript elején.
  
The BASE variable points to a building and installation directory. So, it
+
A BASE változó mutatja meg a fordítás és telepítés könyvtárát<!--points to a building and installation directory-->. Ezért ez lehetőleg egy üres könyvtár legyen. Például:
should be an empty directory. For example:
 
 
   BASE=~/cross_fpc
 
   BASE=~/cross_fpc
  
Now the downloaded binutils file. If for instance you downloaded ~/download/binutils-2.18.tar.gz then set
+
Most következnek a letöltött binutils programok. Ha a csomagot a ~/download/binutils-2.18.tar.gz néven mentetted akkor a beállítások a következőképpen nézzenek ki:
 
   BINUTILSPATH=~/download/
 
   BINUTILSPATH=~/download/
 
   BINUTILSBASE=binutils
 
   BINUTILSBASE=binutils
Line 65: Line 65:
 
   BINUTILS_GZIP=yes
 
   BINUTILS_GZIP=yes
  
The script will automatically combine this to ~/download/binutils-2.18.tar.gz.
+
A szkript automatikusan összeállítja belőlük az eredeti nevet: ~/download/binutils-2.18.tar.gz.
The rest variables define what target platforms you have. The default is to
+
A további változók a célrendszert határozzák meg. Alapértelmezés szerint szép csendben több rendszerre is lefordítja a kódot, ezért a fordítás sok időt (lassú gépeken órákat) vehet igénybe.
build quite a lot, so compilation will take some time (hours on slow machines).
+
Ha csak windows-ra akarsz keresztfordítani akkor csak ennyi kell:
For cross compile to windows, you need only
 
  
 
   TARGETS_WIN="mingw32"
 
   TARGETS_WIN="mingw32"
 
    
 
    
and to comment all other:
+
a többit pedig megjegyzésbe kell áttenni:
 
    
 
    
 
   #BSD="freebsd netbsd openbsd"
 
   #BSD="freebsd netbsd openbsd"
Line 82: Line 81:
  
  
Then run the script:
+
Ezután futtasd a szkriptet:
  
 
   []$ sh buildcrossbinutils.sh
 
   []$ sh buildcrossbinutils.sh
 
    
 
    
The script creates a subdirectory 'logs' full of log files. If something goes
+
A szkript létrehozz a 'logs' nevű alkönyvtárat tele naplófájlokkal. Ha valami rosszul megy akkor itt kezdj nyomozni.
wrong, start looking there.
 
  
Note that for several platforms (Linux,FreeBSD, win32) these are available in compiled
+
Ne felejtsd el, hogy több rendszerhez (Linux, FreeBSD, win32) ezek az eszközök már elérhetők lefordítva is. Lásd: ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
form already. See ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
 
  
=== Cross build FPC ===
+
=== Az FPC keresztfordítása ===
  
In the fpcbuld repository there is a script to build the fpc snapshot for
+
Az fpcbuld tárhelyén megtalálható egy szkript az FPC napi kód (snapshot) keresztfordításához több rendszerhez: install/cross/buildcrosssnapshot
all cross platforms: install/cross/buildcrosssnapshot
+
Készíts másolatot a szkriptről:
Create a copy of the script:
 
  
 
   []$ cd ~/install/cross/
 
   []$ cd ~/install/cross/
 
   []$ cp buildcrosssnapshot buildcrosssnapshot.sh
 
   []$ cp buildcrosssnapshot buildcrosssnapshot.sh
  
Edit the variables at the start of the new script.
+
Szerkesztd a változókat az új szkript elején.  
  
Normally you will change at least CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS
+
Általában csak a CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS
and TARGETS_CPU. For example:
+
és TARGETS_CPU értékeit kell beállítanod. Például:
 
    
 
    
 
   CROSSTOOLSROOT=~/cross_fpc/cross
 
   CROSSTOOLSROOT=~/cross_fpc/cross
Line 112: Line 108:
 
   DESTDIR=~/cross_fpc/
 
   DESTDIR=~/cross_fpc/
 
    
 
    
Then run the script:
+
Ezután futtasd a szkriptet:
  
 
   []$ sh buildcrosssnapshot.sh
 
   []$ sh buildcrosssnapshot.sh
  
After this you got cross compiled units in ~/cross_fpc/
+
Ezután a megtalálod a keresztfordított unit fájlokat a ~/cross_fpc/ könyvtárban.
  
=== Configure your fpc.cfg ===
+
=== Az fpc.cfg beállításai===
  
Open as root your /etc/fpc.cfg or create copy /etc/fpc.cfg to ~/fpc.cfg and edit this file. Search in the config for the unit search paths
+
Rendszergazdaként nyisd meg az /etc/fpc.cfg fájlt vagy készíts másolatot az /etc/fpc.cfg fájlról ~/fpc.cfg néven, majd szerkesztd ezt a fájlt. Keresd meg benne a unit-ok útvonalait meghatározó részt.
  
Note: On older versions of FPC $version and $target are used instead of $fpcversion and $fpctarget  
+
Ne felejtsd el, hogy a régebbi FPC változatok a $version és $target változókat használják az $fpcversion és $fpctarget helyett.
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
  
Replace them with special paths for other platforms. For example for normal linux and cross compiled win32:
+
Cseréld le őket az egyes rendszereknek megfelelő útvonalakra. Pélául normál Linux és keresztfordított win32 esetében így:
 
  #IFDEF win32
 
  #IFDEF win32
 
  -Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/
 
  -Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/
Line 141: Line 137:
 
  #ENDIF
 
  #ENDIF
  
ToDo: Test and troubleshooting
+
Tennivaló: Tesztelés és hibaelhárítás
  
=== Cross compiling the LCL and lazarus components ===
+
=== Az LCL és a Lazarus komponensek keresztfordítása ===
  
At Command line:  
+
Parancssorban:  
 
  cd lazarus; make clean all OS_TARGET=win32
 
  cd lazarus; make clean all OS_TARGET=win32
 
  cd lazarus/lcl; make clean all  
 
  cd lazarus/lcl; make clean all  
  
This will first cross compile everything for win32 (including the IDE, which is unecessary, but so I have to write less doc).  
+
Ez először lefordít mindent win32 rendszerre (beleértve az IDE-t is, ami nem szükséges<!--, but so I have to write less doc-->).  
 
 
Or in the IDE: Set LCL, Synedit, Codetools, Package Registration and IDE Interface to Clean+Build, set LCL interface to win32/win64 and set 'Target OS' to win32. Then 'build lazarus'.
 
These four parts have splitted output directories, so your linux .ppu/.o files are *not* overwritten and you don't need to recompile them.
 
 
 
=== Cross compiling a project ===
 
  
Set in Run->Compiler Options->Code the Target OS to 'win32' and in Paths the
+
Vagy az IDE-ben: Állítsd be az LCL, Synedit, Codetools, Package Registration és IDE Interface fordítását Clean+Build-re, az LCL interface-t win32/win64-re és a 'Target OS' (célrendszer) pedig win32 legyen. Ezután fordítsd újra a Lazarus-t ('build lazarus').  
'LCL Widget Type' to win32. That's all. The next time you build, you will
+
Ez a négy rész külön könyvtárba kerül, ezért a linux .ppu/.o fájlok *nem* lesznek felülírva és nem kell újrafordítanod őket.
create a win32 executable.
 
The IDE will rescan for win32 units, so that 'Find declaration' and code
 
completion features will now work with the win32 rtl instead of the linux rtl.
 
When you open another project or reopen this project the IDE will automatically
 
switch.
 
  
=== Hints for Cross compiling and Lazarus ===
+
=== Egy projekt keresztfordítása ===
 +
Kattints a Project->Compiler Options menüpontra és a Code fülön állítsd be a célrendszert (Target OS) 'win32'-re, a Paths fülön pedig az 'LCL Widget Type'-t szintén 'win32'-re. Ennyi. A következő fordításnál win32 binárist fogsz létrehozni.
 +
Az IDE újraellenörzi a win32 unit-okat, így a 'Find declaration' és a 'code
 +
completion' lehetőségek a win32 és nem a linux rtl adataival működnek majd.
 +
Amikor új projectet nyitsz meg vagy újra megnyitod ezt, az IDE automatikusan váltani fog.
  
If you create an application/package for multiple targets, you will often do the following: Fix a bug, compile and test it under linux, then compile and test it under win32, .. . Because normally you overwrite your .ppu files, you have to recompile everything, everytime you switch. This is not necessary.
+
=== Tippek a Keresztfordításhoz Lazarus-ban ===
The Lazarus IDE supports macros.
 
  
Example 1: Cross compiling a project for linux and win32.  
+
Ha több célrendszerre készítesz alkalmazást/csomagot, a következő műveleteket kell sokszor elvégezned: Hibajavítás, fordítás és tesztelés linux-on, aztán fordítás és tesztelés win32 rendszeren, ... Mivel normál esetben felülírod a .ppu fájlokat, újra kell fordítanod mindent, minden alkalommal amikor váltasz. De erre már nincs szükség. A Lazarus IDE támogatja a makrókat.
  
Set Run -> Compiler Options -> Paths -> Unit Output directory to $(TargetOS). This macro will be replaced by the value in Code -> TargetOS in lowercase (i.e. "linux" for Linux and "win32" for Win32).
+
1. példa: Egy projekt keresztfordítása linux és win32 rendszerekre.  
The output directory is relative to your project directory (the directory where your .lpi is). Create a linux and win32 directory in your project directory.
 
When you click on the "Show Options" button at the bottom of the compiler options, you will see a -FElinux/ or -FEwin32/. This option tells the compiler where to write the output (e.g. .ppu/.o files).
 
  
 +
Állítsd be a  Project->Compiler Options->Paths->Unit Output directory értékét $(TargetOS)-ra. Ez a makró le lesz cserélve a Code->TargetOS sorban található értékre csak kisbetűkkel (pl. "linux"-ra a Linux és "win32"-re a Win32 esetében).
 +
A kimeneti könyvtár egy relatív útvonal lesz a projekt könyvtárához iszonyítva (ahol az .lpi fájl található). Létre lesz hozva egy-egy könyvtár linux és win32 néven a projekt könyvtárában.
 +
Amikor a "Show Options" gombra kattintasz a 'Compiler options' alján, egyebek mellett látni fogod a -FElinux/ vagy -FEwin32/ paramétereket. Ezek határozzák meg, hogy hová kerüljön kimenet (a .ppu/.o fájlok).
  
Example 2: Cross compiling a project for various platforms and widget sets.
+
2. Példa: Projekt keresztfordítása különböző rendszerekre és eszközkészletekre (widget set).
  
Set the Unit output directory to
+
Állítsd be a 'Unit output directory' értékét így:
 
$(TargetCPU)/$(TargetOS)/$(LCLWidgetType)
 
$(TargetCPU)/$(TargetOS)/$(LCLWidgetType)
and create the sub directories for all targets. This path construction is also used by the LCL.
+
és hozd létre a könyvtárakat minden célrendszerhez. Ezt a könyvtárszerkezetet használja az LCL is.
  
 +
Ugyanezeket kell elvégezni a csomagok esetében is.
  
 +
=== Lazarus csomagok keresztfordítása ===
  
The same can be done for packages.
+
A Lazarus csomagok nincsenek függvénytárakra korlátozva. Szinte mindenre lehet használni. Az IDE pedig szükség esetén újrafordítja őket.
 +
A csomagok örökölhetik a fordítási paramétereket. Például: A projekt amelyik a csomagot használja örökli a csomag kimeneti könyvtárát. Más szavakkal: a csomag kimeneti könyvtára hozzá lesz adva a projekt unit-ok könyvtárainak listájához (unit search path). Az IDE-ben itt találod: Project -> Compiler options -> Inherited.
 +
Az öröklés általában csak egy irányba működik.
 +
De vannak kivételek:
 +
A projekt célrendszerének beállítása (OS és CPU) felülbírálja az összes csomag célrendszerbeállítását. Ez azt jelenti, hogy ha a projekt célrendszerét win32-re állítod és fordítod a projektet, az IDE elenörzi, hogy a használt csomagokat újra kell-e fordítani erre a célrendszerre.
  
=== Cross compiling and Lazarus Packages ===
+
Például:
  
Lazarus packages are not limited to libraries. They can be used to compile nearly everything. And the IDE automatically recompiles them if needed.  
+
Az A csomag kimeneti könyvtára: lib/$(TargetOS)
Packages can inherit compiler options. For example: A project that uses a package inherits the output directory of the package. In other words: the output directory of the package is added to unit search path of the project. See in the IDE: Run -> Compiler options -> Inherited.
+
A projekt használja az A csomagot.
Inheritance normally works only one way.
+
# A projekt linux rendszerre készül. Az IDE lefordítja az A csomagot linux rendszerre a <PackageDirOfA>/lib/linux/ könyvtárba, ezután lefordítja a csomagot linux rendszerre.
But there are exceptions:
+
# A csomag win32 rendszerre készül. Az IDE lefordítja az A csomagot win32 rendszerre a <PackageDirOfA>/lib/win32/ könyvtárba, ezután lefordítja a csomagot win32 rendszerre.
The target platform (OS and CPU) of the project overrides the target for all used packages. That means, if you set the Target OS of the project to "win32" and compile the project, the IDE will check if the used packages need to be recompiled for this Target OS.
+
# A projekt ismét linux rendszerre lesz fordítva. Az IDE ellenörzi, hogy az A csomag le lett-e már fordítva linux rendszerre és nem fordítja újra. Ezután lefordítja a projektet linux rendszerre.
  
For example:
+
A makrók hazsnálatával sok időt lehet megtakarítani.
  
Package A has as output directory: lib/$(TargetOS)
+
== Unix rendszerre (általános) ==
Project uses A.
 
# The project is built for linux. The IDE compiles A for linux in <PackageDirOfA>/lib/linux/, then it compiles the project for linux.
 
# The project is built for win32. The IDE compiles A for win32 in <PackageDirOfA>/lib/win32/, then it compiles the project for win32.
 
# The project is built again for linux. The IDE checks A for linux and does not recompile it. Then it compiles the project for linux.
 
  
So, using the macros saves a lot of time.
+
Az -XLA paraméterrel tudod a pascal unit-ban megadott függőségeket átnevezni. Formátuma -XLAold=new, az ld paramétere pedig -l<régi> helyett -l<új> legyen.
  
== For Unix (general) ==
+
Az -XR<sysroot> <!--(recent trunk)-->paraméterrel megadhatod a célrendszerhez használt gyökérkönyvtárat. Amire a következők miatt lehet szükség:
 +
* előtag illesztése a függvénytárak útvonala elé; a múltban a -Xd használatával és az útvonalak kézi megadásával lehetett elérni ugyanezt. Például i386-linux esetén az ld számára a /lib, /usr/lib, és /usr/X11R6/lib átadása helyett a <sysroot>/lib, <sysroot>/usr/lib, és <sysroot>/usr/X11R6/lib kerül átadásra.
 +
* felismerni a C függvénytárat (linux függő): glibc vagy uclibc. Például uclibc keresése esetén a '<sysroot>/lib/ld-uClibc.so.0' lesz használva.
  
Option -XLA is used to rename library dependencies specified in pascal units. Format is -XLAold=new, to modify ld link option -l<old> to -l<new>.
+
== Linux rendszerre Win32 alatt ==
 +
<!--Marco vd Voort írt a témáról [http://www.stack.nl/~marcov/crossnotes.txt crossnotes] címmel feljegyzést (angolul).
 +
A legfrissebb információkat a [[buildfaq/hu|buildfaq]] fejezetben találhatod erről.-->
 +
Információkat a [[buildfaq/hu|buildfaq]] részben találsz erről.
  
Option -XR<sysroot> (recent trunk) that can be used to specify the target system root. It's used for:
+
== FreeBSD-ről sparc-ra ==
* adding a prefix to the default added library paths; in the past you used to specify -Xd and these paths manually. E.g. for i386-linux instead of passing /lib, /usr/lib, and /usr/X11R6/lib to ld, it will pass <sysroot>/lib, <sysroot>/usr/lib, and <sysroot>/usr/X11R6/lib to ld.
 
* detecting the C library (linux specific): glibc or uclibc. E.g. for uclibc detection '<sysroot>/lib/ld-uClibc.so.0' is tried.
 
  
== For Linux under Win32 ==
+
Végigcsináltam egy keresztfordítást x86-ról Sparc Solaris 9 rendszerre. Azonban az eredmény nem volt megfelelő. Itt a parancsror amit futtattam:
Marco vd Voort wrote some [http://www.stack.nl/~marcov/crossnotes.txt crossnotes]. If somebody has time, he can add them to this wiki.
+
<!--in compiler/ execute:-->
 
 
== FreeBSD to sparc ==
 
 
 
I managed to crosscompile from x86 to Sparc Solaris 9. However the result doesn't work very well, but here is my cmdline:
 
 
 
in compiler/ execute:
 
  
 
   gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
 
   gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
  
~/src/sollib is a directory that contains:
+
Az ~/src/sollib egy könyvtár ami a következőket tartalmazta:
* a set of .o's from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
+
* több .o fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
* libgcc.a from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
+
* a libgcc.a fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
* a set of lib*.so from /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so         
+
* több lib*.so fájlt a /usr/lib könyvtárból: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so         
  
Problem is illustrated by the following binary.
+
A problémát a következő példa mutatja meg.
  
 
   Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
 
   Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
Line 236: Line 225:
 
   system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
 
   system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
  
I suspect wrong .o's are taken.
+
Azt gyanítom, hogy rossz .o fájlokat kapott.
 
 
== For Mac OS X ==
 
See this [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 forum post].
 
  
 +
== Mac OS X ==
 +
Nézd meg ezt a [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 fórum bejegyzést] (angol).
  
 +
==Eredeti közreműködők==
 +
Ez az oldal az epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWindowsUnderLinux változat] átalakításával készült.
  
==Original Contributors==
+
{{AutoCategory}}
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWin32UnderLinux version].
 
-->
 

Latest revision as of 13:47, 20 July 2021

English (en) français (fr) magyar (hu) italiano (it) русский (ru) 中文(中国大陆)‎ (zh_CN)

Keresztfordítás Windows-ra Linux rendszeren


Tippek Win32 binárisok keresztfordításához Linux rendszeren

A 0.9.10 óta létezik egy rpm 'fpc-crosswin32' néven, ami telepíti szükséges binutils eszközöket (assembler, linker), az FPC .ppu fájljait win32-re keresztfordítva és a módosított /etc/fpc.cfg.

A csomag nem tartalmazza a keresztfordított LCL .ppu fájlokat. Neked kell lefordítanod őket az fpc-crosswin32 telepítése után.

A Lazarus és a Free Pascal Compiler

A keresztfordításról - Hogy tudd mit csinálsz

Ez egy rövid bevezetés kezdőknek. A következőkben leírjuk hogyan állítsd be a rendszert keresztfordításhoz, ami azt jelenti, hogy Linux rendszeren dolgozva készíthetsz Win32 alkalmazásokat (és ugyanígy FreeBSD, Darwin, stb.). Amiért jó a keresztfordítás: A FreePascal egy fordító és forráskódból gépi kódú 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. 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á. A fordító azonban 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. 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. 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 library) esetén is (ha Lazarus-t használsz). Ezután már fordíthatod is a pascal programokat a win32 rendszerre. Az elkészült binárisok futtathatók a Wine segítségével vagy átmásolhatók egy olyan gépre amin win32 fut és ott kipróbálhatók.

Miért *nix rendszerről windows rendszerre é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.

Szükséged lehet függvénytárakra (library) a célrendszerről (gtk, glib,libc etc), és rengetek finomhangolás elvégzésére van szükség az ld számára (függvénytárak helyei, dynlinker helye, stb.).

Ezek részlegesen megoldottak (a statikus linkelés esetén), de nehéz feladat mert utólagos kézi szerkesztést igényel a linker fájlokban és a parancssorban, és széles ismereteket arról ahogy a Unix binárisok működnek.

Töltsd le az FPC forráskódját

A binárisok letöltése nem elég, szükséged van a teljes FPC forráskódra. Megtalálod az www.freepascal.org címen. Használhatod a CVS-t vagy a napi kódot (snapshot). A következő példák esetében az FPC forráskódja a ~/sources/fpc könvtárba lettek letöltve.

Töltsd le a GNU binutils programokat.

Például a binutils-2.18.tar.gz fájlt töltsd le ide: ~/download/binutils-2.18.tar.gz.

A binutils programok keresztfordítása

Az fpcbuild tárhelyén megtalálható egy szkript amivel létre lehet hozni a binutils programokat minden rendszerre: install/cross/buildcrossbinutils

Töltsd le és telepítsd az fpcbuild csomagot:

 []$ cd ~
 []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_2/install install

Készíts másolatot a szkriptről:

 []$ cd ~/install/cross/
 []$ cp buildcrossbinutils buildcrossbinutils.sh

Szerkesztd a változókat az új szkript elején.

A BASE változó mutatja meg a fordítás és telepítés könyvtárát. Ezért ez lehetőleg egy üres könyvtár legyen. Például:

 BASE=~/cross_fpc

Most következnek a letöltött binutils programok. Ha a csomagot a ~/download/binutils-2.18.tar.gz néven mentetted akkor a beállítások a következőképpen nézzenek ki:

 BINUTILSPATH=~/download/
 BINUTILSBASE=binutils
 BINUTILSVERSION=2.18
 BINUTILS_GZIP=yes

A szkript automatikusan összeállítja belőlük az eredeti nevet: ~/download/binutils-2.18.tar.gz. A további változók a célrendszert határozzák meg. Alapértelmezés szerint szép csendben több rendszerre is lefordítja a kódot, ezért a fordítás sok időt (lassú gépeken órákat) vehet igénybe. Ha csak windows-ra akarsz keresztfordítani akkor csak ennyi kell:

 TARGETS_WIN="mingw32"
 

a többit pedig megjegyzésbe kell áttenni:

 #BSD="freebsd netbsd openbsd"
 #TARGETS_WIN="cygwin mingw32 msdosdjgpp"
 #TARGETS_I386="${BSD} linux solaris darwin"
 #TARGETS_POWERPC="${BSD} linux darwin"
 #TARGETS_SPARC="${BSD} linux solaris"
 #TARGETS_M68k=


Ezután futtasd a szkriptet:

 []$ sh buildcrossbinutils.sh
 

A szkript létrehozz a 'logs' nevű alkönyvtárat tele naplófájlokkal. Ha valami rosszul megy akkor itt kezdj nyomozni.

Ne felejtsd el, hogy több rendszerhez (Linux, FreeBSD, win32) ezek az eszközök már elérhetők lefordítva is. Lásd: ftp://freepascal.stack.nl/pub/fpc/contrib/cross/

Az FPC keresztfordítása

Az fpcbuld tárhelyén megtalálható egy szkript az FPC napi kód (snapshot) keresztfordításához több rendszerhez: install/cross/buildcrosssnapshot Készíts másolatot a szkriptről:

 []$ cd ~/install/cross/
 []$ cp buildcrosssnapshot buildcrosssnapshot.sh

Szerkesztd a változókat az új szkript elején.

Általában csak a CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS és TARGETS_CPU értékeit kell beállítanod. Például:

 CROSSTOOLSROOT=~/cross_fpc/cross
 FPCCVS=~/sources/fpc
 TARGETS_OS="win32"
 TARGETS_CPU="i386"
 DESTDIR=~/cross_fpc/
 

Ezután futtasd a szkriptet:

 []$ sh buildcrosssnapshot.sh

Ezután a megtalálod a keresztfordított unit fájlokat a ~/cross_fpc/ könyvtárban.

Az fpc.cfg beállításai

Rendszergazdaként nyisd meg az /etc/fpc.cfg fájlt vagy készíts másolatot az /etc/fpc.cfg fájlról ~/fpc.cfg néven, majd szerkesztd ezt a fájlt. Keresd meg benne a unit-ok útvonalait meghatározó részt.

Ne felejtsd el, hogy a régebbi FPC változatok a $version és $target változókat használják az $fpcversion és $fpctarget helyett.

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

Cseréld le őket az egyes rendszereknek megfelelő útvonalakra. Pélául normál Linux és keresztfordított win32 esetében így:

#IFDEF win32
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/*
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/rtl
-XPi686-mingw32-
-FD~/cross_fpc/cross/bin
#ELSE linux
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
#-Fu~/fpc/packages/*;~/fpc/rtl/linux
#ENDIF

Tennivaló: Tesztelés és hibaelhárítás

Az LCL és a Lazarus komponensek keresztfordítása

Parancssorban:

cd lazarus; make clean all OS_TARGET=win32
cd lazarus/lcl; make clean all 

Ez először lefordít mindent win32 rendszerre (beleértve az IDE-t is, ami nem szükséges).

Vagy az IDE-ben: Állítsd be az LCL, Synedit, Codetools, Package Registration és IDE Interface fordítását Clean+Build-re, az LCL interface-t win32/win64-re és a 'Target OS' (célrendszer) pedig win32 legyen. Ezután fordítsd újra a Lazarus-t ('build lazarus'). Ez a négy rész külön könyvtárba kerül, ezért a linux .ppu/.o fájlok *nem* lesznek felülírva és nem kell újrafordítanod őket.

Egy projekt keresztfordítása

Kattints a Project->Compiler Options menüpontra és a Code fülön állítsd be a célrendszert (Target OS) 'win32'-re, a Paths fülön pedig az 'LCL Widget Type'-t szintén 'win32'-re. Ennyi. A következő fordításnál win32 binárist fogsz létrehozni. Az IDE újraellenörzi a win32 unit-okat, így a 'Find declaration' és a 'code completion' lehetőségek a win32 és nem a linux rtl adataival működnek majd. Amikor új projectet nyitsz meg vagy újra megnyitod ezt, az IDE automatikusan váltani fog.

Tippek a Keresztfordításhoz Lazarus-ban

Ha több célrendszerre készítesz alkalmazást/csomagot, a következő műveleteket kell sokszor elvégezned: Hibajavítás, fordítás és tesztelés linux-on, aztán fordítás és tesztelés win32 rendszeren, ... Mivel normál esetben felülírod a .ppu fájlokat, újra kell fordítanod mindent, minden alkalommal amikor váltasz. De erre már nincs szükség. A Lazarus IDE támogatja a makrókat.

1. példa: Egy projekt keresztfordítása linux és win32 rendszerekre.

Állítsd be a Project->Compiler Options->Paths->Unit Output directory értékét $(TargetOS)-ra. Ez a makró le lesz cserélve a Code->TargetOS sorban található értékre csak kisbetűkkel (pl. "linux"-ra a Linux és "win32"-re a Win32 esetében). A kimeneti könyvtár egy relatív útvonal lesz a projekt könyvtárához iszonyítva (ahol az .lpi fájl található). Létre lesz hozva egy-egy könyvtár linux és win32 néven a projekt könyvtárában. Amikor a "Show Options" gombra kattintasz a 'Compiler options' alján, egyebek mellett látni fogod a -FElinux/ vagy -FEwin32/ paramétereket. Ezek határozzák meg, hogy hová kerüljön kimenet (a .ppu/.o fájlok).

2. Példa: Projekt keresztfordítása különböző rendszerekre és eszközkészletekre (widget set).

Állítsd be a 'Unit output directory' értékét így: $(TargetCPU)/$(TargetOS)/$(LCLWidgetType) és hozd létre a könyvtárakat minden célrendszerhez. Ezt a könyvtárszerkezetet használja az LCL is.

Ugyanezeket kell elvégezni a csomagok esetében is.

Lazarus csomagok keresztfordítása

A Lazarus csomagok nincsenek függvénytárakra korlátozva. Szinte mindenre lehet használni. Az IDE pedig szükség esetén újrafordítja őket. A csomagok örökölhetik a fordítási paramétereket. Például: A projekt amelyik a csomagot használja örökli a csomag kimeneti könyvtárát. Más szavakkal: a csomag kimeneti könyvtára hozzá lesz adva a projekt unit-ok könyvtárainak listájához (unit search path). Az IDE-ben itt találod: Project -> Compiler options -> Inherited. Az öröklés általában csak egy irányba működik. De vannak kivételek: A projekt célrendszerének beállítása (OS és CPU) felülbírálja az összes csomag célrendszerbeállítását. Ez azt jelenti, hogy ha a projekt célrendszerét win32-re állítod és fordítod a projektet, az IDE elenörzi, hogy a használt csomagokat újra kell-e fordítani erre a célrendszerre.

Például:

Az A csomag kimeneti könyvtára: lib/$(TargetOS) A projekt használja az A csomagot.

  1. A projekt linux rendszerre készül. Az IDE lefordítja az A csomagot linux rendszerre a <PackageDirOfA>/lib/linux/ könyvtárba, ezután lefordítja a csomagot linux rendszerre.
  2. A csomag win32 rendszerre készül. Az IDE lefordítja az A csomagot win32 rendszerre a <PackageDirOfA>/lib/win32/ könyvtárba, ezután lefordítja a csomagot win32 rendszerre.
  3. A projekt ismét linux rendszerre lesz fordítva. Az IDE ellenörzi, hogy az A csomag le lett-e már fordítva linux rendszerre és nem fordítja újra. Ezután lefordítja a projektet linux rendszerre.

A makrók hazsnálatával sok időt lehet megtakarítani.

Unix rendszerre (általános)

Az -XLA paraméterrel tudod a pascal unit-ban megadott függőségeket átnevezni. Formátuma -XLAold=new, az ld paramétere pedig -l<régi> helyett -l<új> legyen.

Az -XR<sysroot> paraméterrel megadhatod a célrendszerhez használt gyökérkönyvtárat. Amire a következők miatt lehet szükség:

  • előtag illesztése a függvénytárak útvonala elé; a múltban a -Xd használatával és az útvonalak kézi megadásával lehetett elérni ugyanezt. Például i386-linux esetén az ld számára a /lib, /usr/lib, és /usr/X11R6/lib átadása helyett a <sysroot>/lib, <sysroot>/usr/lib, és <sysroot>/usr/X11R6/lib kerül átadásra.
  • felismerni a C függvénytárat (linux függő): glibc vagy uclibc. Például uclibc keresése esetén a '<sysroot>/lib/ld-uClibc.so.0' lesz használva.

Linux rendszerre Win32 alatt

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

FreeBSD-ről sparc-ra

Végigcsináltam egy keresztfordítást x86-ról Sparc Solaris 9 rendszerre. Azonban az eredmény nem volt megfelelő. Itt a parancsror amit futtattam:

 gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'

Az ~/src/sollib egy könyvtár ami a következőket tartalmazta:

  • több .o fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
  • a libgcc.a fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
  • több lib*.so fájlt a /usr/lib könyvtárból: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so

A problémát a következő példa mutatja meg.

 Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
 Copyright (c) 1993-2005 by Florian Klaempfl
 Target OS: Solaris for SPARC
 Compiling system.pp
 system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found

Azt gyanítom, hogy rossz .o fájlokat kapott.

Mac OS X

Nézd meg ezt a fórum bejegyzést (angol).

Eredeti közreműködők

Ez az oldal az epikwiki változat átalakításával készült.