为prj添加kconfig支持

为prj添加kconfig支持

    KConfig是一个配置系统,它允许用户和开发者通过配置文件/配置界面选择需要的编译选项。目前大量的项目都有用到该配置系统(linux、u-boot、rt-thread、esp-idf/adf、zephyr等),可以说是一个项目的构建系统中的不可缺少的重要组成部分。

目录

1 搭建KConfig环境
2 头文件生成脚本-kconfig.py
3 编写Kconfig文件
4 修改Makefile文件
5 关于kconfiglib中menuconfig.py的异常


1 搭建KConfig环境

    KConfig是一个配置描述文件,通常在其对应的配置界面来进行操作配置(当然手动修改也可以,但很麻烦,容易漏)。     要解析该文件还需要有相应的工具,如menuconfig、nconfig、xconfig等,但这里我们选择python的kconfiglib库。

    安装kconfiglib时可以采用如下方式:

     windows环境:
python -m pip install windows-curses
python -m pip install kconfiglib

    linux环境:

sudo apt-get update
sudo apt install python-pip
pip install kconfiglib

    安装完成后通过’menuconfig -h’ 可以验证是否安装成功,安装成功的话会输出类似以下的内容:

usage: menuconfig [-h] [KCONFIG]

Overview
========

A curses-based Python 2/3 menuconfig implementation. The interface should feel
familiar to people used to mconf ('make menuconfig').

Supports the same keys as mconf, and also supports a set of keybindings
inspired by Vi:

  J/K     : Down/Up
  L       : Enter menu/Toggle item
  H       : Leave menu
  Ctrl-D/U: Page Down/Page Up
  G/End   : Jump to end of list
  g/Home  : Jump to beginning of list

[Space] toggles values if possible, and enters menus otherwise. [Enter] works
the other way around.

The mconf feature where pressing a key jumps to a menu entry with that
character in it in the current menu isn't supported. A jump-to feature for
jumping directly to any symbol (including invisible symbols), choice, menu or
comment (as in a Kconfig 'comment "Foo"') is available instead.

2 头文件生成脚本-kconfig.py

    使用Kconfiglib生成的是.config文件,而c代码要使用,必须要提供.h头文件,主要是通过kconfiglib中提供的class Kconfig的write_autoconf方法来操作,但是也需要一个脚本来调用这个库。

    这里做一个相对通用的实现,可以根据传入的Kconfig、.config(保存的配置)、autoconfig.h文件的路径来读取、修改配置;生成相关C语言的位置头文件(autoconfig.h)

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, sys, argparse
from kconfiglib import Kconfig
from menuconfig import menuconfig

def mconf_set_env(args):
    """
    Set Kconfig Env
    """
    os.environ["MENUCONFIG_STYLE"] = "default selection=fg:white,bg:blue"
    os.environ["KCONFIG_CONFIG"] = os.path.join(args.config_out)
    os.environ["KCONFIG_CONFIG_HEADER"] = "# Generated by My Kconfig Demo"
    os.environ["KCONFIG_AUTOHEADER"] = os.path.join(args.c_config_header_file_out)

    os.environ["CONFIG_"] = ""

def mconfig(argv):
    args = parse_args()
    mconf_set_env(args)
    kconf = Kconfig(args.kconfig_file)

    menuconfig(kconf)
    kconf.write_autoconf()

def parse_args():
    parser = argparse.ArgumentParser()

    parser.add_argument("--handwritten-input-configs",
                        action="store_true",
                        help="Assume the input configuration fragments are "
                             "handwritten fragments and do additional checks "
                             "on them, like no promptless symbols being "
                             "assigned")
    parser.add_argument("kconfig_file",
                        help="witch Kconfig file use")
    parser.add_argument("config_out",
                        help="Output configuration file")
    parser.add_argument("c_config_header_file_out",
                        help="Output c config header file")

    return parser.parse_args()

if __name__ == "__main__":
    mconfig(sys.argv)

    使用该脚本的命令格式为:

[python   kconfig.py   $path/kconfig_file   $path/config_out   $path/c_config_header_file_out]

python kconfig.py $path/Kconfig $path/.config $path/autoconfig.h

3 编写Kconfig文件

    Kconfig是一个文件也是一种语言,其中的表达的是配置项的内容以及配置项之间的关系。而kconfiglib就是一个用于解析并向用户显示Kconfig文件的一个工具组件。

    Kconfig的一些参考资料:
        linux: Kconfig Language — The Linux Kernel documentation
        zephyr: Configuration System (Kconfig) — Zephyr Project Documentation
        博主fluidog的博文: Kconfig语法

        简书上的文章: kconfig语法整理

    以下是一个包含常规Kconfig使用的示例:

menu "Example Configuration Menu"

config EXAMPLE_BOOL
    bool "Example boolean option"
    default n
    help
        This is an example of a boolean option. It can be either 'y' (yes) or 'n' (no).

config EXAMPLE_TRISTATE
    tristate "Example tristate option"
    default m
    help
        This is an example of a tristate option. It can be 'y' (built-in), 'm' (module), or 'n' (disabled).

config EXAMPLE_INT
    int "Example integer option"
    default 10
    help
        This is an example of an integer option. You can enter any integer value.

config EXAMPLE_STRING
    string "Example string option"
    default "Hello, world!"
    help
        This is an example of a string option. You can enter any string value.

config EXAMPLE_HEX
    hex "Example hexadecimal option"
    default 0x10
    help
        This is an example of a hexadecimal option. You can enter any hexadecimal value.

config EXAMPLE_CHOICE
    choice "Example choice option"
    default EXAMPLE_CHOICE_OPTION_1
    help
        This is an example of a choice option. You can choose one of the following options.

    config EXAMPLE_CHOICE_OPTION_1
        bool "Choice Option 1"

    config EXAMPLE_CHOICE_OPTION_2
        bool "Choice Option 2"

    endchoice

endmenu

    在这个示例中,定义了一个名为 “Example Configuration Menu” 的菜单,其中包含多种类型的配置项,包括布尔值、三态值、整数、字符串、十六进制和选择项。每个配置项都有一个默认值和一个帮助文本,帮助文本用于解释该配置项的用途。


4 修改Makefile文件

    在完成了上述不走后,还需要在Makefile中将kconfig.py脚本进行调用,常规的会在Makefile中添加一个menuconfig的目标(或者通过.sh脚本文件来直接调用)。
.PHONY = all clean menuconfig

ROOT = $(PWD)

all: main.o autoconfig.h
	gcc main.o -o main

main.o: main.c
	gcc main.c -c -o main.o

clean:
	rm main.o main

menuconfig:
	python kconfig.py $(ROOT)/Kconfig $(ROOT)/.config $(ROOT)/autoconfig.h


5 关于kconfiglib中menuconfig.py的异常

    在写这篇博文时,笔者使用的是 kconfiglib 14.1.0,过程中遇到了一个神奇的现象,在对整形值进行配置的时候,会提示 ' is a malformed int value'(如果填入新配置时输入了退格键删除旧的配置参数)。


    字符串转整形莫名奇妙的抛异常,也是神奇。只能选择直接将旧的值不显示了,让用户输入新值(不再输入退格按键)。期待后续有大佬能够解惑,目前只能说能用即可了

    具体为改动kconfiglib中menuconfig.py文件中的_change_node函数的实现。

def _change_node(node):
#...... 此处省略部分
        while True:
            s = _input_dialog(
                "{} ({})".format(node.prompt[0], TYPE_TO_STR[sc.orig_type]),
                s, _range_info(sc))
def _change_node(node):
#...... 此处省略部分
        while True:
            s = _input_dialog(
                "{} ({})".format(node.prompt[0], TYPE_TO_STR[sc.orig_type]),
                "", _range_info(sc))

    修改_input_dialog调用的传入参数,不再传入原始的配置值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录阅读笔记-字符串【实现 strStr()】

题目 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack "hello", needle "ll" 输出:…

可应用于工业控制器,新能源充电桩等众多涉及RS232通讯的产品的国产芯片——D3232,性价比高,交货周期短

D3232芯片主要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品。 二、基本特性 D3232芯片由两个线路驱动器、两个线路接收器和双电荷泵电路组成,具有HBM>15kV、CDM>2kV的ESD保护能力,并且接收端输入电压…

javaweb遇到的servlet问题,jar包问题

有时候会遇到这种问题,有的地方会报红 这是因为这个找不到这个包,这个项目缺少jar包 在tomcat9之前还不是Jakarta这个名字,我的运行环境与服务器是jdk17与tomcat10 解决方法: 在项目结构中,找到模块,再…

HTTP Error 400. The request hostname is invalid.

异常信息 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Bad Request</TITLE> <META HTTP-EQUIV"Content-Type" Content"text/html;…

数据库系统概论-第15章 内存数据库管理系统

用内存的数据库&#xff0c;场景接触较少&#xff0c;不细看。 15.1 概述 15.2 内存数据库的发展历程 15.3 内存数据库的特性 15.4 内存数据库的关键技术 15.5 小结

实测国内AI大模型问答效果

随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型。按照github工程awesome-LLMs-In-China所列举的&#xff0c;现如今国内AI大模型已达243个&#xff0c;比较著名的有文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效。下…

深度学习-2.9梯度不稳定和Glorot条件

