简体中文 | English
从 linux kernel 源码中的 mconf 工具优化改造而来。用于图形化生成项目宏配置。
在线主页: https://luskyle.github.io/menuconfig-plusplus/
- 内核同款 TUI: 方向键导航、
<Y>/<N>/<M>开关高亮项、?或< Help >查看帮助、/搜索 - 中文界面: 链接宽字符版
ncursesw, 标题、菜单、帮助窗口按显示列宽居中与截断, 中文项不错位也不被砍成半个字 - 完整 kconfig 语义:
bool/tristate/int/hex/string、choice、depends on、select、多层子菜单与source文件包含 - 生成
sdkconfig, 可直接被 CMake 读取为编译宏 conf提供非交互模式 (--olddefconfig/--defconfig/--allyesconfig等), 可放入脚本与 CI
- C 编译器 (gcc / clang)
- ncurses 开发库 (需要其中的宽字符版
ncursesw, 窄字符库会把中文按字节转义成乱码)
# Debian / Ubuntu
sudo apt install -y libncurses-dev推荐直接用 cmake, 不需要 root, 也不会污染源码目录:
cmake -S . -B build -G Ninja
cmake --build build产物为 build/mconf (图形界面) 和 build/conf (命令行).
构建类型由两个开关控制:
| 参数 | 效果 |
|---|---|
| 不传 (默认) | DEBUG=ON, 生成带调试信息的 Debug 构建 |
-DDEBUG=OFF |
Release 构建 (-O3 -DNDEBUG) |
-DCMAKE_BUILD_TYPE=<type> |
显式指定构建类型, 以此为准 |
也可以沿用仓库里的脚本 (在源码目录内构建):
sh build.sh # clean + cmake + ninja
sh install.sh # 构建后把 mconf 复制到 /bin, 需要写 /bin 的权限不想自己编译的话, 从 Releases 下载
menuconfig-plusplus-<版本>-linux-x86_64.tar.gz, 解包后即为 mconf 与 conf 两个可执行文件.
mconf test/rootconf
将弹出如下 CLI 界面
无需图形界面时, 可以直接用 conf 做非交互回归:
conf --alldefconfig test/rootconf # 全部符号取默认值, 写出 sdkconfig
conf --allyesconfig test/rootconf # 全部选项取 yconf 的完整模式列表见 conf --help:
| 选项 | 说明 |
|---|---|
--listnewconfig |
列出新增选项 |
--oldaskconfig |
以行式问答方式新建配置 |
--oldconfig |
以已有.config 为基线更新配置 |
--silentoldconfig <file> |
同--oldconfig 但静默, 并把头写入 <file> |
--olddefconfig (--oldnoconfig) |
静默更新, 新符号取默认值 |
--defconfig <file> |
用<file> 中定义的默认值生成新配置 |
--savedefconfig <file> |
把当前配置的最小集保存到<file> |
--allnoconfig |
全部选项取n |
--allyesconfig |
全部选项取y |
--allmodconfig |
全部选项取m |
--alldefconfig |
全部符号取默认值 |
--randconfig |
随机应答所有选项 |
以下是写好的读取宏配置 cmake 配置
# 读取文件内容
file(STRINGS sdkconfig lines NEWLINE_CONSUME)
# message(kconfig=${lines})
message("==========================读取配置文件==========================")
string(REGEX MATCHALL "(CONFIG[a-zA-Z_0-9]+)=([a-zA-Z0-9\"]+)" result ${lines})
message(${result})
message("==========================读取完毕,解析...==========================")
set(MATCHED_LINES "")
set(FLAGS "")
# 迭代处理每一行
foreach(line ${result})
list(APPEND MATCHED_LINES ${line})
# add_compile_definitions(${line})
# string(REGEX MATCH "([a-zA-Z_0-9\"]+)" p ${line})
string(REPLACE "\n" ";" pv ${line})
string(REPLACE "=" ";" pv ${line})
list(GET pv 0 p)
list(GET pv 1 v)
string(COMPARE EQUAL ${v} y equal)
if(${equal})
message(NOTICE ${p} \t\t ==> \t [选项是 y] \t ==> -D${p})
add_compile_definitions(${p})
set(${p} 1)
else()
message(NOTICE ${p} \t\t ==> \t [选项是 ${v}] \t ==> -D${line})
add_compile_definitions(${line})
set(${p} ${v})
endif()
endforeach()
message("==========================配置文件解析完毕==========================").github/workflows/ci.yml: push 到main或提 PR 时, 以 Debug / Release /DEBUG=OFF三组矩阵构建, 并断言生效的构建类型, 再用conf --alldefconfig跑非交互回归.github/workflows/release.yml: 推送v*tag 时构建 Release, 打包二进制与 sha256 校验文件, 创建 GitHub Release.github/workflows/pages.yml: push 到main时把docs/发布到 GitHub Pages
- 配置文件中文展示乱码 —— 已解决 (v0.1.0): 改用宽字符版
ncursesw, 并按显示列宽渲染/居中/截断 - 输入框 (字符串参数、
/搜索、Save as文件名) 支持键入与编辑中文
- 本仓库: LICENSE
- 上游 stand-alone mconf: LICENCE.txt (GPL-2.0+, Copyright © 2014 Andreas Löscher)

