menuconfig+Kconfig的简单配置

目录

1.背景

2.管理方案

2.1:.h中直接定义

2.2:.bat+Cmake

2.3:Kconfig

2.3.1 环境安装

2.3.2 代码

2.3.2.1 目录结构

2.3.2.2 ble目录下的Kconfig

2.3.2.3 hardware目录下的Kconfig

2.3.2.4 rtos目录下的Kconfig

2.3.2.5 根目录

2.3.3 执行脚本


1.背景

        在实际项目开发中,通常会有需要去使能/关闭一些代码模块或者修改一些配置参数,最简单的是直接在C中定义一个宏,定义了就把该功能模块进行编译,还可以使用bat+Cmake进行宏的管理,为什么突然想到使用Kconfig进行模块的管控呢,想起之前在团队很多人的时候,就是使用这个进行模块管理的,每个人负责的模块不同,负责人编译对应.config文件并进行提交即可,其他人可以使用GUI界面很直观的进行模块的裁剪。无论是使用最直接的在C文件中定义宏,还是使用bat脚本,一个需要修改C文件,一个bat得带不同的参数,成本上有提高。综合以上所以就使用Kconfig进行管控,方便后续的管理。

2.管理方案

2.1:.h中直接定义

        在module_enable_config.h文件中定义宏,配置值为1或者0。

/**module_enable_config.h*/#ifndef __MODULE_ENABLE_CONFIG_H__
#define __MODULE_ENABLE_CONFIG_H__#define NOTIFY_UI_ENABLE   (1)    //1:enable notification UI 0:disenable#endif

        在main中进行代码宏控制。

/**main.c*/#include "module_enable_config.h"void main(void)
{
#if defined(NOTIFY_UI_ENABLE) && NOTIFY_UI_ENABLE == 1//enable notification UI
#else//disenable
#endif
}

        优点:直白一目了然,打开module_enable_config.h文件修改重新编译即可

        缺点:每次需要使能或者关闭通知功能的时候都需要打开module_enable_config.h文件进行修改,修改完成然后再使用IDE(脚本)进行编译,这样比较麻烦。

2.2:.bat+Cmake

        bat脚本:

@echo off
@echo "build current dir %cd%"@echo "######################################"
@echo cmake build
@echo "######################################"set "notify_ui=disenable"
REM Get the version number of the tagfor %%a in (%args%) do (if "%%a" == "-notify" (set "notify_ui=enable"echo "enable notify ui")
)cmake -S . -B build ^
-D NOTIFY_UI="%notify_ui%" -G Ninja@echo "######################################"
@echo ninja build
@echo "######################################"ninja -C build

        CMakeLists.txt:文件


if(${NOTIFY_UI} STREQUAL "enable")set(NOTIFY_UI_ENABLE 1)
else()set(NOTIFY_UI_ENABLE 0)
endif()::依赖mg_board.h.in:文件
configure_file(mg_board.h.in ${PROJECT_SOURCE_DIR}/XXX/mg_board.h)file(GLOB BOARD_APP_SRC${BOARD_APP_DIRS}/XXXX.c
)############ EXPORT  ###########
set(APP_INC ${APP_INC} ${BOARD_APP_INC} CACHE STRING "" FORCE)
set(APP_SRC ${APP_SRC} ${BOARD_APP_SRC} CACHE STRING "" FORCE)

        mg_board.h.in:文件(Cmake依赖这个文件)

#cmakedefine NOTIFY_UI_ENABLE@NOTIFY_UI_ENABLE@

        自动生成的mg_board.h文件

#define NOTIFY_UI_ENABLE 1            //编译脚本带了-notify参数
/* #undef NOTIFY_UI_ENABLE */         //编译脚本没有带-notify参数(或者 NOTIFY_UI_ENABLE 设置的值为0的时候)

        终端中执行脚本进行编译:./xx.bat -notify     既可以使能 NOTIFY_UI_ENABLE 

        优点:不用自己打开.h文件对宏进行修改,可以自动生成。只要脚本带对应的参数既可。

        缺点:如果需要使能的参数个数很多的时候,脚本后面就会带很多的参数,管理起来就不怎么方便了。

        使用该功能的时候,工程的配置管理得使用Cmake,还得自己编译bat脚本。上诉的bat脚本跟 CMakeLists.txt:文件的例子都是举个例子,并不能直接编译,只是提供一个思路。

2.3:Kconfig

2.3.1 环境安装

        安装python后,然后通过py再安装一下两个模块

python -m pip install windows-curses
python -m pip install kconfiglib

2.3.2 代码

2.3.2.1 目录结构

