mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-16 10:03:50 +01:00
doc: Add Kconfig documentation section
This adds information regarding the usage of Kconfig from an user perspective and in-depth information on how Kconfig is currently integrated to RIOT's build system.
This commit is contained in:
parent
c7f29c2ea4
commit
ab3cea197f
@ -770,6 +770,7 @@ INPUT = ../../doc.txt \
|
|||||||
src/build-system-basics.md \
|
src/build-system-basics.md \
|
||||||
src/advanced-build-system-tricks.md \
|
src/advanced-build-system-tricks.md \
|
||||||
src/changelog.md \
|
src/changelog.md \
|
||||||
|
src/kconfig/kconfig.md \
|
||||||
../../LOSTANDFOUND.md
|
../../LOSTANDFOUND.md
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
|
|||||||
381
doc/doxygen/src/kconfig/kconfig.md
Normal file
381
doc/doxygen/src/kconfig/kconfig.md
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
# Kconfig in RIOT {#kconfig-in-riot}
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
The objective of using Kconfig in RIOT is to configure software modules at
|
||||||
|
compile-time. This means having a standard way of:
|
||||||
|
- Exposing configurable parameters
|
||||||
|
- Assigning application and user-specific configurations
|
||||||
|
- Verifying these parameters
|
||||||
|
- Check possible values
|
||||||
|
- Check valid configuration considering inter-dependencies
|
||||||
|
- Applying the selected configuration
|
||||||
|
|
||||||
|
# Overview {#kconfig-overview}
|
||||||
|
|
||||||
|
## Exposure
|
||||||
|
Modules in RIOT expose their configurable parameters via
|
||||||
|
Kconfig files (for more information on Kconfig syntax check
|
||||||
|
[the specification](https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html)).
|
||||||
|
In these files documentation, restrictions, default values and dependencies can
|
||||||
|
be expressed.
|
||||||
|
|
||||||
|
Kconfig files are structured through the file system mirroring the current
|
||||||
|
module distribution. In time, all modules will have Kconfig files to make
|
||||||
|
themselves configurable through this system.
|
||||||
|
|
||||||
|
## Assignment
|
||||||
|
The user can assign values to the exposed parameters, either by manually writing
|
||||||
|
'.config' files or using an interface such as Menuconfig. Parameters with no
|
||||||
|
assigned values will take the default ones. For a detailed distinction between
|
||||||
|
Kconfig and '.config' files see [Appendix B](#kconfig-appendix-b).
|
||||||
|
|
||||||
|
## Verification and application
|
||||||
|
Using '.config' and Kconfig files the build system takes care of doing the
|
||||||
|
necessary checks on the values according to the parameter definition. After
|
||||||
|
that, the `autoconf.h` header file is generated, it contains all the
|
||||||
|
configurations in the form of (`CONFIG_` prefixed) macros.
|
||||||
|
|
||||||
|
---
|
||||||
|
# User's guide to configure with Kconfig {#kconfig-users-guide}
|
||||||
|
|
||||||
|
## Configure using menuconfig {#configure-using-menuconfig}
|
||||||
|
In order to use the graphical interface menuconfig to configure the
|
||||||
|
application, run `make menuconfig` in the application's folder. All available
|
||||||
|
configurations (based on the used modules) for the particular platform will be
|
||||||
|
presented. By default, the configuration of a module via Kconfig is not enabled.
|
||||||
|
In order to activate the configuration via Kconfig the corresponding option
|
||||||
|
should be selected. That will enable the configuration of all inner options, if
|
||||||
|
available.
|
||||||
|
|
||||||
|
Once the desired configuration is achieved save the configuration to the
|
||||||
|
default proposed path and exit. The saved configuration will be applied when
|
||||||
|
the code is compiled (`make all`).
|
||||||
|
|
||||||
|
If the current configuration will be used in the future it can be saved in the
|
||||||
|
application's folder as `user.config`, using the 'Save' option in menuconfig.
|
||||||
|
This way it will be persistent after cleaning the application directory
|
||||||
|
(`make clean`).
|
||||||
|
|
||||||
|
## Configure using '.config' files {#configure-using-files}
|
||||||
|
The second way to configure the application is by directly writing '.config'
|
||||||
|
files. Two files will be sources of configuration during the generation of the
|
||||||
|
final header file: `app.config` and `user.config`, which should be placed
|
||||||
|
inside the application's folder. `app.config` sets default configuration
|
||||||
|
values for the particular application, the user can override them by setting
|
||||||
|
them in `user.config`.
|
||||||
|
|
||||||
|
Let's say that the `SOCK_UTIL_SCHEME_MAXLEN` symbol in `sock_util` module needs
|
||||||
|
to be configured. The `user.config` file could look like:
|
||||||
|
|
||||||
|
```Makefile
|
||||||
|
# activate configuration of sock_util using Kconfig
|
||||||
|
CONFIG_KCONFIG_MODULE_SOCK_UTIL=y
|
||||||
|
# change scheme part length
|
||||||
|
CONFIG_SOCK_UTIL_SCHEME_MAXLEN=24
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, there is no need for using menuconfig. It's enough just to call
|
||||||
|
`make all` in the application folder, as this configuration will be read and
|
||||||
|
applied. Note that if any dependency issue occurs, warnings will be generated
|
||||||
|
(e.g. not enabling the configuration of a module via Kconfig).
|
||||||
|
|
||||||
|
## Application configuration with Kconfig {#app-config-kconfig}
|
||||||
|
To expose application-specific configuration options a `Kconfig` file can
|
||||||
|
be placed in the application's folder. For an example of this you can check
|
||||||
|
the [tests/kconfig](https://github.com/RIOT-OS/RIOT/tree/master/tests/kconfig)
|
||||||
|
application.
|
||||||
|
|
||||||
|
## A note on the usage of CFLAGS
|
||||||
|
When a certain module is being configured via Kconfig the configuration macro
|
||||||
|
will not longer be overridable by means of CFLAGS (e.g. set on the
|
||||||
|
compilation command or on a Makefile). Consider this if you are getting a
|
||||||
|
'redefined warning'.
|
||||||
|
|
||||||
|
## A note on the usage of the 'clean' command
|
||||||
|
When using Kconfig as the configurator for RIOT, configuration symbols may be
|
||||||
|
used in Makefiles through the build system. For this to work properly make
|
||||||
|
sure that when cleaning an application you call `make clean && make all`,
|
||||||
|
instead of `make clean all`.
|
||||||
|
|
||||||
|
---
|
||||||
|
# Integration into the build system {#kconfig-integration-into-build-system}
|
||||||
|
|
||||||
|
The integration of Kconfig into the build system is mainly done in
|
||||||
|
`makefiles/kconfig.mk`.
|
||||||
|
|
||||||
|
## Steps during the build process {#kconfig-steps-build-process}
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 0. Module dependency resolution
|
||||||
|
Currently, the resolution of module dependencies is performed by the build
|
||||||
|
system where all the used modules and packages end up listed in the `USEMODULE`
|
||||||
|
make variables. In the next phases of integration we plan to resolve dependencies
|
||||||
|
using Kconfig.
|
||||||
|
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
- Makefiles.
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
- `USEMODULE` and `USEPKG` variables.
|
||||||
|
|
||||||
|
### 1. Module listing
|
||||||
|
The list of modules needed for the particular build is dumped into the
|
||||||
|
`$ (GENERATED_DIR)/Kconfig.dep` file, where each module is translated into a
|
||||||
|
Kconfig symbol as documented in [Appendix A](#kconfig-appendix-a).
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
- `USEMODULE` and `USEPKG` variables
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
- `$ (GENERATED_DIR)/Kconfig.dep` file
|
||||||
|
|
||||||
|
### 2. Merging all configuration sources {#kconfig-steps-merge-configs}
|
||||||
|
In this step configuration values are taken from multiple sources and merged
|
||||||
|
into a single `merged.config` configuration file. This file is temporary and is
|
||||||
|
removed on clean. If the user needs to save a particular configuration
|
||||||
|
set, a backup has to be saved (this can be done using the menuconfig interface)
|
||||||
|
so it can be loaded later in this step.
|
||||||
|
|
||||||
|
To accomplish merging of multiple input files, the `mergeconfig` script is
|
||||||
|
used. Note that **the order matters**: existing configuration values are
|
||||||
|
merged in the order expressed in the input section, where the last value
|
||||||
|
assigned to a parameter has the highest priority. If no configuration files are
|
||||||
|
available all default values will be applied.
|
||||||
|
|
||||||
|
`merged.config` is the only configuration input for the `autoconf.h` in the
|
||||||
|
[generation step](#kconfig-steps-header-gen).
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
- Optional:
|
||||||
|
- `$ (APPDIR)/app.config`: Application specific default configurations.
|
||||||
|
- `$ (APPDIR)/user.config`: Configurations saved by user.
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
- `$ (GENERATED_DIR)/merged.config` file.
|
||||||
|
|
||||||
|
### 3. Menuconfig execution (optional)
|
||||||
|
Menuconfig is a graphical interface for software configuration. It is used for
|
||||||
|
the configuration of the Linux kernel. This section explains the process
|
||||||
|
that occurs when RIOT is being configured using the menuconfig interface.
|
||||||
|
|
||||||
|
The main `Kconfig` file is used in this step to show the configurable
|
||||||
|
parameters of the system. Kconfig will filter innaplicable parameters (i.e.
|
||||||
|
parameters exposed by modules that are not being used) based on the file
|
||||||
|
`$ (GENERATED_DIR)/Kconfig.dep` generated in step 1.
|
||||||
|
|
||||||
|
During the transition phase, the user needs to enable Kconfig explicitly per
|
||||||
|
module, by setting the corresponding option. If using `menuconfig` a checkbox
|
||||||
|
with a submenu has to be selected, if using `.config` files a
|
||||||
|
`CONFIG_KCONFIG_MODULE_` prefixed option has to be set to `y`. For more
|
||||||
|
information see
|
||||||
|
[Making configuration via Kconfig optional](#kconfig-configuration-optional).
|
||||||
|
|
||||||
|
Note that if Kconfig is not used to configure a module, the corresponding
|
||||||
|
header files default values will be used.
|
||||||
|
|
||||||
|
`merged.config` is one of the inputs for menuconfig. This means that any
|
||||||
|
configuration that the application defines in the `app.config` or a backup
|
||||||
|
configuration from the user in `user.config` are taken into account on the
|
||||||
|
first run (see [Appendix C](#kconfig-appendix-c)).
|
||||||
|
|
||||||
|
In this step the user chooses configuration values (or selects the minimal
|
||||||
|
configuration) and saves it to the `merged.config` file. Here the user can
|
||||||
|
choose to save a backup configuration file for later at a different location
|
||||||
|
(e.g. a `user.config` file in the application folder).
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
- `/Kconfig` file.
|
||||||
|
- Optional:
|
||||||
|
- `$ (APPDIR)/app.config`
|
||||||
|
- `$ (APPDIR)/user.config`
|
||||||
|
- `$ (GENERATED_DIR)/merged.config`
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
- Updated `$ (GENERATED_DIR)/merged.config` file.
|
||||||
|
- `$ (GENERATED_DIR)/merged.config.old` backup file.
|
||||||
|
|
||||||
|
### 4. Generation of the autoconf.h header {#kconfig-steps-header-gen}
|
||||||
|
With the addition of Kconfig a dependency has been added to the build
|
||||||
|
process: the `$ (GENERATED_DIR)/autoconf.h` header file. This header file is
|
||||||
|
the main output from the Kconfig configuration system. It holds all the macros
|
||||||
|
that should be used to configure modules in RIOT:
|
||||||
|
`CONFIG_<module>_<parameter>`.
|
||||||
|
|
||||||
|
In order to generate the `autoconf.h` file the `genconfig` script is used.
|
||||||
|
Inputs for this script are the main `Kconfig` file and `merged.config`
|
||||||
|
configuration file, which holds the selected values for the exposed parameters.
|
||||||
|
|
||||||
|
#### Input:
|
||||||
|
- `$ (GENERATED_DIR)/merged.config` file.
|
||||||
|
- Main `Kconfig` file exposing configuration of modules.
|
||||||
|
|
||||||
|
#### Output:
|
||||||
|
- `$ (GENERATED_DIR)/autoconf.h` configuration header file.
|
||||||
|
|
||||||
|
|
||||||
|
### Summary of files
|
||||||
|
These files are defined in `kconfig.mk`.
|
||||||
|
|
||||||
|
| File | Description |
|
||||||
|
| ----------------- | ----------- |
|
||||||
|
| `Kconfig` | Defines configuration options of modules. |
|
||||||
|
| `Kconfig.dep` | Holds a list of the modules that are being compiled. |
|
||||||
|
| `app.config` | Holds default application configuration values. |
|
||||||
|
| `user.config` | Holds configuration values applied by the user. |
|
||||||
|
| `merged.config` | Holds configuration from multiple sources. Used to generate header. |
|
||||||
|
| `autoconf.h` | Header file containing the macros that applied the selected configuration. |
|
||||||
|
|
||||||
|
## Kconfig symbols in Makefiles
|
||||||
|
As '.config' files have Makefile syntax they can be included when building,
|
||||||
|
which allows to access the applied configuration from the build system and, in
|
||||||
|
the future, to check for enabled modules.
|
||||||
|
|
||||||
|
During migration this is also useful, as it gives the ability to check if a
|
||||||
|
parameter is being configured via Kconfig or a default value via `CFLAGS` could
|
||||||
|
be injected. For example:
|
||||||
|
|
||||||
|
```Makefile
|
||||||
|
ifndef CONFIG_USB_VID
|
||||||
|
CFLAGS += -DCONFIG_USB_VID=0x1209
|
||||||
|
endif
|
||||||
|
```
|
||||||
|
|
||||||
|
Symbols will have the same name as the configuration macros (thus will always
|
||||||
|
have the `CONFIG_` prefix). As the configuration file is loaded in
|
||||||
|
`Makefile.include` care should be taken when performing checks in the
|
||||||
|
application's Makefile. The symbols will not be defined until after including
|
||||||
|
`Makefile.include`.
|
||||||
|
|
||||||
|
---
|
||||||
|
# Transition phase {#kconfig-transition-phase}
|
||||||
|
## Making configuration via Kconfig optional {#kconfig-configuration-optional}
|
||||||
|
During transition to the usage of Kconfig as the main configurator for RIOT,
|
||||||
|
the default behavior will be the traditional one: expose configuration options
|
||||||
|
in header files and use CFLAGS as inputs. To allow optional configuration via
|
||||||
|
Kconfig, a convention will be used when writing Kconfig files.
|
||||||
|
|
||||||
|
Modules should be contained in their own `menuconfig` entries, this way the user
|
||||||
|
can choose to enable the configuration via Kconfig for an specific module.
|
||||||
|
These entries should define a dependency on the module they configure (see
|
||||||
|
[Appendix A](#kconfig-appendix-a) to see how to check if a module is being
|
||||||
|
used).
|
||||||
|
|
||||||
|
The module configuration then can be enabled either via the menuconfig
|
||||||
|
interface:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
or by means of a '.config' file:
|
||||||
|
|
||||||
|
```Make
|
||||||
|
CONFIG_KCONFIG_MODULE_GCOAP=y
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
# Appendixes {#kconfig-appendixes}
|
||||||
|
|
||||||
|
## Appendix A: Check if a module or package is used {#kconfig-appendix-a}
|
||||||
|
In order to show only the relevant configuration parameters to the user with
|
||||||
|
respect to a given application and board selection, Kconfig needs knowledge
|
||||||
|
about all modules and packages to be used for a compilation. Currently
|
||||||
|
dependency handling among modules is performed by the build system (via
|
||||||
|
`Makefile.dep` files). The interface defined to declared the used modules and
|
||||||
|
packages is the `$ (GENERATED_DIR)/Kconfig.dep` file.
|
||||||
|
|
||||||
|
`Kconfig.dep` is a Kconfig file that will define symbols of the form:
|
||||||
|
```Kconfig
|
||||||
|
config MODULE_SOCK_UTIL
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
```
|
||||||
|
There will be a symbol for every used module (i.e. every module in
|
||||||
|
`USEMODULE` make variable) and package. The names in the symbols will be
|
||||||
|
uppercase and separated by `_`. Based on these symbols configurability is
|
||||||
|
decided. Modules and packages symbols will have `MODULE_` and `PKG_` prefixes
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
The following is an example of how to use these symbols in Kconfig files to
|
||||||
|
enable/disable a configuration menu:
|
||||||
|
|
||||||
|
```Kconfig
|
||||||
|
menuconfig KCONFIG_MODULE_SOCK_UTIL
|
||||||
|
bool "Configure Sock Utilities"
|
||||||
|
depends on MODULE_SOCK_UTIL
|
||||||
|
help
|
||||||
|
"Configure Sock Utilities using Kconfig."
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, every configuration option for the previous module would be modeled like:
|
||||||
|
|
||||||
|
```Kconfig
|
||||||
|
if KCONFIG_MODULE_SOCK_UTIL
|
||||||
|
|
||||||
|
config SOCK_UTIL_SCHEME_MAXLEN
|
||||||
|
int "Maximum length of the scheme part for sock_urlsplit"
|
||||||
|
default 16
|
||||||
|
|
||||||
|
endif # KCONFIG_MODULE_SOCK_UTIL
|
||||||
|
```
|
||||||
|
|
||||||
|
## Appendix B: Difference between 'Kconfig' and '.config' files {#kconfig-appendix-b}
|
||||||
|
Kconfig files describe a configuration database, which is a collection of
|
||||||
|
configuration options organized in a tree structure. Configuration options may
|
||||||
|
have dependencies (among other attributes), which are used to determine their
|
||||||
|
visibility.
|
||||||
|
|
||||||
|
Kconfig files are written in
|
||||||
|
[Kconfig language](https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt)
|
||||||
|
defined in the Linux kernel. Configuration options have attributes such as
|
||||||
|
types, prompts and default values.
|
||||||
|
|
||||||
|
#### Kconfig file
|
||||||
|
|
||||||
|
```Kconfig
|
||||||
|
menu "Buffer Sizes"
|
||||||
|
|
||||||
|
config GCOAP_PDU_BUF_SIZE
|
||||||
|
int "Request or response buffer size"
|
||||||
|
default 128
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
```
|
||||||
|
|
||||||
|
On the other hand configuration files contain assignment of values to
|
||||||
|
configuration options and use Makefile syntax. They can also be used to save a
|
||||||
|
set of configuration values as backup.
|
||||||
|
|
||||||
|
#### '.config' file
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# enable Kconfig configuration for gcoap
|
||||||
|
CONFIG_KCONFIG_MODULE_GCOAP=y
|
||||||
|
# set the value
|
||||||
|
CONFIG_GCOAP_PDU_BUF_SIZE=12345
|
||||||
|
```
|
||||||
|
|
||||||
|
In other words: Kconfig files describe configuration options and '.config' files
|
||||||
|
assign their values.
|
||||||
|
|
||||||
|
## Appendix C: Pitfall when using different configuration interfaces {#kconfig-appendix-c}
|
||||||
|
In the current configuration flow the user can choose to configure RIOT using
|
||||||
|
the menuconfig graphical interface or writing '.config' files by hand.
|
||||||
|
|
||||||
|
As explained in the
|
||||||
|
['Configuration sources merging step'](#kconfig-steps-merge-configs)
|
||||||
|
of the configuration process, configuration from multiple sources are loaded to
|
||||||
|
create a single `merged.config` file, and the order of merging matters: last
|
||||||
|
file has priority.
|
||||||
|
|
||||||
|
While editing values directly via '.config' files `merged.config` will be
|
||||||
|
re-built. Once the user decides to edit `merged.config` directly using
|
||||||
|
menuconfig, the file will not be re-built anymore, and any changes by manually
|
||||||
|
editing the source files will have no effect. To go back to manual edition
|
||||||
|
a `make clean` has to be issued in the application directory.
|
||||||
|
|
||||||
|
# Useful references {#kconfig-useful-references}
|
||||||
|
- [Kconfig language specification](https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html)
|
||||||
|
- [Kconfig macro language specification](https://www.kernel.org/doc/html/latest/kbuild/kconfig-macro-language.html)
|
||||||
|
- [Kconfig - Tips and Best Practices](https://docs.zephyrproject.org/latest/guides/kconfig/tips.html)
|
||||||
3
doc/doxygen/src/kconfig/kconfig_integration.svg
Normal file
3
doc/doxygen/src/kconfig/kconfig_integration.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 13 KiB |
BIN
doc/doxygen/src/kconfig/kconfig_menuconfig.png
Normal file
BIN
doc/doxygen/src/kconfig/kconfig_menuconfig.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
Loading…
x
Reference in New Issue
Block a user