.. _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__ 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//config.json`` if present. 3. ``config///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``.