| .. _configure_options: |
| |
| ================================= |
| Adding new libc configure options |
| ================================= |
| |
| `There are a number of configure options <../configure.html>`_ which can be used |
| to configure the libc build. The config system is driven by a set of |
| hierarchical JSON files. At the top of the hierarchy is a JSON file by name |
| ``config.json`` in the ``config`` directory. This JSON file lists the libc |
| options which affect all platforms. The default value for the option and a short |
| description about it listed against each option. For example: |
| |
| .. code-block:: json |
| |
| { |
| "printf": { |
| "LIBC_CONF_PRINTF_DISABLE_FLOAT": { |
| "value": false, |
| "doc": "Disable printing floating point values in printf and friends." |
| } |
| } |
| } |
| |
| The above config indicates that the option ``LIBC_CONF_PRINTF_DISABLE_FLOAT`` |
| has a value of ``false``. A platform, say the baremetal platform, can choose |
| to override this value in its ``config.json`` file in the ``config/baremetal`` |
| directory with the following contents: |
| |
| .. code-block:: json |
| |
| { |
| "printf": { |
| "LIBC_CONF_PRINTF_DISABLE_FLOAT": { |
| "value": true |
| } |
| } |
| } |
| |
| Here, the config for the baremetal platform overrides the common ``false`` |
| value of the ``LIBC_CONF_PRINTF_DISABLE_FLOAT`` with the ``true`` value. |
| |
| Config JSON format |
| ================== |
| |
| Named tags |
| ---------- |
| |
| As can be noted from the above examples, ``config.json`` files contains a |
| top-level dictionary. The keys of this dictionary are the names of |
| *grouping-tags*. A grouping-tag is nothing but a named tag to refer to a related |
| group of libc options. In the above example, a tag named ``printf`` is used to |
| group all libc options which affect the behavior of ``printf`` and friends. |
| |
| Tag values |
| ---------- |
| |
| The value corresponding to each grouping tag is also a dictionary called the |
| *option-dictionary*. The keys of the option-dictionary are the names of the libc |
| options belonging to that grouping tag. For the ``printf`` tag in the above |
| example, the option-dictionary is: |
| |
| .. code-block:: json |
| |
| { |
| "LIBC_CONF_PRINTF_DISABLE_FLOAT": { |
| "value": false, |
| "doc": |
| } |
| } |
| |
| The value corresponding to an option key in the option-dictionary is another |
| dictionary with two keys: ``"value"`` and ``"doc"``. The ``"value"`` key has |
| the value of the option listed against it, and the ``"doc"`` key has a short |
| description of the option listed against it. Note that only the main config |
| file ``config/config.json`` includes the ``"doc"`` key. Options which are of |
| ``ON``/``OFF`` kind take boolean values ``true``/``false``. Other types of |
| options can take an integral or string value as suitable for that option. In |
| the above option-dictionary, the option-key ``LIBC_CONF_PRINTF_DISABLE_FLOAT`` |
| is of boolean type with value ``true``. |
| |
| Option name format |
| ------------------ |
| |
| The option names, or the keys of a option-dictionary, have the following format: |
| |
| .. code-block:: none |
| |
| LIBC_CONF_<UPPER_CASE_TAG_NAME>_<ACTION_INDICATING_THE_INTENDED_SEMANTICS> |
| |
| The option name used in the above examples, ``LIBC_CONF_PRINTF_DISABLE_FLOAT`` |
| to disable printing of floating point numbers, follows this format: It has the |
| prefix ``LIBC_CONF_``, followed by the grouping-tag name ``PRINTF`` in upper |
| case, followed by the action to disable floating point number printing |
| ``LIBC_CONF_PRINTF_DISABLE_FLOAT``. |
| |
| Mechanics of config application |
| =============================== |
| |
| Config reading |
| -------------- |
| |
| At libc config time, three different ``config.json`` files are read in the |
| following order: |
| |
| 1. ``config/config.json`` |
| 2. ``config/<platform or OS>/config.json`` if present. |
| 3. ``config/<platform or OS>/<target arch>/config.json`` if present. |
| |
| Each successive ``config.json`` file overrides the option values set by |
| previously read ``config.json`` files. Likewise, a similarly named command line |
| option to the cmake command will override the option values specified in all or |
| any of these ``config.json`` files. That is, users will be able to override the |
| config options from the command line. |
| |
| Config application |
| ------------------ |
| |
| Local to the directory where an option group is relevant, suitable build logic |
| should convert the CMake config options to appropriate compiler and/or linker |
| flags. Those compile/link flags can be used in listing the affected targets as |
| follows: |
| |
| .. code-block:: cmake |
| |
| add_object_library( |
| ... |
| COMPILE_OPTIONS |
| ${common_printf_compile_options} |
| ... # Other compile options affecting this target irrespective of the |
| # libc config options |
| ) |
| |
| Note that the above scheme is only an example and not a prescription. |
| Developers should employ a scheme appropriate to the option being added. |
| |
| Automatic doc update |
| ==================== |
| |
| The CMake configure step automatically generates the user document |
| ``doc/configure.rst``, which contains user information about the libc configure |
| options, using the information in the main ``config/config.json`` file. |
| An update to ``config/config.json`` will trigger reconfiguration by CMake, which |
| in turn will regenerate the documentation in ``doc/configure.rst``. |