(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`.