梯度不稳定和Glorot条件 一、梯度消失和梯度爆炸 对于神经网络这个复杂系统来说&#xff0c;在模型训练过程中&#xff0c;一个最基础、同时也最常见的问题&#xff0c;就是梯度消失和梯度爆炸。 我们知道&#xff0c;神经网络在进行反向传播的过程中&#xff0c;各参数层的梯…

工大智信智能听诊智慧医疗的创新

智能听诊器&#xff0c;智慧医疗的新突破 工大智信智能听诊器是一款结合了先进技术和医疗专业知识的创新产品。它以其独特的优势&#xff0c;为医疗行业带来了前所未有的突破和变革。 传统听诊器依赖于医生的主观判断和经验&#xff0c;而工大智信智能听诊器采用了先进的传感技…

颠覆传统编程:Codigger极致体验之旅

在数字化浪潮汹涌的当下&#xff0c;编程已成为推动科技发展的重要引擎。而在这其中&#xff0c;极致编程体验无疑是每位开发者所追求的目标。它不仅代表着工具的高效能与稳定性&#xff0c;更映射出开发者在编程世界中的自由与创造力。Codigger&#xff0c;以其领先的开发框架…

LeetCode---388周赛

题目列表 3074. 重新分装苹果 3075. 幸福值最大化的选择方案 3076. 数组中的最短非公共子字符串 3077. K 个不相交子数组的最大能量值 一、重新分装苹果 注意题目中说同一个包裹中的苹果可以分装&#xff0c;那么我们只要关心苹果的总量即可&#xff0c;在根据贪心&#x…

【Linux Day16 I/O复用】

I/O复用 用途&#xff1a;I/O 复用能同时监听多个文件描述符。 I/O 复用虽然能同时监听多个文件描述符&#xff0c;但它本身是阻塞的。并且当多个文件描述符同时就绪时&#xff0c;如果不采取额外的措施&#xff0c;程序就只能按顺序依处理其中的每一个文件描述符&#xff0c;…

一些刷题需要用的大数据

无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负。 如果需声明无符号类型的话就需要在类型前加上unsigned。 整型的每一种都分为&#xff1a;无符号&#xff08;unsigned&#xff09;和有符号&#xff08;signed&#xff09;两种类型&#xff08;f…

8.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好&#xff0c;我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解&#xff01;&#x1f600…

提升企业内训效率:定制化企业培训APP开发教学

当下&#xff0c;定制化企业培训APP的开发成为提升企业内训效率的重要途径之一。接下来小编将深入讲解如何通过定制化企业培训APP来提升内训效率&#xff0c;并提供相关开发教学。 一、定制的重要性 灵活、便捷&#xff1a;定制化企业培训APP则能够使培训内容随时随地可用&…

Java代码基础算法练习-求给定3个数, 进行从小到大排序-2024.03.20

任务描述&#xff1a; 输入三个整数 x,y,z(0<x<1000&#xff0c;0<y<1000&#xff0c;0<z<1000)&#xff0c;请把这三个数由小到大输出。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m24…

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

面向低成本线跟随机器人的PID控制器优化——文末源码

目录 介绍 测试 电子元器件 系统特征 控制器设计 位置误差的计算 比例控制 积分控制 微分控制 改进的PID控制器 测试轨迹 源码链接 本文对经典PID控制器的改进和开环控制机制的发展进行了讨论&#xff0c;以提高差动轮式机器人的稳定性和鲁棒性。为了部署该算法&am…

5G里面NR,gNB,en-gNB,ng-eNB是什么意思

不得不提一个国际组织&#xff0c;叫国际电信联盟(ITU, International Telecommunication Union)&#xff0c;简称国际电联。我们先看看国际电联的自我介绍&#xff1a; 国际电信联盟 『国际电联 (国际电信联盟) 是主管信息通信技术事务&#xff08;ICT&#xff09;的联合国机…

26-分支和循环语句_循环练习(上)

写代码的思路&#xff1a; 办法&#xff08;编程思维&#xff09;写代码&#xff08;按照语法形式写&#xff09; 编程思维&#xff1a;需要慢慢训练 1、计算n的阶乘 代码1&#xff1a; int main(){int i 1;int n 0;scanf("%d", &n);int ret 1;do{retret…

MyBatis核心配置文件:解锁数据之美的密码

MyBatis&#xff0c;这位编程的诗人&#xff0c;通过其独特的核心配置文件&#xff0c;为我们描绘出一幅数据之美的画卷。本篇博客将带你深入探讨MyBatis核心配置文件的奥秘&#xff0c;让你能够更好地理解和运用这个优雅的数据持久化框架。 最近想搞私域&#xff0c;欢迎各位…