One of the hurdles when building a custom library or software is how to allow the user to configure it. We can have a header file with comments and tell the user how to configure it but if multiple defines start to have dependencies or the value is more than true or false, there's a chance the user will get this wrong and the a whole class of issues is going to be opened and time is going to be wasted.
source |
The linux kernel solved it with the Kconfig utility, which was reimplemented using the kconfiglib. fortunately its easier to install and use and the integration requires only menuconfig and genconfig utilities.
To implement it in our software we need to do the following:
KConfig file
write your configuration file, here's an example with one boolean and one string configuration values:
mainmenu "Sample configurable project using Kconfig" config FOO bool "Foo module" help The infamous Foo module config BAR string "Bar Value" help The Bar Value
platformio.ini
Once we have the configuration file we need to tell menuconfig and genconfig where the file is, where to save the configuration settings and where to generate the header file with the configuration values.
; menuconfig runner extra_scripts = scripts/run_menuconfig.py ; path to Kconfig file custom_kconfig_config = scripts/configs/Kconfig ; configuration settings file custom_kconfig_save_settings = include/custom_config.config ; configuration settings file and header file header comment custom_kconfig_comment_header = File Header hello world ; output configuration header file custom_kconfig_output_header = include/custom_config.h
All we need to do now is execute the runner
pio run -t kconfig
when we quit and save, menuconfig will generate the configuration setting file to custom_kconfig_save_settings:
#File Header #hello world CONFIG_FOO=y CONFIG_BAR="hello world"
and then execute genconfig and generate the header file to custom_kconfig_output_header:
// File Header // hello world #define CONFIG_FOO 1 #define CONFIG_BAR "hello world"
and lastly, we can use the header file like any other header file and get our configuration from it:
#include <custom_config.h> MAIN() { printf("Program started!\r\n"); printf("Bar Value %s\r\n", CONFIG_BAR); }
0 comments:
Post a Comment