nikola 发表于 2023-11-7 18:48:27

[开源]kconfiglib_tool实现宏定义配置图形化选项菜单

本帖最后由 nikola 于 2023-11-7 18:55 编辑

kconfiglib_tool开源地址:https://gitee.com/nikolan/kconfiglib_toolkconfiglib_tool工具实现宏定义配置图形化选项菜单, 能让你在Windows平台下使用kconifg,来管理你的系统配置选项, 适用于为各种单片机宏定义配置图形化选项菜单。kconifg是一种配置文件的语法
如果有接触过esp-idf或者是Linux的menuconfig,相信就对这个比较熟悉。
这个工具最终目的是通过简单的命令行字符图形界面
来方便地配置各种选项最终生成一个头文件的各种宏定义
这些宏定义最终会间接影响编译生成的固件
通过这个可以方便地裁剪功能或者选择不同的配置
而近年来越来越多厂商提供的SDK,
都是以kconfig来实现的menuconfig来做一些配置。
例如:
[*]esp-idf
[*]Zephyr
[*]rt-thread-env
[*]NuttX
使用方法基本测试这个kconfig.exe是使用了pyinstaller打包的exe可执行文件
理论上是没有pyhton环境的电脑也可以打开使用
不过我也没法测试
所以在放到你工程上使用前可以先跑一下项目我测试的这个demo
直接双击打开kconfig.exe会重新menuconfig类似的界面
然后随便修改一个选项
按q退出时会询问是否保存修改
选Yes
接着查看生成的这个gen_config.h里面的宏定义的值
是否和你在界面修改的一致。
放到工程上使用1.首先使用kconfig的语法来
编写对应配置菜单文件
conifg.in
如果你对kconfig一点都不懂
就看我的demo改字符串就行
后面再看看语法,都比较简单
2.复制 kconfig.exe
到你工程的tool工具目录下
3.然后复制user.json
到kconfig.exe的同一目录
填写必要的配置
填写无误后直接运行就能生成gen_config.h
4.以下对json文件的配置项做详细说明
其实如果你没有什么要求只需要修改下
input_file_path
output_file_path
include_libs
这三项就可以了,其他没什么必要改,只是留出来接口给大家玩玩

[*]input_file_path": "./config.in"
填写kconfig的菜单描述文件.in所在目录

[*]"output_file_path": "./gen_config.h"
填写最终生成的.h头文件配置的目录

[*]"defconfig_path":"./defconfig.config",
填写初步处理的配置项文件的目录
[*]"defconfig_header":"./defconfig.h",
填写按配置项文件转为宏定义后的初步头文件目录
[*]"update_time": true,
是否开启每次配置后更新头文件的生成配置的时间,默认开启

[*]"add_extern_c": false,
是否给头文件加入extern c语法使得c++可兼容使用,默认开启

[*]"fg_color":"white",
终端字体的颜色

[*]"bg_color":"green",
终端背景的颜色

[*]"encoding":"utf-8",
字体编码UTF-8,好像如果有非英文字体不用UTF-8会报错

[*]"creator":"your name here",
配置的作者名称

[*]"first_letter_of_macro":"#",
字符串首字符为#时,取消字符串双引号,只取字符串名称

[*]"item_prefix":"CONFIG_",
生成的配置项宏定义的前缀,好像Linux都是加这个前缀的

[*]"description":[
"your Description!"
],
添加头文件的描述,这里可以写自己的一些说明注意事项什么的

[*]"include_libs": [


"#include \"stdint.h\"",
"#include \"stdbool.h\"",
"#include \"stm32f4xx.h\""

]
添加需要引入到生成的配置头文件的各种头文件和库
注意这些双引号在字符串内需要使用\",以逗号分开每一项

二次开发添加的功能这个和kconfig的menuconfig的功能
基本变化不大,语法也是和kconfig一样
就稍微添加了2个功能方便配置.
通过json文件来配置程序因为直接打包为exe
方便没有python和各种库
都能直接运行在电脑上
而且需要配置的功能比较多
通过命令行传参比较麻烦
干脆就用一个user.json
来填写各种参数程序来读取这个文件
字符串以#开头则二次处理取消字符串的双引号这个主要是为了能直接填写宏定义的名称和变量名称
因为kconfig的变量类型不能直接填名称
但是我希望配置一下底层的HAL库的结构体
某些选项就需要填宏定义的名称,
总不能填地址或者去库翻一翻宏定义是什么数值吧
这样配置的话可读性也太差了。
所以参考就添加这么个方法把以#开头的字符串
直接填字符而不加双引号
利用这个方法,如果你和我一样
其实并不需要使用kconfig的其他复杂功能
只需要能用图形配置菜单填写宏定义的值
那么甚至可以简化kconfig的语法
把几乎所有选项全变为字符串类型
只需要会用这个格式
就能轻松自定义设计menuconfig的菜单了
menu "menu_name"config A      string "A"      default "#xxx"endmenu


如果你希望这个宏定义A是整数1
default "#1"就直接处理为1

如果你希望它是浮点数
default "#1.2"直接处理为1.2

如果你希望直接填宏定义或变量名称
default "#GPIOA"直接处理为GPIOA

