blob: 1ff31aab16969baac1eed7eae0d193b710839900 [file] [view]
(configure_options)=
# Adding new libc configure options
{doc}`There are a number of configure options <../configure>` 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:
```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:
```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:
```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:
```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:
```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`.