图2.3.2.1.1 

|-->ble
|	|-Kconfig
|
|-->hardware
|	|-Kconfig
|
|-->rtos
|	|-Kconfig
|
|-->scripts
|
|->-ui
|	|-Kconfig
|
|-->.config(自动生成)
|-->genconfig.py(执行脚本)
|-->Kconfig
|-->Kconfig.Mozart
|-->mozart_config.h(自动生成)
2.3.2.2 ble目录下的Kconfig

Kconfig:

choice MOZART_BLE_SDK_CONFIGURATIONprompt "Ble System"default 1565_SDK_ENABLEconfig 1565_SDK_ENABLEbool "1565 SDK"helpSelect 1565 SDKchoice 1565_VERSIONprompt "1565 version"default 1565_VERSION_3_1depends on 1565_SDK_ENABLEconfig 1565_VERSION_3_1bool "3.1"helpSelect 1565 version 3.1config 1565_VERSION_3_9bool "3.9"helpSelect 1565 version 3.9endchoiceconfig OTHER_BLE_SDK_ENABLEbool "Other Ble Sdk"helpSelect Other Ble Sdk
endchoice
2.3.2.3 hardware目录下的Kconfig

Kconfig:

choice MOZART_HARDWARE_CONFIGURATIONprompt "Hardware Configuration"default 1005_ENABLEconfig 1005_ENABLEbool "1005"help1006的硬件描述config 1006_ENABLEbool "1006"help1006的硬件描述endchoice
2.3.2.4 rtos目录下的Kconfig

Kconfig:

#menu "Kernel Selection"choice MOZART_KERNEL_CONFIGURATIONprompt "kernel System"default FREE_RTOS_ENABLEconfig FREE_RTOS_ENABLEbool "free_rtos"helpfree_rtos系统描述.config THREADX_ENABLEbool "threadx"helpthreadx系统描述.endchoice#endmenu
2.3.2.5 根目录

genconfig.py(这个脚本在安装py的时候就有了,找到安装路径找里面的genconfig.py,也可以)

