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

From Lazarus wiki
(Traduction partielle de la page qui était en anglais (des adaptations mineures ont été faites))
(Allow for a name change on another page)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
{{Compilation croisée pour Win32 sous Linux}}
+
{{Cross compiling for Windows under Linux}}
  
 
== Conseil pour la compilation croisée des binaires Win32 sous Linux ==
 
== Conseil pour la compilation croisée des binaires Win32 sous Linux ==
Line 11: Line 11:
 
=== A propos de la compilation croisée - Savez vous ce que vous faites ? ===
 
=== A propos de la compilation croisée - Savez vous ce que vous faites ? ===
  
This is a short introduction for newbies.
+
C'est une petite introduction pour les nouveaux.
 
Les sections suivantes décrivent comment configurez un system pour la compilation croisée, cela veut dire sous Linux crée des éxécution Win32 (ou FreeBSD, Darwin, ...).
 
Les sections suivantes décrivent comment configurez un system pour la compilation croisée, cela veut dire sous Linux crée des éxécution Win32 (ou FreeBSD, Darwin, ...).
  
Line 91: Line 91:
 
form already. Voir ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
 
form already. Voir ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
  
=== Cross build FPC ===
+
=== Compilation croisée de FPC ===
  
In the fpcbuld repository there is a script to build the fpc snapshot for
+
Dans le répertoire de fpcbuild il existe un script pour construire une snapshot de FPC pour toutes les compilations croisées: install/cross/buildcrosssnapshot
all cross platforms: install/cross/buildcrosssnapshot
+
Crée une copie de secours du script
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.
+
Éditer les variables au début du script. Normalement vous n'aurez à changez que ''CROSSTOOLSROOT'', ''FPCCVS'', ''DESTDIR'', ''TARGETS_OS''
 
+
et ''TARGETS_CPU''. Par exemple :
Normally you will change at least CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS
 
and TARGETS_CPU. For example:
 
 
    
 
    
 
   CROSSTOOLSROOT=~/cross_fpc/cross
 
   CROSSTOOLSROOT=~/cross_fpc/cross
Line 111: Line 108:
 
   DESTDIR=~/cross_fpc/
 
   DESTDIR=~/cross_fpc/
 
    
 
    
Then run the script:
+
Puis lancer le script
  
 
   []$ sh buildcrosssnapshot.sh
 
   []$ sh buildcrosssnapshot.sh
  
After this you got cross compiled units in ~/cross_fpc/
+
Après cela vous aurez les binaires nécessaire à la compilation croisée pour Win32 sous i386 dans ~/cross_fpc
  
=== Configure your fpc.cfg ===
+
=== Configurez votre fpc.cfg ===
  
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
+
Éditer en root votre /etc/fpc.cfg ou copier le dans ~/fpc.cfg et éditer ce fichier ('''crée une sauvegarde avant de l'éditer !''') .Chercher dans la configuration les chemins de recherches des unités
  
