3 =================================
4 Adding new libc configure options
5 =================================
7 `There are a number of configure options <../configure.html>`_ which can be used
8 to configure the libc build. The config system is driven by a set of
9 hierarchical JSON files. At the top of the hierarchy is a JSON file by name
10 ``config.json`` in the ``config`` directory. This JSON file lists the libc
11 options which affect all platforms. The default value for the option and a short
12 description about it listed against each option. For example:
18 "LIBC_CONF_PRINTF_DISABLE_FLOAT": {
20 "doc": "Disable printing floating point values in printf and friends."
25 The above config indicates that the option ``LIBC_CONF_PRINTF_DISABLE_FLOAT``
26 has a value of ``false``. A platform, say the baremetal platform, can choose
27 to override this value in its ``config.json`` file in the ``config/baremetal``
28 directory with the following contents:
34 "LIBC_CONF_PRINTF_DISABLE_FLOAT": {
40 Here, the config for the baremetal platform overrides the common ``false``
41 value of the ``LIBC_CONF_PRINTF_DISABLE_FLOAT`` with the ``true`` value.
49 As can be noted from the above examples, ``config.json`` files contains a
50 top-level dictionary. The keys of this dictionary are the names of
51 *grouping-tags*. A grouping-tag is nothing but a named tag to refer to a related
52 group of libc options. In the above example, a tag named ``printf`` is used to
53 group all libc options which affect the behavior of ``printf`` and friends.
58 The value corresponding to each grouping tag is also a dictionary called the
59 *option-dictionary*. The keys of the option-dictionary are the names of the libc
60 options belonging to that grouping tag. For the ``printf`` tag in the above
61 example, the option-dictionary is:
66 "LIBC_CONF_PRINTF_DISABLE_FLOAT": {
72 The value corresponding to an option key in the option-dictionary is another
73 dictionary with two keys: ``"value"`` and ``"doc"``. The ``"value"`` key has
74 the value of the option listed against it, and the ``"doc"`` key has a short
75 description of the option listed against it. Note that only the main config
76 file ``config/config.json`` includes the ``"doc"`` key. Options which are of
77 ``ON``/``OFF`` kind take boolean values ``true``/``false``. Other types of
78 options can take an integral or string value as suitable for that option. In
79 the above option-dictionary, the option-key ``LIBC_CONF_PRINTF_DISABLE_FLOAT``
80 is of boolean type with value ``true``.
85 The option names, or the keys of a option-dictionary, have the following format:
89 LIBC_CONF_<UPPER_CASE_TAG_NAME>_<ACTION_INDICATING_THE_INTENDED_SEMANTICS>
91 The option name used in the above examples, ``LIBC_CONF_PRINTF_DISABLE_FLOAT``
92 to disable printing of floating point numbers, follows this format: It has the
93 prefix ``LIBC_CONF_``, followed by the grouping-tag name ``PRINTF`` in upper
94 case, followed by the action to disable floating point number printing
95 ``LIBC_CONF_PRINTF_DISABLE_FLOAT``.
97 Mechanics of config application
98 ===============================
103 At libc config time, three different ``config.json`` files are read in the
106 1. ``config/config.json``
107 2. ``config/<platform or OS>/config.json`` if present.
108 3. ``config/<platform or OS>/<target arch>/config.json`` if present.
110 Each successive ``config.json`` file overrides the option values set by
111 previously read ``config.json`` files. Likewise, a similarly named command line
112 option to the cmake command will override the option values specified in all or
113 any of these ``config.json`` files. That is, users will be able to override the
114 config options from the command line.
119 Local to the directory where an option group is relevant, suitable build logic
120 should convert the CMake config options to appropriate compiler and/or linker
121 flags. Those compile/link flags can be used in listing the affected targets as
124 .. code-block:: cmake
129 ${common_printf_compile_options}
130 ... # Other compile options affecting this target irrespective of the
131 # libc config options
134 Note that the above scheme is only an example and not a prescription.
135 Developers should employ a scheme appropriate to the option being added.
140 The CMake configure step automatically generates the user document
141 ``doc/configure.rst``, which contains user information about the libc configure
142 options, using the information in the main ``config/config.json`` file.
143 An update to ``config/config.json`` will trigger reconfiguration by CMake, which
144 in turn will regenerate the documentation in ``doc/configure.rst``.