FreePascal detection and versioning

From Delphi

Jump to: navigation, search

Free Pascal defines a lot of conditionals, both for platform as for target support. The most important one is the FPC conditional

 {$ifdef FPC}
    // put your FPC code here 
 {$else}
    // assume Delphi or TP here.
 {$endif}

Besides this, there is the matter of target (architecture and OS) support:

  • a conditional per architecture (CPU family) are
  {$ifdef i386}
   // 32-bit PC code here.
  {$endif}
  {$ifdef x86_64} // aka AMD64.
   // 64-bit PC code here.
  {$endif}    
  {$ifdef powerpc}
   // 32-bit powerpc specific code here
  {$endif} 
  {$ifdef powerpc64}
   // 64-bit powerpc specific code here
  {$endif} 
  {$ifdef m68k} 
     // m68k, Motorola 68010+ is not supported in 2.0+ at the moment, but might be resurrected.
  {$endif}
  {$ifdef Sparc}
     // 32-bit Sparc support
  {$endif}
  {$ifdef Sparc64}
     // 64-bit Sparc support is partially done, but not releaseworthy yet.
  {$endif}
  {$ifdef Arm}
     // 32-bit ARM support.
  {$endif}
  • General conditions for wordsizes and endianness
  TYPE 
  {$ifdef CPU32}
      SizeofPointe=32;   // 32-bit = 32
  {$endif}
  {$ifdef CPU64}
      SizeofPointe=64;   // 64-bit = 64
  {$endif}
  {$ifdef ENDIAN_BIG}
    I:=a and 255 + (b and 255) shl 16;
  {$endif}           
  {$ifdef ENDIAN_LITTLE}
    I:=b and 255 + (a and 255) shl 16; 
  {$endif}           
  • test for families of OSes.
  {$ifdef MSWindows}
     // ce + win32 + win64, delphi compat
  {$endif]
  {$ifdef Windows}
     // ce + win32 + win64, more logical.
  {$endif]
  {$ifdef Unix}
     // all Unix like OSes. Linux/*BSD/OS X and Solaris. BeOS too if it ever released again.
  {$endif}
  {$ifdef BSD}
     // Free/Net/OpenBSD and Mac OS X 
   {$endif}
  • Specific OSes
  {$ifdef win32} 
    //  95/98/ME and 32-bit NT/2k/XP/Vista
  {$endif}
  {$ifdef win64} 
    //  64-bit/XP/Vista
  {$endif}
  {$ifdef wince}
    // Windows CE family including PocketPC 2003 and Windows Mobile 5
  {$endif}
  {$ifdef Linux}
    // linux}
  {$endif}
  {$ifdef FreeBSD}
    // FreeBSD
  {$endif}
  {$ifdef Darwin}
    // Darwin is the base OS name of Mac OS X, like NT is the name of the Win2k/XP/Vista kernel. Mac OS X = Darwin + GUI.
  {$endif}
  {$ifdef SunOS}
    // similarly with Solaris. Ifdef solaris also works though.
  {$endif}
  // additionally OS2 , netware, netwlibc (Linux based Novell), BeOS, AmigaOS.
  {$ifdef ver2}
     // all versions 2.x
  {$endif}
  {$ifdef ver2_2}
    // all versions 2.2
  {$endif}
   //etc.  
 
   // or (delphi/FPC2+ style): 
  {$if (fpc_version=2) and (fpc_release>0) or ((fpc_release=0) and (fpc_patch>3))}  
    {$info At least this is version 2.0.4}  
  {$else}  
    {$fatal Problem with version check}  
  {$endif}  
  
  • dialects
  {$ifdef fpc} // only warn when
   {$ifndef fpc_delphi} // fpc is not in delphi mode
     {$info please compile this unit with -Sd to enable delphi mode.}
   {$endof}
  {$endif}
Personal tools
.