Compiler expectations
You should better use the latest SVN trunk version of the FPC 2.7.1 / 3.1.1 compiler, and the corresponding Lazarus IDE.
If you want to use TDocVariant custom variant type, ensure that your revision includes the fix for http://mantis.freepascal.org/view.php?id=26773 bug, i.e. newer than revision 28995 from 2014-11-05T22:17:54. This bug has not been fixed in 2.6.4 branch.
We recommend using the fpcup tool, as published at http://wiki.freepascal.org/fpcup
To compile the latest svn version of the trunk, just write:
fpcup.exe --fpcURL="trunk" --lazURL="trunk"
Then ensure you set the static SQlite3 .o files for Windows or Linux in the right folder, as stated about the Installation.
Creating the missing RTTI for interfaces
Sadly, we have to face some unresolved FPC compiler-level issue, which does
not supply the needed interface
RTTI - see http://bugs.freepascal.org/view.php?id=26774
As a result, SOA, mock/stub and MVC features would not working
directly.
We propose a workaround to compile such applications with FPC. You could use
Delphi to generate one unit containing the needed information.
The mORMotWrappers.pas
unit proposes a
ComputeFPCInterfacesUnit()
function, which could be used on Delphi
to generate the RTTI unit for FPC, as such:
- Ensure that the application will use all its needed
interface
: for instance, run all your regression tests, and/or use all its SOA/MVC features if you are not confident about your test coverage; - Just before the application exists, add a call to
ComputeFPCInterfacesUnit()
with the proper folders, e.g. at the very end of your.dpr
code.
For instance, here is how TestSQL3.dpr
has been modified:
program TestSQL3; ... uses ... mORMotWrappers.pas, ... begin SQLite3ConsoleTests; {$ifdef COMPUTEFPCINTERFACES} ChDir(ExtractFilePath(ParamStr(0))); ComputeFPCInterfacesUnit( ['..\CrossPlatform\templates','..\..\CrossPlatform\templates'], '\..\..\SQlite3\TestSQL3FPCInterfaces.pas'); {$endif} end.
If you define the COMPUTEFPCINTERFACES
conditional, the
TestSQL3FPCInterfaces.pas
unit will be generated.
You can take a look at
the committed version of this generated file.
Of course, for your own application, you may use absolute path names: here
we used relative naming, via ..\
, so that it would work on any
development folder configuration.
Then, add it to any of your uses clause, as such:
uses
...
TestSQL3FPCInterfaces, // will register RTTI for interfaces under FPC
...
This unit will do nothing when compiled under Delphi: it will
register the RTTI only when compiled with FPC.
The rest of your code would be untouched, and could be shared between Delphi
and FPC.
If you do not modify the interface
methods definition, this
generation step could be safely bypassed.
We hope that in a close future, the FPC team would fix the http://bugs.freepascal.org/view.php?id=26774 issue, but the ticket seems pretty inactive since its creation.
Writing your project for FPC
If you want your application to compile with FPC, some little patterns should be followed.
In all your source code file, the easiest is to including the following
mORMot
file, which will define all compiler options and
conditionals as expected:
{$I Synopse.inc} // define HASINLINE USETYPEINFO CPU32 CPU64 OWNNORMTOUPPER
Then in your .dpr
file, you should write:
uses {$ifdef Linux} // if you use threads cthreads, // widestring manager for Linux if needed !! // could also be put in another unit ... but doc states: as early as possible cwstring, // optional {$endif}
For instance a minimal FPC project to run the regression tests may be:
program LinuxSynTestFPCLinuxi386;
{$I Synopse.inc} {$APPTYPE CONSOLE}
uses {$ifdef Linux} cthreads, cwstring, {$endif} mORMotSelfTests;
begin SQLite3ConsoleTests; end.
In your user code, ensure you do not directly link to the
Windows
unit, but rely on the cross-platform classes and functions
as defined in SysUtils.pas
, Classes.pas
and
SynCommons.pas
.
You could find in SynFPCTypInfo.pas
and
SynFPCLinux.pas
some low-level functions dedicated to FPC and
Linux compilation, to be used with legacy units - your new code should better
rely on higher level functions and classes.
If you rely on mORMot classes and types, e.g. use
RawUTF8
for all your string
process in the business
logic, and do not use Delphi-specific features (like generics, or new syntax
sugar), it would be very easy to let your application compile with FPC.
In practice, we use Delphi as our main IDE, then switch to Lazarus under a small integrated Linux VirtualBox, running a low resource XFCE desktop. We defined the Windows folder containing the source as a VirtualBox shared folder, so that we are able to compile, debug and test the Linux version of any executable in native Linux, on the same computer, from the very same sources. We found out that Lazarus debugging was pretty smooth on Linux - GDB is smoother on Linux than Windows, by the way. Then switching from Delphi/Windows to Lazarus/Linux is direct and natural, especially when the VirtualBox "Integrated Desktop" feature is enabled.
Linux installation tips
Here are a few informal notes about getting running a FPC/Lazarus virtual
machine running XUbuntu, on a Windows host.
They are published as a general guideline, and we would not provide any
reference procedure, nor support it.
- Install the latest VirtualBox version from http://www.virtualbox.org/ to Windows;
- Download the latest
.iso
version published at http://xubuntu.org/ or any other place - we use XFCE since it is a very lightweight desktop, perfect to run Lazarus, and we selected an Ubuntu LTS revision (14.04 at the time of this writing), which would be the same used on Internet servers; - Create a new virtual machine (VM) in VirtualBox, with 1 or 2 CPUs, more than 512 MB of RAM (we use 777 MB), and an automatic-growing disk storage, with a maximal size of 15 GB; ensure that the disk storage is marked as SSD if your real host storage is a SSD;
- Let the CDROM storage point to the
.iso
you downloaded; - Start the VM and install Linux locally, as usual - you may select to download the updated packages during the installation, for safety;
- When the system restarts, if it asks for software updates, accept and wait for the update installation to finish - it is a good idea to have the latest version of the kernel and libraries before installing the VirtualBox drivers;
- Restart your VM when asked to;
- Under a Ubuntu/Debian terminal, write the following commands:
sudo apt-get update sudo apt-get upgrade sudo apt-get install dkms
- Restart the VM, then select "Insert Guest Additions CD image" from the VM "Devices" menu: a virtual CD would be mounted on your system and appear on your desktop;
- Run the following command, according to your current user name and VirtualBox version:
sudo sh /media/...user.../VBOXADDITIONS_..../VBoxLinuxAdditions.run
- Restart the VM, then add a permanent shared folder in the VM configuration,
named
Lib
, and pointing to your local mORMot installation (e.g.d:\dev\lib
; - Create a void folder, e.g. in your home:
mkdir lib
- Create a launcher for the following command, to mount the shared folder as expected:
sudo mount -t vboxsf lib /home/...user.../lib
- Download the version of
fpcup
for your system, e.g. https://bitbucket.org/reiniero/fpcup/downloads/fpcup_linux_x86 - Execute the following commands:
sudo apt-get install build-essential mingw32-binutils subversion libgtk2.0-dev sudo ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres ./fpcup_linux_x86 --fpcURL="trunk" --lazURL="trunk"
- Now wait for all source to be retrieved by SVN, then the whole build to take places;
- If you have issues during SVN retrieval, go the
development/fpc
folder, then run the following before trying again thefpcup_linux_x86
command:
svn cleanup svn update
- On success, you can create a launcher pointing to
development/lazarus/startlazarus
.
If you followed the above steps, you should now have at least a Lazarus IDE v1.3 and the corresponding FPC 3.1.1 compiler. It is amazing seeing the whole compiler + IDE being compiled from the official sources, for free, and in a few minutes.
In fact, this article has been extracted from our official documentation, which should be checked for its latest version!
Feedback is welcome on our forum, as usual!