#!/usr/bin/env python3# Copyright (c) 2018-2019, Ulf Magnusson
# SPDX-License-Identifier: ISC"""
Generates a header file with #defines from the configuration, matching the
format of include/generated/autoconf.h in the Linux kernel.Optionally, also writes the configuration output as a .config file. See
--config-out.The --sync-deps, --file-list, and --env-list options generate information that
can be used to avoid needless rebuilds/reconfigurations.Before writing a header or configuration file, Kconfiglib compares the old
contents of the file against the new contents. If there's no change, the write
is skipped. This avoids updating file metadata like the modification time, and
might save work depending on your build setup.By default, the configuration is generated from '.config'. A different
configuration file can be passed in the KCONFIG_CONFIG environment variable.A custom header string can be inserted at the beginning of generated
configuration and header files by setting the KCONFIG_CONFIG_HEADER and
KCONFIG_AUTOHEADER_HEADER environment variables, respectively (this also works
for other scripts). The string is not automatically made a comment (this is by
design, to allow anything to be added), and no trailing newline is added, so
add '/* */', '#', and newlines as appropriate.See https://www.gnu.org/software/make/manual/make.html#Multi_002dLine for a
handy way to define multi-line variables in makefiles, for use with custom
headers. Remember to export the variable to the environment.
"""
import argparse
import os
import sysimport kconfiglibDEFAULT_SYNC_DEPS_PATH = "deps/"def main():parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,description=__doc__)parser.add_argument("--header-path",metavar="HEADER_FILE",help="""
Path to write the generated header file to. If not specified, the path in the
environment variable KCONFIG_AUTOHEADER is used if it is set, and 'config.h'
otherwise.
""")parser.add_argument("--config-out",metavar="CONFIG_FILE",help="""
Write the configuration to CONFIG_FILE. This is useful if you include .config
files in Makefiles, as the generated configuration file will be a full .config
file even if .config is outdated. The generated configuration matches what
olddefconfig would produce. If you use sync-deps, you can include
deps/auto.conf instead. --config-out is meant for cases where incremental build
information isn't needed.
""")parser.add_argument("--sync-deps",metavar="OUTPUT_DIR",nargs="?",const=DEFAULT_SYNC_DEPS_PATH,help="""
Enable generation of symbol dependency information for incremental builds,
optionally specifying the output directory (default: {}). See the docstring of
Kconfig.sync_deps() in Kconfiglib for more information.
""".format(DEFAULT_SYNC_DEPS_PATH))parser.add_argument("--file-list",metavar="OUTPUT_FILE",help="""
Write a list of all Kconfig files to OUTPUT_FILE, with one file per line. The
paths are relative to $srctree (or to the current directory if $srctree is
unset). Files appear in the order they're 'source'd.
""")parser.add_argument("--env-list",metavar="OUTPUT_FILE",help="""
Write a list of all environment variables referenced in Kconfig files to
OUTPUT_FILE, with one variable per line. Each line has the format NAME=VALUE.
Only environment variables referenced with the preprocessor $(VAR) syntax are
included, and not variables referenced with the older $VAR syntax (which is
only supported for backwards compatibility).
""")parser.add_argument("kconfig",metavar="KCONFIG",nargs="?",default="Kconfig",help="Top-level Kconfig file (default: Kconfig)")args = parser.parse_args()kconf = kconfiglib.Kconfig(args.kconfig, suppress_traceback=True)kconf.load_config()if args.header_path is None:if "KCONFIG_AUTOHEADER" in os.environ:kconf.write_autoconf()else:# Kconfiglib defaults to include/generated/autoconf.h to be# compatible with the C tools. 'config.h' is used here instead for# backwards compatibility. It's probably a saner default for tools# as well.kconf.write_autoconf("mozart_config.h")else:kconf.write_autoconf(args.header_path)if args.config_out is not None:kconf.write_config(args.config_out, save_old=False)if args.sync_deps is not None:kconf.sync_deps(args.sync_deps)if args.file_list is not None:with _open_write(args.file_list) as f:for path in kconf.kconfig_filenames:f.write(path + "\n")if args.env_list is not None:with _open_write(args.env_list) as f:for env_var in kconf.env_vars:f.write("{}={}\n".format(env_var, os.environ[env_var]))def _open_write(path):# Python 2/3 compatibility. io.open() is available on both, but makes# write() expect 'unicode' strings on Python 2.if sys.version_info[0] < 3:return open(path, "w")return open(path, "w", encoding="utf-8")if __name__ == "__main__":main()

Kconfig:

mainmenu "Mozart Configuration"source "Kconfig.Mozart"

Kconfig.Mozart

menu "Software Configuration"source "ui/Kconfig"source "rtos/Kconfig"source "ble/Kconfig"
endmenumenu "hardware Configuration"source "hardware/Kconfig"
endmenu

2.3.3 执行脚本

        在powershell窗口下执行menuconfig,配置好自己想要的配置。

图2.3.3.1

        配置完之后就会自动生成.config文件;然后再执行genconfig.py脚本,就会自动生成C中可以用的.h文件了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

申请专利需要准备哪些材料?

申请专利需要准备哪些材料&#xff1f;

实践致知第17享:电脑忽然黑屏的常见原因及处理方法

一、背景需求 小姑电话说&#xff1a;最近&#xff0c;电脑忽然就黑屏了&#xff08;如下图所示&#xff09;&#xff0c;但是等待几十秒甚至一分钟&#xff0c;电脑就能自然恢复了&#xff0c;这种状况一天能出现三四次&#xff0c;怎么办&#xff1f; 二、分析诊断 电脑黑屏…

keeplive配置详解与haproxy配置详解

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构&#xff0c;只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18&#xff0c;根据组播地址进行通信&#xff0c;主备之间发…

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介&#xff1a; 二.定时器的构造方法与常见方法&#xff1a; 三.定时器的模拟实现&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 在开发中&#xff0c;我们经常需要一些周期性的操作&#xff0c;例如每隔几分钟就进行某一项操作&#xff0c;这…

标准IO——文件定位、文件IO

续&#xff1a;feof、ferror&#xff08;检测一个流是否出错&#xff09;、clearerr&#xff08;清除一个流出错的标记&#xff09;。 一、标准IO文件定位 1、fseek(定位&#xff09; int fseek(FILE *stream , long offset(偏移长度) , int whence(偏移起始位置)) 其中when…

阿里云SMS服务C++ SDK编译及调试关键点记录

一. 阿里云SMS服务开通及准备工作 在阿里云官网上完成这部分的工作 1. 申请资质 个人or企业 我这里是用的企业资质 2. 申请签名 企业资质认证成功后&#xff0c;会自动赠送一个用于测试的短信签名 也可以自己再进行申请&#xff0c;需要等待审核。 3. 申请短信模板 企…

还没用过OBS Studio?快来提升你的技术分享效率!

前言 在浩瀚的数字海洋中&#xff0c;有这么一款神器&#xff0c;它低调却光芒四射&#xff0c;默默改变着无数内容创作者的命运&#xff1b;嘿&#xff0c;你猜怎么着&#xff1f;它既不是天价的专业设备&#xff0c;也不是遥不可及的神秘黑科技&#xff0c;而是开源世界的瑰宝…

本地Gitlab-runner自动编译BES项目

0 Preface/Foreword 1 Gitlab-runner配置情况 具体情况如下&#xff1a; Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户&#xff0c;名为gitlab-runner 2 自动编译 2.1 找不到编译工具链 根据错误提示&#xff0c;交叉编译工具链未找…

深入理解接口测试:实用指南与最佳实践(四)IHRM管理系统实战-项目分析

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 这一阶段是接口测试的学习&#xff0c;我们接下来的讲解都是使用Postman这款工具&#xff0c;当然呢Postman是现在一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用…

牛!手机上轻松部署大模型全攻略!

当前AI革命中&#xff0c;大模型发挥关键角色&#xff0c;其理论基础在于Scaling Law。简单来说就是&#xff0c;随着数据、参数和计算能力的提升&#xff0c;模型能力增强&#xff0c;展现出小规模模型所不具备的“涌现能力”。众多AI企业推出开源大模型&#xff0c;规模按扩展…

红黑树的概念和模拟实现[C++]

文章目录 红黑树的概念一、红黑树的性质红黑树原理二、红黑树的优势和比较 红黑树的模拟实现构建红黑树的数据结构定义节点的基本结构和初始化方式插入新节点插入新节点的颜色调整颜色和结构以满足红黑树性质 红黑树的应用场景 红黑树的概念 一、红黑树的性质 红黑树是一种自平…

Redis系列之Redis Sentinel

概述 Redis主从集群&#xff0c;一主多从模式&#xff0c;包括一个Master节点和多个Slave节点。Master负责数据的读写&#xff0c;Slave节点负责数据的查询。Master上收到的数据变更&#xff0c;会同步到Slave节点上实现数据的同步。通过这种架构实现可以Redis的读写分离&…

工具|阅读PDF时鼠标显示为小手中有向下箭头解决方法

由于工作中&#xff0c;会大量阅读PDF文档&#xff0c;如手册&#xff0c;规格书&#xff0c;各种图纸等&#xff0c;因此好用的PDF工具必不可少。我主要习惯用福昕阅读器&#xff0c;标注比较方便。 所以&#xff0c;本文主要以福昕阅读器为主&#xff0c;当然也适用于其他的阅…

Docker Volume(存储卷)

一、认识 1.1 概念 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这意味着&#xff0c;在容器中的这个目录下写入数据时&#xff0c;容器会将内容直接写入到宿主机上与此容器建立了绑定关系的目录 在宿主机上的这个…

实验8-1-6 在数组中查找指定元素

本题要求实现一个在数组中查找指定元素的简单函数。 函数接口定义&#xff1a; int search( int list[], int n, int x );其中list[]是用户传入的数组&#xff1b;n&#xff08;≥0&#xff09;是list[]中元素的个数&#xff1b;x是待查找的元素。如果找到 则函数search返回…

基于Golang实现Kubernetes边车模式

本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式&#xff0c;并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go[1] 在这篇文章中&#xff0c;我们会介绍 Sidecar 模式…

软件测试学习笔记

测试学习 1. 测试流程2. Bug的提出什么是bugbug 的描述bug 级别 3. 测试用例的设计什么是测试用例测试用例应如何设计基于需求的设计方法等价类边界值场景法正交表法判定表法错误猜测法 4. 自动化测试回归测试自动化分类 5. 安装 webdriver-manager 和 selenium第一个web自动化…

链表List

简介 STL中的List与顺序表vector类似&#xff0c;同样是一种序列式容器&#xff0c;其原型是带头节点的双向循环链表。 List的使用 list中的接口比较多&#xff0c;此处类似&#xff0c;只需要掌握如何正确的使用&#xff0c;然后再去深入研究背后的原理&#xff0c;已达到可…

基于R语言生物信息学大数据分析与绘图

随着高通量测序以及生物信息学的发展&#xff0c;R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才&#xff0c;除了掌握对生物大数据挖掘与分析技能之外&#xff0c;还要具备一定的统计分析能力与SCI论…

CSDN 僵尸粉 机器人

CSDN 僵尸粉 机器人 1. 前言 不知道什么时候开始每天创作2篇就有1500流量爆光&#xff0c;每次都能收获一些关注和收藏&#xff0c;感觉还是挻开心的感觉CSDN人气还是挻可以的以前各把月一个收藏和关注都没有写的动力了。 2. 正文 后面又连接做了2天的每日创建2篇任务&…