Sign in Join
Wiki copytemporary

Setup Cross Compile For ARM

Bahasa Indonesia · English · Español · Magyar · Русский

How To setup Lazarus/FPC for arm-linux cross compiling.

With this tutorial you can make a binary file that runs on arm-linux devices. This is tested with a Nokia N900 with "Maemo 5 OS" (the gnu/linux Debian based OS, developed by Nokia. It is an arm-linux device that runs GTK2 and QT4.6).

If you need a simple "command prompt"/"terminal" program, after #fpc for ARM section skip to #APPENDIX A: Testing console programs.

NOTE 1: All procedures are tested on a Virtual Machine with Ubuntu 9.10 - x86 with Windows 7 as host and VirtualBox 3.0.12 as virtual machine. It is a fresh install, with all updates up to date.

NOTE 2: Replace every /home/user/ with your real user path. All other paths are simply for explanation. If you use "Maemo SDK Virtual Image", replace every /home/user/ with /home/maemo/

Automated Script

The previously provided scripts are obsolete. Please see HERE (see discussion page for alternative.

Generic things to do

Warning: These instructions are quite old - they refer to 2.2.4 while the current (December 2013) stable FPC is 2.6.2. Please adjust as you follow these and update the page. Thanks.

Downloads

Unpack/copy all files in the respective directories

FPC 2.2.4 installer:

text
~/fpc_tools/fpc_2.2.4/fpc-2.2.4-20091214.i386.rpm

Binutils sources:

text
~/fpc_tools/binutils-2.20/

Lazarus sources:

text
~/lazarus/

FPC 2.5.1 sources:

text
~/lazarus/fpc/2.5.1/

Prepare Target Libs

Install dependencies

bash
sudo apt-get install -y alien libncurses5-dev libXp-dev libgtk2.0-dev

Install & Configure Binutils

Compile binutils for arm-linux

bash
cd ~/fpc_tools/binutils-2.20
./configure --target=arm-linux --disable-werror
make
sudo make install
mkdir ~/lazarus/fpc/binutils
ln -s /usr/local/bin/arm-linux-ar ~/lazarus/fpc/binutils/ar
ln -s /usr/local/bin/arm-linux-ld ~/lazarus/fpc/binutils/ld
sudo mv /usr/local/bin/arm-linux-as /usr/local/bin/arm-linux-as_org

sudo gedit /usr/local/bin/arm-linux-as
bash
#!/bin/sh
/usr/local/bin/arm-linux-as_org -meabi=5 $@

NOTE: option -meabi=5 force assembler to make binary eabi v5 compatible. E.g. if you need eabi v4 you will change it in -meabi=4.

bash
sudo chmod +x /usr/local/bin/arm-linux-as
ln -s /usr/local/bin/arm-linux-as ~/lazarus/fpc/binutils/as

FPC

Install precompiled fpc 2.2.4 branch

REMEMBER TO CHANGE EVERY/home/user/WITH YOUR OWN USER PATH!

bash
sudo alien -i -c /home/user/fpc_tools/fpc_2.2.4/fpc-2.2.4-20091214.i386.rpm
bash
which ppc386

if ppc386 is in the path it returns the path (e.g. /usr/bin/ppc386)

Compile FPC from sources

bash
cd ~/lazarus/fpc/2.5.1
make all OPT='-gl -O3p3' PP=/usr/bin/ppc386 (add NOGDB=1 at the end if asked)
sudo make install PP=/usr/bin/ppc386 PREFIX=/usr/ (add NOGDB=1 at the end if asked)
sudo rm /usr/bin/ppc386
sudo ln -s /usr/lib/fpc/2.5.1/ppc386 /usr/bin/ppc386
sudo mkdir /usr/share/fpcsrc/
sudo ln -sf ~/lazarus/fpc/2.5.1/ /usr/share/fpcsrc/
sudo /usr/lib/fpc/2.5.1/samplecfg /usr/lib/fpc/2.5.1/ /etc

FPC for ARM

Make FPC able to cross compile for arm-linux

bash
cd ~/lazarus/fpc/2.5.1/
sudo make crossinstall CPU_TARGET=arm OS_TARGET=linux CROSSBINDIR=/home/user/lazarus/fpc/binutils/ OPT=-dFPC_ARMEL INSTALL_PREFIX=/usr

Create custom fpc.cfg

REMEMBER TO CHANGE EVERY/home/user/WITH YOUR OWN USER PATH!

bash
gedit ~/.fpc.cfg
bash
sudo ln -sf /usr/lib/fpc/2.5.1/ppcrossarm /usr/local/bin/ppcarm

Lazarus

If you don't need graphical programs, you can skip this section and go directly to #Appendix B: Target libs

Compile Lazarus

bash
cd ~/lazarus
make clean all

Start Lazarus

bash
./lazarus

Configure Lazarus for cross Compile

Make your first arm-linux project in Lazarus

New Project

Set Targets

Add target libs to your project

REMEMBER TO CHANGE EVERY/home/user/WITH YOUR OWN USER PATH!

Build Project

Time to run

bash
chmod +x /path/where/is/YourProject
./path/where/is/YourProject

APPENDIX A: Testing console programs

Create a TestARM.pas

bash
mkdir ~/dev/TestARM/
gedit ~/dev/TestARM/TestARM.pas
pascal
program test;
begin
  writeln('DATE ',{$i %DATE%});
  writeln('FPCTARGET ',{$i %FPCTARGET%});
  writeln('FPCTARGETCPU ',{$i %FPCTARGETCPU%});
  writeln('FPCTARGETOS ',{$i %FPCTARGETOS%});
  writeln('FPCVERSION ',{$i %FPCVERSION%});
end.
bash
cd ~/dev/TestARM/
fpc -Tlinux -Parm -XParm-linux- TestARM.pas

Time to run

bash
chmod +x /path/where/is/TestAMR
./path/where/is/TestAMR

Appendix B: Target libs

You need target libs to assemble and link binary file. You can find them into the SDK of your device or into the device itself.

E.g. for Nokia N900 you need to copy /lib/* and /usr/lib/* (no subdirs needed) that are present in the Nokia N900 root and you must merge all files to ~/lazarus/fpc/libcross/
Finally, you need to rename each library not found by linker (ld) to the file name searched by linker itself.
E.g. if you got this error

text
libX11.so not found (or incompatible)

and you have a file called libX11.so.6.2.0, then you need to rename it into libX11.so

See also


From the Free Pascal wiki, page "Setup Cross Compile For ARM", as it stood on 2020-11-26 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 4, last changed by WikiArchive .

Edited on wiki.freepascal.org by 14 people, 2004–2020

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
FPKCross Compile with FPC for ARM (e.g. Zaurus)
FPKCross Compile with FPC for ARM (e.g. Zaurus)
FPKCross Compile with FPC for ARM (e.g. Zaurus) (minor)
FPKCross Compile with FPC for ARM (e.g. Zaurus)
FPKupdated for 1.9.7 snapshot
FPKCross Compile with FPC for ARM (e.g. Zaurus)
Gábor
Gábor
Gábor
Gábor (minor)
KjowSetup Lazarus/FPC for arm-linux cross compiling.
DoDiConfigure Lazarus for corss Compile (minor)
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowTime to run
KjowAdd terget libs to your project
KjowHow To setup Lazarus/FPC for arm-linux cross compiling.
MischiAdd terget libs to your project: typo (minor)
KjowHow To setup Lazarus/FPC for arm-linux cross compiling.
KjowCreate a TestARM.pas
KjowAdd target libs to your project
KjowCreate custom fpc.cfg
KjowCreate custom fpc.cfg
KjowCreate custom fpc.cfg
KjowUnpack all sources file here
KjowUnpack/copy all sources/binary file in the respective directory
KjowInstall precompiled fpc 2.2.4 branch
KjowDownloads
KjowAppendix B: Target libs
KjowHow To setup Lazarus/FPC for arm-linux cross compiling.
KjowAppendix B: Target libs
KjowAutomated Script
KjowAutomated Script
KjowAutomated Script
KjowAutomated Script
KjowCreate a TestARM.pas
KjowConfigure Lazarus for cross Compile
KjowConfigure Lazarus for cross Compile
KjowAdd target libs to your project
Chronos
KjowWhat scripts do
KjowAppendix B: Target libs
CkranichCreate a TestARM.pas
CkranichSet Targets
KjowWhat scripts do
KjowAutomated Script
KjowAppendix B: Target libs
Chronossyntaxhighlight
Chronoscategory
JuhaManninenConfigure Lazarus for cross Compile
BigChimpcategories (minor)
BigChimpHow To setup Lazarus/FPC for arm-linux cross compiling. (minor)
BigChimpUndo revision 67014 by BigChimp (talk) (minor)
BigChimpAppendix B: Target libs (minor)
Jwdietrich
Jwdietrich
Jwdietrich
BigChimpGeneric things to do: warning
BigChimp (minor)
KjowAutomated Script
BigChimpAutomated Script: Removed info about obsolete scripts as I think it will now only confuse users. If you still want to retain it for some reason,, please revert this edit. Thanks.
BlaisePHow To setup Lazarus/FPC for arm-linux cross compiling.: note moved to discussion page (minor)
BlaisePAutomated Script (minor)
BlaisePConfigure Lazarus for cross Compile (minor)
FTurtle
GiulianoRemoved from fpc.cfg extra lines which are either useless or harmful. Left only what is relevant for the purpose of cross-compiling
TrevFixed syntax highlighting; deleted category included in page template (minor)
TrevSee also: Add entry
TrevSee also: clarified description (minor)

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.