如果你就需要它是字符串则不以#开头
default "string"处理为"string"

当然这个是pyhton二次处理的,不是kconfig的标准语法。
直接用kconfig也没有什么难度
这个处理只有你字符串不使用#开头语法也不冲突
后续 TODO
最初这个东西是运行于Linux的
有看到移植到window的版本
python的版本:
是现在这个Kconfiglib
https://github.com/ulfalizer/Kconfiglib
c的版本:
是这个kconfig-frontends
官方原版:https://github.com/uvc-ingenieure/kconfig-frontends
乐鑫fork的版本:https://github.com/espressif/kconfig-frontends
这里使用python版本进行重新封装开发一下
c版本的因为cmake报错没找到解决办法
安装了一堆gunwin32的各种依赖库
cmake终于生成Makefile了
后面make都到100%
连接为exe文件时又说有什么定义找不到了编译失败
搞了一天了没办法最后还是选择用python这个
在python的这个kconfiglib
我有尝试了使用中文字符来做配置菜单
在普通cmd终端下会重新中文文字重叠
换一个比较好的终端切换界面后会有中文字体的残留
猜测是底层对中文字符串不太支持,
应该是删除时,为了速度没有全刷而是局刷
但是没考虑中文的宽度,
pyhton的库也没法查查源码排查就放弃做中文支持了。
如果使用C语言版本的说不定是能查查代码改一下API的
尝试解决字体残留的
但是C语言版本的编译不过
就先这样了
___ageek一个极客开源
二次开发环境搭建请安装pyhton3 然后通过pip install 安装kconfig.py需要用到的各种库 例如pip install kconfiglibpip install pyinstaller


之后直接python ./kconfig


进行调试最终通过pyinstaller来打包为exe 这样exe就不需要python环境单独执行了 打包完成后的exe在./dist下pyinstaller ./kconfig.py

eric2013 发表于 2023-11-8 08:14:18

谢谢楼主分享。

fyyxxm 发表于 2023-11-8 10:28:44

不知道有啥用。。是只支持ST的MCU?

nikola 发表于 2023-11-8 11:25:14

fyyxxm 发表于 2023-11-8 10:28
不知道有啥用。。是只支持ST的MCU?

当然不是只支持st的MCU,这个就和硬件平台一点关系都没有,是按kconfig编写图形化配置界面,最终配置项会以宏定义方式写在输出的头文件内,其他文件引用这个头文件,按不同的配置的宏定义来裁剪代码或者配置功能,如果你的项目系统需要可读性强可维护性高的系统配置就可以使用这种方式。可以去参考Linux的配置的menuconfig和esp-idf的menuconfig是怎么使用的,就知道是怎么回事了。

caicaptain2 发表于 2023-11-8 12:03:11

唉,又得学习一个语法,心累。。。。

hqgboy 发表于 2023-11-8 15:08:35

牛叉。。。。顶顶。

gallop020142 发表于 2023-11-8 15:11:30

这个能用来配置zehpyr吗?

nikola 发表于 2023-11-8 15:24:38

gallop020142 发表于 2023-11-8 15:11
这个能用来配置zehpyr吗?

zehpyr好像本来就有menuconfig吧,虽然我也没用过,找到kconfig的文件试试。

tovinz 发表于 2023-11-8 15:27:34

前段时间我也想把这玩意整我的工程里去配置宏,奈何能力不够:L
只能暂时用KEIL的那个代替用着

zhang0352505 发表于 2023-11-8 15:59:51

非常棒,RTThread能用吗?

nikola 发表于 2023-11-8 16:03:36

tovinz 发表于 2023-11-8 15:27
前段时间我也想把这玩意整我的工程里去配置宏,奈何能力不够
只能暂时用KEIL的那个代替用着

我也是看博客了解到,然后自己搭环境改的,可以参考这个【从零到一搭建Kconfig配置系统】https://blog.csdn.net/wenbo13579/article/details/127464764

nikola 发表于 2023-11-8 16:08:14

本帖最后由 nikola 于 2023-11-8 16:39 编辑

zhang0352505 发表于 2023-11-8 15:59
非常棒,RTThread能用吗?
你可以把kconfig的配置文件路径填到user.json的input_file_path试试,理论是所有kconfig文件都可以的使用的。

tovinz 发表于 2023-11-8 16:47:44

nikola 发表于 2023-11-8 16:03
我也是看博客了解到,然后自己搭环境改的,可以参考这个【从零到一搭建Kconfig配置系统】https://blog.cs ...

是的,就是这个

hanlin 发表于 2023-11-9 10:08:42

稍微搂一眼,就知道是好东西,最近刚好在用esp-idf的

跟着硬汉学 发表于 2023-11-9 11:45:53

我想说的是,就比如esp-idf中的menuconfig,如果更改了里面的一个小配置,就要对该工程进行全编译,几百个文件,很费时间!比如我只更改了led的引脚,只是这个小的更改,他就会进行全编译,而且编译时间也非常长!体验很不好!

pokemonds 发表于 2023-11-27 17:32:59

能做成根据这个配置文件生成工程的话比较方便调试
页: [1]
查看完整版本: [开源]kconfiglib_tool实现宏定义配置图形化选项菜单