Generator Overview

This is a high-level overview of some important generator features. There is also a more comprehensive feature overview.

Quick links:

Configuration

  • Load project configuration from JSON data file
  • Each configuration can define multiple so named jobs
  • Each job defines one action with all configuration
  • A job can extend any other job and finetune the configuration
  • Each execution of the generator can execute multiple of these jobs

Cache Support

  • Advanced caching system which dramatically reduces the runtime in repeated calls.
  • The cache stores data on the disk using the pickle Python module.
  • Invalidation of cache files happens through a comparison of modification dates.
  • Cache filenames use hash keys to keep them short and unique.
  • Among the information which is being cached by the generator there are
    • class meta data
    • syntax trees
    • code dependencies
    • compiler results
    • api data
    • localization data

Class Selection

  • Use include/exclude lists to define the set of classes to use.
  • Allows simple wildcards, e.g. qx.*.
  • By default, prerequisite classes are added to the class set, except those specified by an exclude.
  • This can be toggled using a = prefix. This switches to a mode where exactly the classes listed in the config are included.
  • As a fallback all known classes will be added when no includes are defined.

Variants

  • From a single code base multiple variants can be created.
  • This is controlled by environment variables, the values of which can be queried in the code.
  • Given a set of environment bindings, code parts that are never executed as a consequence, can be pruned from the final application, saving code size.
  • It is possible to generate multiple variant combinations. This means that a single job execution can create multiple files at once using different sets of environment bindings ("variant sets").
  • Variants are combinable and all possible combinations are automatically created. For example: gecko+debug, mshtml+debug, gecko+nodebug, mshtml+nodebug.

API Data

  • Creation of split API data which loads incrementally as needed.
  • Creation of a searchable index containing all relevant names of the API (e.g. classes, properties, functions, events, ...)

Internationalisation

  • Creation and update of "po" files based on marked strings in the class files.
  • Inclusion of translation information in the generated application.
  • Dynamic creation of localization data based on the standardized information available at unicode.org. The "main" package of CLDR which is used, is locally mirrored in the SDK.

Parts

  • Each part can be seen as a logical or visual component of the application.
  • Each part may result in multiple packages (script output files).
  • The number of packages could be exponential to the number of parts (but through the optimization this is often not the case).
  • Packages are merged given some constraints (e.g. minimal size), to reduce their overall number.
  • The parts are defined in the application configuration, using a similar include key like the class selection.
  • There is one signified initial part, named 'boot', that is loaded automatically at application startup, and contains the initial set of functionality.
  • Other parts are loaded explicitly by the application code, using a specific PartLoader API of the framework.