Difference between revisions of "Building for Raspbian"

From Ultibo.org
Jump to: navigation, search
 
(4 intermediate revisions by the same user not shown)
Line 13: Line 13:
 
The instructions below detail the process of building both the modified Free Pascal compiler and the Ultibo RTL in order to create a working configuration that allows developing Ultibo applications.
 
The instructions below detail the process of building both the modified Free Pascal compiler and the Ultibo RTL in order to create a working configuration that allows developing Ultibo applications.
  
This process was tested and developed using the latest Raspbian Jessie from the [https://www.raspberrypi.org/downloads/raspbian/ Raspberry Pi downloads] page, at the time of writing this has a release date of 27 May 2016 however it is possible that later or earlier versions may also work. There is at least one required package that is not available for Raspbian Wheezy versions.
+
This process was last tested using the latest Raspbian Bullseye (32-bit only) from the [https://www.raspberrypi.com/software/operating-systems/ Raspberry Pi operating system images] page, at the time of writing this has a release date of April 4th 2022 however it is possible that later or earlier versions may also work.
  
 
In order to avoid any conflict with official FPC releases these instructions install all components into a folder within your home directory, if you follow these instructions the Ultibo version of Free Pascal as well as the RTL and sources will be located in the <code>/home/pi/ultibo/core</code> folder.
 
In order to avoid any conflict with official FPC releases these instructions install all components into a folder within your home directory, if you follow these instructions the Ultibo version of Free Pascal as well as the RTL and sources will be located in the <code>/home/pi/ultibo/core</code> folder.
  
Currently Raspbian does not provide a package for the 3.0.0 release of Free Pascal, this version is needed as the starting point for these instructions and the following will NOT work if you start with version 2.6.4 which is the most recent version provided in the official Raspbian packages.
+
Compiling the Ultibo edition of Free Pascal requires using the official 3.2.2 release version as the starting point, these instructions will NOT work if you start with version 3.0.2 or any other version. Fortunately the FPC team provide a precompiled download of FPC 3.2.2 which can be obtained from the [http://www.freepascal.org/download.var download] page and installed using the provided instructions.
 
+
The simplest way we know to get a fully working installation of Free Pascal 3.0.0 is to follow the instructions at [http://www.getlazarus.org/setup/?download#raspberry_pi GetLazarus.org] which will by default install a working copy in the folder <code>/home/pi/Development/FreePascal</code> that can be deleted later if you choose.
+
  
 
=== Building Free Pascal (Ultibo Edition) ===
 
=== Building Free Pascal (Ultibo Edition) ===
 
----
 
----
  
Assuming you have a working FPC 3.0.0 installation as discussed above, you can now proceed with the first stage of the process which is to build a Raspbian native version of the Ultibo edition of FPC.
+
Assuming you have a working FPC 3.2.2 installation as discussed above, you can now proceed with the first stage of the process which is to build a Raspbian native version of the Ultibo edition of FPC.
  
These instructions assume that FPC 3.0.0 from GetLazarus was installed to:
+
These instructions assume that FPC 3.2.2 from the official download was installed to:
  
  /home/pi/Development/FreePascal/fpc/bin
+
  /usr/local/bin/fpc
  
 +
If you are using another version or installed it to your home folder instead then you may need to temporarily add it to the path so it is used in preference to any official version, by default you can do something like this to add the appropriate folder to the path temporarily:
  
You should now download the sources of the FPC Ultibo edition from [https://github.com/ultibohub/FPC GitHub] and unzip the contents to the folder:
+
export PATH=/home/pi/fpc-3.2.2/bin:$PATH
  
/home/pi/ultibo/core
 
  
After extracting the files rename the folder <code>FPC-master</code> to <code>fpc</code> so the contents of the zip will be in <code>/home/pi/ultibo/core/fpc</code>
+
You should now download the sources of the FreePascal Ultibo edition from [https://github.com/ultibohub/FreePascal/tree/ultibo-3.2.2 GitHub] and unzip the contents to the folder:
 +
 
 +
/home/pi/ultibo/core/fpc
 +
 
 +
After extracting the files rename the folder <code>FreePascal-ultibo-3.2.2</code> to <code>source</code> so the contents of the zip will be in <code>/home/pi/ultibo/core/fpc/source</code>
  
  
Line 48: Line 50:
 
And finally extract the <code>units</code> folder to the location:
 
And finally extract the <code>units</code> folder to the location:
  
  /home/pi/ultibo/core/fpc
+
  /home/pi/ultibo/core/fpc/lib/fpc/3.2.2
  
  
Line 54: Line 56:
  
 
  cd /home/pi/ultibo/core/fpc/source
 
  cd /home/pi/ultibo/core/fpc/source
 
Add the path to FPC 3.0.0 to the environment:
 
 
export PATH=/home/pi/Development/FreePascal/fpc/bin:$PATH
 
  
 
Do the following steps in order, checking that each was completed successfully before continuing:
 
Do the following steps in order, checking that each was completed successfully before continuing:
Line 71: Line 69:
 
  cp /home/pi/ultibo/core/fpc/source/compiler/ppcarm /home/pi/ultibo/core/fpc/bin/ppcarm
 
  cp /home/pi/ultibo/core/fpc/source/compiler/ppcarm /home/pi/ultibo/core/fpc/bin/ppcarm
  
Run the following to check that it shows as version 3.1.1 and lists <code>ultibo</code> under the supported targets.
+
Run the following to check that it shows as version 3.2.2 and lists <code>ultibo</code> under the supported targets.
  
 
  /home/pi/ultibo/core/fpc/bin/fpc -i  
 
  /home/pi/ultibo/core/fpc/bin/fpc -i  
Line 77: Line 75:
 
Use fpcmkcfg to create our default configuration file like this:
 
Use fpcmkcfg to create our default configuration file like this:
  
  /home/pi/ultibo/core/fpc/bin/fpcmkcfg -d basepath=$HOME/ultibo/core/fpc/lib/fpc/3.1.1 -o /home/pi/ultibo/core/fpc/bin/fpc.cfg
+
  /home/pi/ultibo/core/fpc/bin/fpcmkcfg -d basepath=$HOME/ultibo/core/fpc/lib/fpc/3.2.2 -o /home/pi/ultibo/core/fpc/bin/fpc.cfg
  
 
=== Installing the arm-none-eabi Toolchain ===
 
=== Installing the arm-none-eabi Toolchain ===
Line 84: Line 82:
 
You may wonder why a toolchain is required when Raspbian runs native on the Raspberry Pi and therefore we are not cross compiling to create our Ultibo applications, the reasons are many but simply the tools included with Linux are configured for Linux specific settings which are not suitable for bare metal development.
 
You may wonder why a toolchain is required when Raspbian runs native on the Raspberry Pi and therefore we are not cross compiling to create our Ultibo applications, the reasons are many but simply the tools included with Linux are configured for Linux specific settings which are not suitable for bare metal development.
  
On Raspbian Jessie the arm-none-eabi tools are available as a package which can be installed like this:
+
On Raspbian Bullseye the arm-none-eabi tools are available as a package which can be installed like this:
  
 
  sudo apt-get install -y binutils-arm-none-eabi
 
  sudo apt-get install -y binutils-arm-none-eabi
Line 102: Line 100:
 
  cd /home/pi/ultibo/core/fpc/source
 
  cd /home/pi/ultibo/core/fpc/source
  
Export the path to our FPC 3.1.1 Ultibo edition:
+
Export the path to our FPC 3.2.2 Ultibo edition:
  
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
Line 112: Line 110:
 
  make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
 
  make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/units/armv7-ultibo/rtl
+
  make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
  
  
Line 129: Line 127:
 
  make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
 
  make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
+
  make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/units/armv7-ultibo/packages
+
  make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
  
  
Line 142: Line 140:
 
  cd /home/pi/ultibo/core/fpc/source
 
  cd /home/pi/ultibo/core/fpc/source
  
Export the path to our FPC 3.1.1 Ultibo edition:
+
Export the path to our FPC 3.2.2 Ultibo edition:
  
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
Line 152: Line 150:
 
  make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
 
  make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/units/armv6-ultibo/rtl
+
  make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl
  
  
Line 169: Line 167:
 
  make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
 
  make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/units/armv6-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
+
  make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
  
  make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/units/armv6-ultibo/packages
+
  make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/packages
  
 
=== Creating the Configuration files ===
 
=== Creating the Configuration files ===
Line 196: Line 194:
 
  -OoFASTMATH
 
  -OoFASTMATH
 
  -dRPI
 
  -dRPI
 +
-dBCM2708
 
  -XParm-none-eabi-
 
  -XParm-none-eabi-
  -Fu/home/pi/ultibo/core/fpc/units/armv6-ultibo/rtl
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl
  -Fu/home/pi/ultibo/core/fpc/units/armv6-ultibo/packages
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/packages
  -Fl/home/pi/ultibo/core/fpc/units/armv6-ultibo/lib
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/lib
  -Fl/home/pi/ultibo/core/fpc/units/armv6-ultibo/lib/vc4
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/lib/vc4
  
  
Save the file and do the same for the <code>rpi2.cfg</code>, <code>rpi3.cfg</code> and <code>qemuvpb.cfg</code> files:
+
Save the file and do the same for the <code>rpi2.cfg</code>, <code>rpi3.cfg</code>, <code>rpi4.cfg</code> and <code>qemuvpb.cfg</code> files:
  
 
Contents of rpi2.cfg
 
Contents of rpi2.cfg
Line 215: Line 214:
 
  -OoFASTMATH
 
  -OoFASTMATH
 
  -dRPI2
 
  -dRPI2
 +
-dBCM2709
 
  -XParm-none-eabi-
 
  -XParm-none-eabi-
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/rtl
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/packages
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
  -Fl/home/pi/ultibo/core/fpc/units/armv7-ultibo/lib
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
  -Fl/home/pi/ultibo/core/fpc/units/armv7-ultibo/lib/vc4
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4
  
  
Line 225: Line 225:
  
 
  #
 
  #
  # Raspberry Pi 3B/3B+/3A+ specific config file
+
  # Raspberry Pi 3B/3B+/3A+/CM3/Zero2W specific config file
 
  #
 
  #
 
  -CfVFPV3
 
  -CfVFPV3
Line 232: Line 232:
 
  -OoFASTMATH
 
  -OoFASTMATH
 
  -dRPI3
 
  -dRPI3
 +
-dBCM2710
 
  -XParm-none-eabi-
 
  -XParm-none-eabi-
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/rtl
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/packages
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
  -Fl/home/pi/ultibo/core/fpc/units/armv7-ultibo/lib
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
  -Fl/home/pi/ultibo/core/fpc/units/armv7-ultibo/lib/vc4
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4
  
 +
 +
Contents of rpi4.cfg
 +
 +
#
 +
# Raspberry Pi 4B/400/CM4 specific config file
 +
#
 +
-CfVFPV3
 +
-CIARM
 +
-CaEABIHF
 +
-OoFASTMATH
 +
-dRPI4
 +
-dBCM2711
 +
-XParm-none-eabi-
 +
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
 +
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
 +
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
 +
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4
  
 
Contents of qemuvpb.cfg
 
Contents of qemuvpb.cfg
Line 250: Line 268:
 
  -dQEMUVPB
 
  -dQEMUVPB
 
  -XParm-none-eabi-
 
  -XParm-none-eabi-
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/rtl
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
  -Fu/home/pi/ultibo/core/fpc/units/armv7-ultibo/packages
+
  -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
  -Fl/home/pi/ultibo/core/fpc/units/armv7-ultibo/lib
+
  -Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
  
 
=== Compiling an Application ===
 
=== Compiling an Application ===
 
----
 
----
  
Compiling an application from the command line is quite simple, you just need to remember some extra parameters because of the different environment. To compile something like the Hello World example open a terminal window, change to the folder where the application is located and add the path to FPC 3.1.1 Ultibo edition like this:
+
Compiling an application from the command line is quite simple, you just need to remember some extra parameters because of the different environment. To compile something like the Hello World example open a terminal window, change to the folder where the application is located and add the path to FPC 3.2.2 Ultibo edition like this:
  
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
 
  export PATH=/home/pi/ultibo/core/fpc/bin:$PATH
Line 273: Line 291:
 
  fpc -B -Tultibo -Parm -CpARMV7A -WpRPI3B @/home/pi/ultibo/core/fpc/bin/rpi3.cfg -O2 HelloWorld.lpr
 
  fpc -B -Tultibo -Parm -CpARMV7A -WpRPI3B @/home/pi/ultibo/core/fpc/bin/rpi3.cfg -O2 HelloWorld.lpr
  
And for the QEMU target the command line looks like this:
+
And for a Raspberry Pi 4B use this one:
 +
 
 +
fpc -B -Tultibo -Parm -CpARMV7A -WpRPI4B @/home/pi/ultibo/core/fpc/bin/rpi4.cfg -O2 HelloWorld.lpr
 +
 
 +
And finally for the QEMU target the command line looks like this:
  
 
  fpc -B -Tultibo -Parm -CpARMV7A -WpQEMUVPB @/home/pi/ultibo/core/fpc/bin/qemuvpb.cfg -O2 HelloWorld.lpr
 
  fpc -B -Tultibo -Parm -CpARMV7A -WpQEMUVPB @/home/pi/ultibo/core/fpc/bin/qemuvpb.cfg -O2 HelloWorld.lpr

Latest revision as of 02:53, 24 May 2022

Introduction


Note: All of the steps described below and more including building the Lazarus IDE and Ultibo tools are now handled automatically by the installer script for Linux, simply download the script from the Ultibo downloads page and follow the instructions. The installer script has been tested with many Linux distributions and platforms including the latest Ubuntu, Raspbian and Debian for x86, x86_64, arm and aarch64

Ultibo core is currently made available as a Windows installer download as well as various Windows tools, however there is nothing specific about the source code or modifications to Free Pascal that are dependent on Windows and some may choose to use it on other platforms such as Linux or Mac. While we are currently unable to provide prepackaged installations for Linux in the form of DEB or RPM files we have created a set of instructions for building the necessary items from source in order to provide similar functionality to the Windows platform.

Please note that because these instructions require you to build all of the components from source and possibly install additional packages onto your Linux installation you should be familiar with using the command line and confident with the tools available. These instructions are fully tested and proven to work, however we cannot provide support for individual cases if you experience issues in completing the steps below.

Prerequisites


The instructions below detail the process of building both the modified Free Pascal compiler and the Ultibo RTL in order to create a working configuration that allows developing Ultibo applications.

This process was last tested using the latest Raspbian Bullseye (32-bit only) from the Raspberry Pi operating system images page, at the time of writing this has a release date of April 4th 2022 however it is possible that later or earlier versions may also work.

In order to avoid any conflict with official FPC releases these instructions install all components into a folder within your home directory, if you follow these instructions the Ultibo version of Free Pascal as well as the RTL and sources will be located in the /home/pi/ultibo/core folder.

Compiling the Ultibo edition of Free Pascal requires using the official 3.2.2 release version as the starting point, these instructions will NOT work if you start with version 3.0.2 or any other version. Fortunately the FPC team provide a precompiled download of FPC 3.2.2 which can be obtained from the download page and installed using the provided instructions.

Building Free Pascal (Ultibo Edition)


Assuming you have a working FPC 3.2.2 installation as discussed above, you can now proceed with the first stage of the process which is to build a Raspbian native version of the Ultibo edition of FPC.

These instructions assume that FPC 3.2.2 from the official download was installed to:

/usr/local/bin/fpc

If you are using another version or installed it to your home folder instead then you may need to temporarily add it to the path so it is used in preference to any official version, by default you can do something like this to add the appropriate folder to the path temporarily:

export PATH=/home/pi/fpc-3.2.2/bin:$PATH


You should now download the sources of the FreePascal Ultibo edition from GitHub and unzip the contents to the folder:

/home/pi/ultibo/core/fpc

After extracting the files rename the folder FreePascal-ultibo-3.2.2 to source so the contents of the zip will be in /home/pi/ultibo/core/fpc/source


Now download the source of Ultibo core from GitHub and extract the ultibo folder to the location:

/home/pi/ultibo/core/fpc/source/rtl

And extract the ultibounits folder to the location:

/home/pi/ultibo/core/fpc/source/packages

And finally extract the units folder to the location:

/home/pi/ultibo/core/fpc/lib/fpc/3.2.2


Once this is done, open a terminal window and change to the folder containing the Ultibo sources:

cd /home/pi/ultibo/core/fpc/source

Do the following steps in order, checking that each was completed successfully before continuing:

make distclean
make all OPT=-dFPC_ARMHF
make install OPT=-dFPC_ARMHF PREFIX=/home/pi/ultibo/core/fpc

Once those steps have completed you should now have a Raspbian native version of the FPC Ultibo edition. Copy it to the bin directory as follows so we can find it later:

cp /home/pi/ultibo/core/fpc/source/compiler/ppcarm /home/pi/ultibo/core/fpc/bin/ppcarm

Run the following to check that it shows as version 3.2.2 and lists ultibo under the supported targets.

/home/pi/ultibo/core/fpc/bin/fpc -i 

Use fpcmkcfg to create our default configuration file like this:

/home/pi/ultibo/core/fpc/bin/fpcmkcfg -d basepath=$HOME/ultibo/core/fpc/lib/fpc/3.2.2 -o /home/pi/ultibo/core/fpc/bin/fpc.cfg

Installing the arm-none-eabi Toolchain


You may wonder why a toolchain is required when Raspbian runs native on the Raspberry Pi and therefore we are not cross compiling to create our Ultibo applications, the reasons are many but simply the tools included with Linux are configured for Linux specific settings which are not suitable for bare metal development.

On Raspbian Bullseye the arm-none-eabi tools are available as a package which can be installed like this:

sudo apt-get install -y binutils-arm-none-eabi

Once completed we can move on to building the Ultibo RTL.

Building the Ultibo RTL


The Ultibo RTL comes in 2 versions, one for ARMv6 which works on the Raspberry Pi A/B/A+/B+/Zero and another for ARMv7 which only works on Raspberry Pi 2B and 3B. These instructions allow for both to exist in different folders so you can have both versions available. If you choose not to build one or the other simply skip the relevant steps, you will need to perform this process each time you download an updated copy of the Ultibo RTL.


Ultibo RTL for ARMv7

Open a new terminal window (NOT the one you used above !!) and change to the source folder

cd /home/pi/ultibo/core/fpc/source

Export the path to our FPC 3.2.2 Ultibo edition:

export PATH=/home/pi/ultibo/core/fpc/bin:$PATH

Build the ARMv7 RTL as follows, checking that each step was successful before continuing:

make rtl_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl


Packages for ARMv7

Open a new terminal or continue with the one used to build the RTL, change to the source folder and ensure the path is updated:

cd /home/pi/ultibo/core/fpc/source
export PATH=/home/pi/ultibo/core/fpc/bin:$PATH

Build the ARMv7 Packages using the following commands:

make rtl_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV7A -CfVFPV3 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv7a FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages


Ultibo RTL for ARMv6

The process for the ARMv6 RTL is very similar but there are many differences in the parameters, careful you don't use the wrong ones.

Open a new terminal window and change to the source folder

cd /home/pi/ultibo/core/fpc/source

Export the path to our FPC 3.2.2 Ultibo edition:

export PATH=/home/pi/ultibo/core/fpc/bin:$PATH

Build the ARMv6 RTL as follows, checking that each step was successful before continuing:

make rtl_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make rtl OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make rtl_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl


Packages for ARMv6

Open a new terminal or continue with the one used to build the RTL, change to the source folder and ensure the path is updated:

cd /home/pi/ultibo/core/fpc/source
export PATH=/home/pi/ultibo/core/fpc/bin:$PATH

Build the ARMv6 Packages as follows:

make rtl_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages_clean CROSSINSTALL=1 OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH -Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl" FPC=/home/pi/ultibo/core/fpc/bin/fpc
make packages_install CROSSINSTALL=1 BINUTILSPREFIX=arm-none-eabi- FPCFPMAKE=/home/pi/ultibo/core/fpc/bin/fpc CROSSOPT="-CpARMV6 -CfVFPV2 -CIARM -CaEABIHF -OoFASTMATH" OS_TARGET=ultibo CPU_TARGET=arm SUBARCH=armv6 FPC=/home/pi/ultibo/core/fpc/bin/fpc INSTALL_PREFIX=/home/pi/ultibo/core/fpc INSTALL_UNITDIR=/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/packages

Creating the Configuration files


To allow switching between ARMv6 and ARMv7 the Ultibo installation includes configuration files that are passed to FPC to specify certain parameters for each model, you can easily create these for Raspbian as well like this.

Open a terminal window and change to the location where FPC Ultibo edition is installed:

cd /home/pi/ultibo/core/fpc/bin

Create a new rpi.cfg file:

nano rpi.cfg

And paste these lines into the file:

#
# Raspberry Pi (A/B/A+/B+/Zero/ZeroW) specific config file
#
-CfVFPV2
-CIARM
-CaEABIHF
-OoFASTMATH
-dRPI
-dBCM2708
-XParm-none-eabi-
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/rtl
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/packages
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/lib
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv6-ultibo/lib/vc4


Save the file and do the same for the rpi2.cfg, rpi3.cfg, rpi4.cfg and qemuvpb.cfg files:

Contents of rpi2.cfg

#
# Raspberry Pi 2B specific config file
#
-CfVFPV3
-CIARM
-CaEABIHF
-OoFASTMATH
-dRPI2
-dBCM2709
-XParm-none-eabi-
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4


Contents of rpi3.cfg

#
# Raspberry Pi 3B/3B+/3A+/CM3/Zero2W specific config file
#
-CfVFPV3
-CIARM
-CaEABIHF
-OoFASTMATH
-dRPI3
-dBCM2710
-XParm-none-eabi-
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4


Contents of rpi4.cfg

#
# Raspberry Pi 4B/400/CM4 specific config file
#
-CfVFPV3
-CIARM
-CaEABIHF
-OoFASTMATH
-dRPI4
-dBCM2711
-XParm-none-eabi-
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib/vc4

Contents of qemuvpb.cfg

#
# QEMU VersatilePB specific config file
#
-CfVFPV3
-CIARM
-CaEABIHF
-OoFASTMATH
-dQEMUVPB
-XParm-none-eabi-
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/rtl
-Fu/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/packages
-Fl/home/pi/ultibo/core/fpc/lib/fpc/3.2.2/units/armv7-ultibo/lib

Compiling an Application


Compiling an application from the command line is quite simple, you just need to remember some extra parameters because of the different environment. To compile something like the Hello World example open a terminal window, change to the folder where the application is located and add the path to FPC 3.2.2 Ultibo edition like this:

export PATH=/home/pi/ultibo/core/fpc/bin:$PATH

Then compile the application using this command:

fpc -B -Tultibo -Parm -CpARMV7A -WpRPI2B @/home/pi/ultibo/core/fpc/bin/rpi2.cfg -O2 HelloWorld.lpr

This example is for a Raspberry Pi 2B but can easily be adjusted for any other model by changing the appropriate parameters, so to compile for Raspberry Pi B instead try this:

fpc -B -Tultibo -Parm -CpARMV6 -WpRPIB @/home/pi/ultibo/core/fpc/bin/rpi.cfg -O2 HelloWorld.lpr

Or for a Raspberry Pi 3B use this one:

fpc -B -Tultibo -Parm -CpARMV7A -WpRPI3B @/home/pi/ultibo/core/fpc/bin/rpi3.cfg -O2 HelloWorld.lpr

And for a Raspberry Pi 4B use this one:

fpc -B -Tultibo -Parm -CpARMV7A -WpRPI4B @/home/pi/ultibo/core/fpc/bin/rpi4.cfg -O2 HelloWorld.lpr

And finally for the QEMU target the command line looks like this:

fpc -B -Tultibo -Parm -CpARMV7A -WpQEMUVPB @/home/pi/ultibo/core/fpc/bin/qemuvpb.cfg -O2 HelloWorld.lpr