mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 21:16:05 +00:00
145 lines
5.0 KiB
ReStructuredText
145 lines
5.0 KiB
ReStructuredText
.. _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``.
|