.. _Kconfig_system: ################## The Kconfig System ################## The Kconfig system is an alternative tool to the CMake config system for users to change config options of TF-M. .. figure:: ../../../../../../modules/tee/tf-m/trusted-firmware-m/docs/configuration/kconfig_header_file_system.svg It handles dependencies and validations automatically when you change configurations so that the generated configuration options are always valid. To use the Kconfig system, enable ``USE_KCONFIG_TOOL`` in command line. And enable ``MENUCONFIG`` to launch configuration GUI. The Kconfig system consists of `The Kconfig tool`_ and the `The Kconfig files`_. **************** The Kconfig tool **************** The Kconfig tool is a python script based on `Kconfiglib `__ to generate the following config files: - CMake config file Contains CMake cache variables of building options. - Header file Contains component options in the header file system. Component options are gathered together in a separate menu ``TF-M component configs`` in `The Kconfig files`_. - The .config and .config.old files The ``.config`` file which contains all the above configurations in the Kconfig format. It will be created after the first execution of the script. It is only used to allow users to make adjustments basing on the previous settings. The Kconfig tool will load it if it exists and ``.config.old`` will be created to save the previous configurations. The tool supports loading multiple pre-set configuration files merging into a single one. The first loaded options are overridden by later ones if the config files contain duplicated options. And dependencies between config options are taken care of. It then launches a configuration GUI for users to change any config options if the ``MENUCONFIG`` is enabled in build command line. Integration with TF-M build system ---------------------------------- TF-M build system includes ``kconfig.cmake`` to integrate this tool. It prepares the parameters for the script and invokes it to load multiple configuration files basing on your build setup, including but not limited to - Build type bound configurations, decided by ``CMAKE_BUILD_TYPE`` - Profile configurations, decided by ``TFM_PROFILE`` ************************** Customizing config options ************************** By default, the Kconfig system only merges configuration files and generated the final config files. To customize the config options, there are several approaches. Menuconfig ---------- Menuconfig is the recommended approach to adjust the values of the config options because it has a graphic interface for you to easily change the options without worrying about dependencies. To launch the menuconfig, you need to enable ``MENUCONFIG`` in addition to enabling ``USE_KCONFIG_TOOL``. .. code-block:: bash cmake -S . -B cmake_build -DTFM_PLATFORM=arm/mps2/an521 \ -DUSE_KCONFIG_TOOL=ON \ -DMENUCONFIG=ON .. note:: Although the Kconfiglib provides three `menuconfig interfaces `__, only GUI menuconfig can be launched by CMake for the time being. Command line options -------------------- The support of passing configurations via command line is kept for the Kconfig system. .. code-block:: bash cmake -S . -B cmake_build -DTFM_PLATFORM=arm/mps2/an521 \ -DUSE_KCONFIG_TOOL=ON \ -DTFM_ISOLATION_LEVEL=2 Kconfig file ------------ You can also put the frequently used config options into a Kconfig file. When you need to apply the config options in that file, pass it via command line option ``-DKCONFIG_CONFIG_FILE`` .. code-block:: bash cmake -S . -B cmake_build -DTFM_PLATFORM=arm/mps2/an521 \ -DTFM_ISOLATION_LEVEL=2 \ -DUSE_KCONFIG_TOOL=ON \ -DKCONFIG_CONFIG_FILE=my_config.conf .. note:: The command line set options override the ones in the config file. And you can always launch menuconfig to do the final adjustments. ***************** The Kconfig files ***************** The Kconfig files are the files written by the `Kconfig language `__ to describe config options. They also uses some Kconfiglib extensions such as optional source ``osource`` and relative source ``rsource`` so they can only work with the Kconfiglib. -------------- *Copyright (c) 2022-2023, Arm Limited. All rights reserved.*