Conditional Compiler Options

From Lazarus wiki
Jump to navigationJump to search

This page collects ideas of how to implement conditional compiler options in lazarus.

First it should be collected the cases, where conditional compiler options are needed.

Case studies

Conditional Package Requirement: VirtualTreeView / multilog

Make possibly to define a package requirement as optional (Should be available both to package and program). Concrete situation: VirtualTreeView requires multilog package to help debug code. In a release is not desired to have such dependency. Currently in the release is necessary to remove the dependency from the package, and then add again to reenable debugging. An idea is to have groups of conditional requirements. Each group would have a define value associated to be used at compile time (e.g: 'DEBUG_CODE') and child packages. Each group would have a enabled flag. If enabled flag is set, the child packages are added as requirements and the define value used at compile time.

  • Other packages will use the same Debug/Release differences. In big projects normally only a small part should be set verbose (into debugging mode).


Target specific units

Make units packages/projects optional according to widgetset. Concrete situation: LCL extensions package has a unit (OleUtils) that implements TOLEStream. It only makes sense in win32. Currently the unit is added in all widgetsets but all code is wrapped around a ifdef Windows define so is seen as a dummy unit in other widgetsets.

Notes:

  • All units should be added to the package, independent if they are used. If they not always used, you can already check the flag.
    • If the "uses unit" flag is not set, the unit will not be compiled in none cases. Nor in win32 (where is needed) neither in the other systems. It will be compiled only if another unit in the package uses it. That's not the case.
  • The above example is about windows. That has nothing to do with the widgetset. The qt and gtk2 widgetsets are also running under windows.
  • You can put units specific to targets into sub directories as demonstrated in the Lazarus and FPC sources.
    • It does not work for the cited example. I created a units\win32, put OleUtils.pas inside and set "units\$(TargetOS)\" in Other Units path (Compiler Options) but the unit is not compiled even in win32.
  • There is no real need for conditional options for units.