Note: On older versions of FPC $version and $target are used instead of $fpcversion and $fpctarget  
+
Note: Sur les anciens FPC $version et $target sont nommés $fpcversion et $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/*
 
  -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:
+
Remplacer les par bos chemins vers les autres plateformes. Par exemple pour compiler sous win32 en i386:
 
  #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 142: Line 139:
 
ToDo: Test and troubleshooting
 
ToDo: Test and troubleshooting
  
=== Cross compiling the LCL and lazarus components ===
+
=== Faire la compilation croisée pour la LCL et les composants Lazarus ===
  
At Command line:
+
En ligne de commande
 
  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).  
+
Cela va tout d'abord tout compiler pour Win32 (dont l'IDE inutile en Win32).  
  
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'.  
+
Ou sinon dans l'IDE: Set LCL, Synedit, Codetools, Package Registration and IDE Interface to Clean+Build, set LCL interface to win32/win64 et mettez  'Target OS' à win32. Enfin construisez 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.
+
C'est 4 parties have splitted output directories, mais vos fichiers .ppu/.o pour Linux n'ont *pas* été écraser et vous n'avez pas à les recompiler.
  
=== Cross compiling a project ===
+
=== Compiler un projet en compilation croisée ===
  
Set in Project->Compiler Options->Code the Target OS to 'win32' and in Paths the
+
Mettez dabs Project->Compiler Options->Code Target OS a 'win32' et le chemin de
'LCL Widget Type' to win32. That's all. The next time you build, you will
+
'LCL Widget Type' à win32. C'est tout ! Maintenant quand vous allez construire vous allez crée un éxécutable Win32.
create a win32 executable.
+
L'IDE va également rescannez les unités (ici Win32), donc la complétition de code va alors être réglez pour les unités Win32. Quand vous allez charger un autre projet l'IDE va automatiquement reprendre la configuration du projet (s'il ne le fait pas c'est pas grave).
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 ===
+
=== Conseil pour la compilation croisée et Lazarus ===
  
 
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.
 
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.
Line 239: Line 232:
  
 
== For Mac OS X ==
 
== For Mac OS X ==
See this [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 forum post].
+
See this [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 forum post]. '''Le lien est brisée.'''
  
  

Latest revision as of 12:49, 20 July 2021

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

Conseil pour la compilation croisée des binaires Win32 sous Linux

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

It does not contain the cross compiled LCL .ppu files. You need to compile them yourself, after installing fpc-crosswin32.

Lazarus et et le compilateur Free Pascal

A propos de la compilation croisée - Savez vous ce que vous faites ?

C'est une petite introduction pour les nouveaux. Les sections suivantes décrivent comment configurez un system pour la compilation croisée, cela veut dire sous Linux crée des éxécution Win32 (ou FreeBSD, Darwin, ...).

Pourquoi une compilation croisée ? FreePascal est un compilateur qui convertie basiquement les sources en binaire (language machine). Ces binaires contiennent également des informations sur comment le système d'exploitation (OS) démarre l'application. Donc ces binaires sont spécifiques à une plateforme. FreePascal lui même n'a pas besoin de beaucoup de réglage. Il peut des binaires pour plusieurs plateforme. Il faut lui dire de le faire. Mais le compilateur n'est qu'une partie. Il y a aussi l'assembleur et le linker ! Et ces outils ne sont pas capable de crée un code multiplateforme. C'est pourquoi nous avons crée un linker (ld) et un assmbleur (as) spécial pour chaque plateforme cible. Ce sont les binutils. Après avoir crée les outils multiplateforme, toutes les unités de FPC vont être compilée en une version multiplateforme. Par exemple il y a un seul system.ppu pour toutes les plateformes cibles. Alors le fichier de configuration de FPC (fpc.cfg) va être configurer, c'est pour pourquoi la compilation croisée est tellement facile, mais n'oublions pas les détails enuyeux. La même chose va être faites pour la LCL (Lazarus Component Library).

Après avoir fait votre compilation croisée vers Win32 il faudra le tester avec Wine ou (mieux) sur une machine Windows.

Pourquoi *nix vers Windows et pas l'inverse ?

La principale raison est que la génération des binaires Unix sur une autre plateforme (Windows, ...) est plus compliqué. Les liaisons statiques étant déjà comliquer, Unix utilise la liaison partagée.

Vous auriez besoin d'utiliser les librairies des plateformes cibles (gtk, glib, libc, ...) et beaucoup de configuration pour ld (library paths, dynlinker path etc)

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.

Télécharger les sources de FPC

Les binaires ne sont pas suffisants. Vous aurez besoin de toutes les sources de FPC Voir le site principale. Vous pouvez utiliser un SVN ou une snapshot. Dans cet exemple les sources ont été télécharger dans ~/sources/fpc. (à faire:paquet fpc-source de Debian)

Télécharger les binutils GNU

Dans l'exemle binutils-2.18.tar.gz a été télécharger dans ~/download/binutils-2.18.tar.gz. Surtout ne pas le décompresser ! Pour télécharger voir ici

les binutils de la compilation croisée

Dans le dépôt de fpcbuild il existe un script pour les binutils pour toutes les plateformes: install/cross/buildcrossbinutils

Télécharger et installer fpcbuild Via SVN:

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

Crée une copie du script

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

Éditer les variables :

BASE pointe le dossier de construction et d'installation. Mettez de préférence un dossier vide Par exemple

 BASE=~/cross_fpc

Maintenant on va spécifier où sont les binutils (ici on suppose qu'ils sont dans l'archive ~/download/binutils-2.18.tar.gz)

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

Le script va alors automatiquement utiliser notre archive. Le reste des variables définissent les plateformes à crée. Par défault il en construit énormément et la compilation durent très longtemps (plusieurs sous les machines lentes). Pour la compilation croisée Windows vous avez juste besoin de

 TARGETS_WIN="mingw32"
 

Commentez alors les autres cibles

 #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=


Alors lancer le script

 []$ sh buildcrossbinutils.sh
 

Le script va crée un sous dossier logs qui contient pleins de logs. Utiliser le en cas de problème

Notez que pour plusieurs plateformes (Linux,FreeBSD, win32) these are available in compiled form already. Voir ftp://freepascal.stack.nl/pub/fpc/contrib/cross/

Compilation croisée de FPC

Dans le répertoire de fpcbuild il existe un script pour construire une snapshot de FPC pour toutes les compilations croisées: install/cross/buildcrosssnapshot Crée une copie de secours du script

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

Éditer les variables au début du script. Normalement vous n'aurez à changez que CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS et TARGETS_CPU. Par exemple :

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

Puis lancer le script

 []$ sh buildcrosssnapshot.sh

Après cela vous aurez les binaires nécessaire à la compilation croisée pour Win32 sous i386 dans ~/cross_fpc

Configurez votre fpc.cfg

Éditer en root votre /etc/fpc.cfg ou copier le dans ~/fpc.cfg et éditer ce fichier (crée une sauvegarde avant de l'éditer !) .Chercher dans la configuration les chemins de recherches des unités

Note: Sur les anciens FPC $version et $target sont nommés $fpcversion et $fpctarget

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

Remplacer les par bos chemins vers les autres plateformes. Par exemple pour compiler sous win32 en i386:

#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

ToDo: Test and troubleshooting

Faire la compilation croisée pour la LCL et les composants Lazarus

En ligne de commande

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

Cela va tout d'abord tout compiler pour Win32 (dont l'IDE inutile en Win32).

Ou sinon dans l'IDE: Set LCL, Synedit, Codetools, Package Registration and IDE Interface to Clean+Build, set LCL interface to win32/win64 et mettez 'Target OS' à win32. Enfin construisez Lazarus. C'est 4 parties have splitted output directories, mais vos fichiers .ppu/.o pour Linux n'ont *pas* été écraser et vous n'avez pas à les recompiler.

Compiler un projet en compilation croisée

Mettez dabs Project->Compiler Options->Code Target OS a 'win32' et le chemin de 'LCL Widget Type' à win32. C'est tout ! Maintenant quand vous allez construire vous allez crée un éxécutable Win32. L'IDE va également rescannez les unités (ici Win32), donc la complétition de code va alors être réglez pour les unités Win32. Quand vous allez charger un autre projet l'IDE va automatiquement reprendre la configuration du projet (s'il ne le fait pas c'est pas grave).

Conseil pour la compilation croisée et Lazarus

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. The Lazarus IDE supports macros.

Example 1: Cross compiling a project for linux and win32.

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


Example 2: Cross compiling a project for various platforms and widget sets.

Set the Unit output directory to $(TargetCPU)/$(TargetOS)/$(LCLWidgetType) and create the sub directories for all targets. This path construction is also used by the LCL.


The same can be done for packages.

Cross compiling and Lazarus Packages

Lazarus packages are not limited to libraries. They can be used to compile nearly everything. And the IDE automatically recompiles them if needed. 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: Project -> Compiler options -> Inherited. Inheritance normally works only one way. But there are exceptions: 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.

For example:

Package A has as output directory: lib/$(TargetOS) Project uses A.

  1. The project is built for linux. The IDE compiles A for linux in <PackageDirOfA>/lib/linux/, then it compiles the project for linux.
  2. The project is built for win32. The IDE compiles A for win32 in <PackageDirOfA>/lib/win32/, then it compiles the project for win32.
  3. 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.

For Unix (general)

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

Option -XR<sysroot> (recent trunk) that can be used to specify the target system root. It's used for:

  • 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

This is less trivial, there is some info in the buildfaq

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'

~/src/sollib is a directory that contains:

  • a set of .o's from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
  • libgcc.a from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
  • a set of lib*.so from /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so

Problem is illustrated by the following binary.

 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

I suspect wrong .o's are taken.

For Mac OS X

See this forum post. Le lien est brisée.


Original Contributors

This page has been converted from the epikwiki version.