[Lazarus] Where to define conditionals for FPC

Marc Weustink marc at dommelstein.nl
Tue May 12 13:49:08 CEST 2020



On 11-5-2020 09:33, Bo Berglund via lazarus wrote:
> On Sun, 10 May 2020 14:37:12 +0200, Marc Weustink via lazarus
> <lazarus at lists.lazarus-ide.org> wrote:
> 
>> The last weeks, since I'm working from home, I've been converting a lot
>> of our Delphi 6 projects. I only use the convertor to get a Lazarus
>> project from a dpr. All other changes I revert. The convertor breaks
>> more than it fixes. Like in your case we still release our software
>> build by Delphi. Once I have the lpi, I never use the convertor again.
>> So it cannot touch defines and such.
> 
> Interesting!
> I have a few questions:
> 
> 1) Lazarus project file conversion
> You state that you just use the converter to get a project in Lazarus
> from the Delphi dpr file.
> Exactly how do you do this?

Tools - Delphi conversion - Convert delphi project.
Disable scan files in parent directory

> 2) Lazarus project file (lpi)
> When you convert to Lazarus are you also getting an lpi file?
> And does the lpi file contain references into the Delphi install
> directories?
> The lpi file from my first (failed) conversion contains stuff like
> this:
> 
>      <SearchPaths>
>        <IncludeFiles Value="C:\Programs\CodeGear\RAD
> Studio\5.0\source\Win32\vcl\;..\..\..\CMP\SentinelAGI;..\..\..\CMP\Log3R;..\..\..\CMP\SystemResource;..\..\..\CMP\Version;..\..\Common;..\..\..\CMP\AsyncPro\source;..\..\..\CMP\DLPortIO\source;..\..\..\CMP\Indy10\Protocols;$(ProjOutDir)"/>
>        <OtherUnitFiles Value="C:\Programs\CodeGear\RAD
> Studio\5.0\source\Win32\vcl\;..\..\..\CMP\SentinelAGI;..\..\..\CMP\Log3R;..\..\..\CMP\SystemResource;..\..\..\CMP\Version;..\..\Common;..\..\..\CMP\AsyncPro\source;..\..\..\CMP\DLPortIO\source;..\..\..\CMP\Indy10\Protocols;C:\Programs\CodeGear\RAD
> Studio\5.0\source\Win32\rtl\win\"/>
>        <UnitOutputDirectory Value="..\bin"/>
>      </SearchPaths>

Yep, didn't get those, but others. Just removed them.

> and:
>      <Other>
>        <CustomOptions Value="-dBorland -dVer150 -dDelphi7
> -dCompiler6_Up -dPUREPASCAL"/>
>      </Other>

I keep them, it might be used by some 3rd party packages, and some of 
our earlier code. It doesn't hurt to keep them

> The lpr file looks pretty much like the dpr original except for the
> added:
> {$MODE Delphi}

That one I remove as well. I define delphi mode in the compiler settings 
of the project. This way the units can be used inh delphi too (without 
adding extra ifdefs)

> 3) Compiling same code with Delphi and FPC?
> Do you convert your projects (manually) to make it possible to use
> both Delphi and Lazarus as the IDE for further work on the same
> sources?
> If so do you have any hints as to what to look out for?

Yes, it is a manual conversion. But in our case not that hard. Most of 
the converted projects are windows (network) services.
The difference between a delphi service and a fpc daemon is covered in a 
BaseServer class / unit. So for services derived from it there is no 
different code.
Also we do have our own network/serial/async thread notification 
libraries. So once those got converted, most of the projects would build.
Since we were using D6, a lot of newer win api functions were missing. 
Therefore we already had Win32Api unit for all missing functions/types. 
In case of FPC this unit is extended for missing functions in FPC (and 
later functions/types existing in FPC but missing in Delphi)
This is also why I don't let the convertor touch the existing code, most 
incompatibilities are handled in this unit (openfile/fileopen for instance).

> What I am doing now is that inside Delphi 2007 I am editing all of the
> project files and adding this on top:
> 
> {$IFDEF FPC}
>    {$MODE Delphi}
> {$ENDIF}

Not needed if you enable delphi mode in the compiler options

> I also replace the uses reference to Windows with this (which is what
> the converter dir in the failed run):
> 
> uses
>    {$IFDEF FPC}
>      LCLIntf,
>      LCLType,
>      LMessages,
>    {$ELSE}
>      Windows,
>    {$ENDIF}

This is what I need to do as well. It is a nice reevaluation if I still 
need all those units.

> Then I am also using conditionals to exclude functions relying on
> Delphi-only units and replacing these with "neutral" units.
> For example I am enabling Registry usage only if on Windows and
> instead use conf files on Linux. The built in Lazarus Registry unit
> handling of Registry calls on Linux is too complex for me...

Most of our services are configured by cmdline (and it gets parsed 
through our own helper class)

> And I am also purging no longer wanted old functions...
> 
> Grateful for any suggestions and advice!

Marc




More information about the lazarus mailing list