[Lazarus] Where to define conditionals for FPC

Bo Berglund bo.berglund at gmail.com
Wed May 13 08:36:33 CEST 2020

On Tue, 12 May 2020 13:49:08 +0200, Marc Weustink via lazarus
<lazarus at lists.lazarus-ide.org> wrote:

>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:
>>    {$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!

Thank you so much for your comments/advice!
Much appreciated! :)

Bo Berglund
Developer in Sweden

More information about the lazarus mailing list