1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
|
Hints to cross compile under Linux/xxxBSD
=========================================
Thanks to Vincent Snijders for the hints.
================================================================================
A.
For FPC 2.0 and up. On Linux and BSD to other platforms.
(Note: not necessary for cross-compiling to Windows as FPC has had an internal
linker for this platform).s
Abstract:
The following describes how to setup the binutils, FPC and Lazarus for
crosscompiling to other targets. Once you have these cross files you can
switch easily in the Lazarus IDE between any of the target platforms.
IMPORTANT: The FPC units must have the same date/version for all platforms,
because you will use only one compiler. That means:
Whenever you update your FPC, you must update all other cross FPC units too.
The scripts will help you to do this.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
A.1
Requirements:
An installed and working fpc. Preferably the latest stable release.
A good internet connection or manually downloaded FPC sources and binutils.
The following steps don't need the root user. They can be done as normal user.
There are some scripts in <lazarusdir>/tools/install/cross_unix/.
The script "update_cross_fpc.sh" compiles and setups everything in the home
directory of the current user. Therefore it does not need a root account.
Th script "build_linux_cross_win32_rpm.sh" creates the rpm fpc_crosswin32.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Quick start:
If you have a good internet connection, then you can just type
[]$ cd <lazarusdir>/tools/install/cross_unix/
[]$ ./update_cross_fpc.sh all installasdefault
This will download the needed sources, compile them for your platform plus
i386-win32.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
What needs to be downloaded:
For cross compilation you need a cross compiler, cross linker, cross assembler,
... . FPC is already a cross compiler for all supported targets. The rest is
provided by the binutils, which will be compiled for every needed target system.
The script needs the binutils sources and the FPC sources. By default it will do
[]$ mkdir -p ~/freepascal/download
[]$ cd ~/freepascal/download
[]$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.16.tar.gz
If you don't have a good internet connection, you can download it manually.
And by default the script will download the FPC SVN source tree via
[]$ svn co http://svn.freepascal.org/svn/fpc/branches/fixes_2_0 ~/freepascal/fpc
[]$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_0/install ~/freepascal/install
This requires an installed 'svn' package.
If you don't have a good internet connection, you can download them manually
from http://www.freepascal.org/develop.html#sourcesv20. Unpack the fpc sources
to ~/freepascal/fpc, that means there should be a directory
~/freepascal/fpc/compiler/.
TODO: write, where you can get the fpc 'install' directory sources.
================================================================================
What the Lazarus scripts do / Doing it by hand:
1. Download the FPC sources
IMPORTANT: Your current FPC must be the same version/date as the FPC sources.
If your installed FPC is different, you can compile a new FPC from the
sources.
The binaries are not enough.
See www.freepascal.org. You can use the svn or a daily snapshot.
For example:
[]$ mkdir ~/freepascal/
[]$ cd ~/freepascal/
[]$ svn co http://svn.freepascal.org/svn/fpc/branches/fixes_2_0 fpc
[]$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_0/install install
If you want the unstable development version use:
[]$ svn co http://svn.freepascal.org/svn/fpc/trunk fpc
[]$ svn co http://svn.freepascal.org/svn/fpcbuild/trunk/install install
Keep in mind that the development version has a lot more features, but often
some serious bugs.
For the following examples the fpc sources were downloaded
to ~/freepascal/fpc.
2. Download the binutils.
For example binutils-2.14.tar.gz downloaded to
~/download/binutils-2.14.tar.gz.
Homepage:
http://www.gnu.org/software/binutils/
Download
http://ftp.gnu.org/gnu/binutils/
At the time of writing the version was binutils-2.16.tar.gz.
For example:
[]$ cd ~/download
[]$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.16.tar.gz
3. Cross build binutils
In the FPC source directory there is a script to build the binutils for all
cross platforms: install/cross/buildcrossbinutils
Create a copy of the script:
[]$ cd ~/freepascal/install/cross/
[]$ cp buildcrossbinutils buildcrossbinutils.sh
Edit the variables at the start of the new script:
The BASE variable points to a building and installation directory. So, it
should be an empty directory. For example:
BASE=~/freepascal/binutils
Now the download file. If you downloaded ~/download/binutils-2.14.tar.gz then
set
BINUTILSPATH=~/download/
BINUTILSBASE=binutils
BINUTILSVERSION=2.14
BINUTILS_GZIP=yes
The script will automatically combine this to ~/download/binutils-2.14.tar.gz.
The other variables define what target platforms you have. The default is to
build quite a lot, so compilation will take some time (hours).
For cross compile to Windows, you need only
TARGETS_WIN="mingw32"
and to comment all other:
#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=
Then run the script:
[]$ cd ~/freepascal/install/cross/
[]$ sh buildcrossbinutils.sh
The script creates a subdirectory 'logs' full of log files. If something goes
wrong, start there. The scripts should end with a message 'Failed targets: '
without failed targets.
4. Cross build FPC
In the FPC source directory there is a script to build the FPC snapshot for
all cross platforms: install/cross/buildcrosssnapshot
Create a copy of the script:
[]$ cd ~/freepascal/install/cross/
[]$ cp buildcrosssnapshot buildcrosssnapshot.sh
Edit the variables at the start of the new script.
Normally you will change at least CROSSTOOLSROOT, FPCCVS, TARGETS_OS
and TARGETS_CPU. For example:
CROSSTOOLSROOT=~/freepascal/binutils/cross
FPCCVS=~/freepascal/fpc
TARGETS_OS="win32"
TARGETS_CPU="i386"
And fix the line
MOS=cygwin
to
MOS=mingw32
Then run the script:
[]$ sh buildcrosssnapshot.sh
This will create the FPC binaries under
~/freepascal/binutils/cross/destination/.
================================================================================
Obsolete:
B.
For fpc 1.0.x:
Hints to cross compile win32 binaries under linux
1. Download the GNU binutils - Binary Utility Development Utilities.
Many packages (RPM, DEB, TGZ) are outdated or not compatible. So, here is a link
that worked for me:
http://jrfonseca.dyndns.org/projects/gnu-win32/documentation/cross/
Download all files into a directory of your choice. The directory should have
at least 250mb space which will be needed for building.
There is a small bug in xmingw32.mak. Open the file, search for '#$(GCC' and
remove the '#' character to uncomment.
Then do as root 'make -f xmingw.mak'. This will download the binutils, the gcc
and the mingw32 files and will compile them. Then it installs them under
/usr/local/xmingw32/. You can change the target directory and compile as
normal user by changing the script.
2. The cross tools needed by FPC
FPC needs four files: asw, ldw, windres and dltool. You can
- link the following files:
[]$ ln -s /usr/local/xmingw32/bin/mingw32-as /usr/bin/asw
[]$ ln -s /usr/local/xmingw32/bin/mingw32-ld /usr/bin/ldw
[]$ ln -s /usr/local/xmingw32/bin/mingw32-windres /usr/bin/windres
[]$ ln -s /usr/local/xmingw32/bin/mingw32-dlltool /usr/bin/dlltool
You can link them as normal user somewhere in your home. But then you have to
add this directory to your PATH or add -FD/your/directory everytime you cross
compile with fpc.
2. Download or compile the win32 units (ppw,ow files for rtl, fcl). These files
must be compatible (depending on the compiler probably 1.0.10 as of now).
Install them next to the linux units in /usr/lib/fpc/1.0.x/units.
See (a) or (b).
(a) Download the win32 units: Currently you can download the win32 snapshots at
ftp://ftp.freepascal.org/pub/fpc/snapshot/v10/win32-i386/
and unzip them into $UsrLib/fpc/$FPCVersion/units/win32. $UsrLib is the place
where fpc is installed. Probably /usr/lib/ or /usr/local/lib.
(b) Compile the win32 units:
Download the fpc sources, compile them and install them. This makes sure your
compiler is compatible to the source. The same source directory can be used for
win32, because the output files have different names (.ppu <> .ppw, .o <> .ow).
Then compile the win32 units (.ppw, .pw):
[]$ make clean OS_TARGET=win32
[]$ make -C compiler cycle OS_TARGET=win32
[]$ make fcl packages OS_TARGET=win32
Install the units:
[]$ make -C rtl install OS_TARGET=win32
[]$ make -C fcl install OS_TARGET=win32
[]$ make -C packages install OS_TARGET=win32
This will create the correct directory structure, but probably in the wrong
directory. Move the /usr/local/lib/fpc/<version>/i386-win32/units directory to
your fpc install directory. For example if your linux units (e.g. classes.ppu)
is located in /usr/lib/fpc/1.0.10/units/linux/ then do
[]$ rm -rf /usr/lib/fpc/<version>/units/win32
[]$ mv /usr/local/lib/fpc/<version>/cross/i386-win32/units /usr/lib/fpc/<version>/units/win32
3. Making /etc/fpc.cfg target independent:
Make sure that your /etc/fpc.cfg contains target independent paths:
-Fu/usr/lib/fpc/$version/units/$target
-Fu/usr/lib/fpc/$version/units/$target/*
-Fu/usr/lib/fpc/$version/units/$target/rtl
You should now be able to cross compile simple pascal programs with
'ppc386 -Twin32 pascalfile.pas'
Or if you did not link the four files (asw, ldw, ...) to /usr/bin:
'ppc386 -FD/your/directory -Twin32 pascalfile.pas'
================================================================================
4. Cross compiling the LCL
4.1 Command line: cd lazarus/lcl; make OS_TARGET=win32
4.2 In the IDE: Set LCL to Clean+Build, set LCL interface to win32 and
set 'Target OS' to win32. Then 'build lazarus'.
5. Cross compiling a project
Set in Run->Compiler Options->Code the Target OS to 'win32' and in Paths the
'LCL Widget Type' to win32. That's all. The next time you build, you will
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.
================================================================================
|