Conditional compiling
predefined symbols
Please see https://www.freepascal.org/docs-html/3.0.0/prog/progap7.html#x333-348000G.
unix
is defined for both macos and unbuntu.
darwin
is defined only for macos.
windows
is for both 32-bit and 64-bit windows.
user defined symbols
To pass from the commandline:
fpc -dmy_symbol
that is, use -d
option. It is equivalent to:
{$define my_symbol}
in the code.
To un-define a symbol from the commandline:
fpc -umy_symbol
That is, use -u
option. It is equivalent to:
{#undef my_symbol}
in the code.
if and else
There are multiple forms:
Example 1
{$ifdef my_symbol}
{some code}
{$endif}
{$ifdef my_symbol with some comments}
{some code}
{everything after my_symbol is a comment}
{$endif}
{$ifdef my_symbol}
{some code}
{$else}
{some other code}
{$endif}
{$ifdef my_symbol}
{some code}
{$elseif defined(foo)}
{some code}
{$endif}
{$if defined(foo) or defined(bar)}
{$endif}
{$if defined(foo) and defined(bar)}
{$endif}
{$if defined(my_symbol)}
{some code}
{$elseif defined(foo)}
{some code}
{$endif}
{$if defined(my_symbol)}
{some code}
{$elseif defined(foo) or defined(bar) or defined(foobar)}
{some code}
{$endif}
Example2
{$ifndef foo}
{code}
{$endif}
{$if not defined(foo)}
{code}
{$endif}
To summarize, we can use
ifdef
,endif
ifndef
else
,elseif
if
(we can use conditions, e.g.,if defined() or defined()
defined
undef
Some more examples from https://github.com/fpc/FPCSource/blob/main/rtl/unix/dl.pp
{$if defined(linux) or defined(freebsd) or defined(openbsd) or defined(dragonfly)}
{$define ELF} // ELF symbol versioning.
{$endif}
{$if defined(linux)}
{ if libc is not linked explicitly, FPC might chose the wrong startup code, as
libdl depends on libc on linux, this does not hurt }
{$linklib c}
{$endif}
function dladdr(Lib: pointer; info: Pdl_info): Longint; cdecl; {$if not defined(aix) and not defined(android)} external; {$endif}
const
{$ifdef BSD} // dlopen is in libc on FreeBSD.
LibDL = 'c';
{$else}
{$ifdef HAIKU}
LibDL = 'root';
{$else}
LibDL = 'dl';
{$endif}
{$endif}
Some more examples from https://github.com/fpc/FPCSource/blob/main/rtl/inc/ctypes.pp
{$ifdef FPC}
{$inline on}
{$ifndef DISABLE_INLINE}
{$define CTYPES_INLINE}
{$endif}
{$define dummy}
{$endif}