为prj添加kconfig支持

2024-03-20 21:36
文章标签 支持 kconfig prj

本文主要是介绍为prj添加kconfig支持,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为prj添加kconfig支持

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

目录

1 搭建KConfig环境
2 头文件生成脚本-kconfig.py
3 编写Kconfig文件
4 修改Makefile文件


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/UpL       : Enter menu/Toggle itemH       : Leave menuCtrl-D/U: Page Down/Page UpG/End   : Jump to end of listg/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 menuconfigdef 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_BOOLbool "Example boolean option"default nhelpThis is an example of a boolean option. It can be either 'y' (yes) or 'n' (no).config EXAMPLE_TRISTATEtristate "Example tristate option"default mhelpThis is an example of a tristate option. It can be 'y' (built-in), 'm' (module), or 'n' (disabled).config EXAMPLE_INTint "Example integer option"default 10helpThis is an example of an integer option. You can enter any integer value.config EXAMPLE_STRINGstring "Example string option"default "Hello, world!"helpThis is an example of a string option. You can enter any string value.config EXAMPLE_HEXhex "Example hexadecimal option"default 0x10helpThis is an example of a hexadecimal option. You can enter any hexadecimal value.config EXAMPLE_CHOICEchoice "Example choice option"default EXAMPLE_CHOICE_OPTION_1helpThis is an example of a choice option. You can choose one of the following options.config EXAMPLE_CHOICE_OPTION_1bool "Choice Option 1"config EXAMPLE_CHOICE_OPTION_2bool "Choice Option 2"endchoiceendmenu

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


4 修改Makefile文件

在完成了上述不走后,还需要在Makefile中将kconfig.py脚本进行调用,常规的会在Makefile中添加一个menuconfig的目标(或者通过.sh脚本文件来直接调用)。
.PHONY = all clean menuconfigROOT = $(PWD)all: main.o autoconfig.hgcc main.o -o mainmain.o: main.cgcc main.c -c -o main.oclean:rm main.o mainmenuconfig:python kconfig.py $(ROOT)/Kconfig $(ROOT)/.config $(ROOT)/autoconfig.h

这篇关于为prj添加kconfig支持的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830800

相关文章

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

Nacos Config 配置中心支持配置共享

文章目录 一、什么是配置中心二、Nacos Config2.1 Nacos Config 工作原理 (★)2.2 Nacos Config 的使用2.3 动态刷新2.4 配置共享2.4.1 同一个微服务的不同环境之间共享配置2.4.2 不同微服务中间共享配置 一、什么是配置中心 微服务架构下关于配置文件的存在以下问题: 配置文件相对分散。在一个微服务架构下,配置文件会随

spring笔记 多线程的支持

spring的工作机制 136  属性编辑器 140 spring事件的体系结构 168 Bean间的关系 109 继承 依赖 引用     Bean的继承          1 为了简化初始化的属性注入;          2 子Bean和父Bean相同的属性值,使用子Bean的     Bean的依赖 Srping控制相互依赖的Bean之间,属性注入的顺序,防止出错  depend-on

PageOfficeCtrl支持直接打开服务器磁盘文件

一般来说,PageOfficeCtrl控件的WebOpen方法的第一个参数是待打开文档的URL,此URL可以是相对于当前页面的相对URL,也可以是相对于整个网站根的相对URL,还可以是http开头的完整URL,但是这个URL必须是当前网站的URL,不能跨域。 现在为了更加方便开发者编程,WebOpen支持打开服务器磁盘文件。也就是说,第一个参数可以写成服务器文件的绝对磁盘路径。例如: P

Jasperreports+jaspersoft studio 实现支持富文本格式的数据

昨天有位博友给我发邮件问我:Jasperreports+jaspersoft studio 如何实现支持富文本格式的数据! 其实,我也是第一次遇到这个问题;我就百度搜索,我记得之前:我解决过用百度编辑器,解析富文本格式的数据,是设置一个属性; 最后,只百度到一篇文章;https://zhidao.baidu.com/question/1430121390482093659.html 废话不多