menuconfig+Kconfig的简单配置

news2025/1/14 1:22:28

目录

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 tag

for %%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_CONFIGURATION
    prompt "Ble System"
    default 1565_SDK_ENABLE

    config 1565_SDK_ENABLE
        bool "1565 SDK"
        help
            Select 1565 SDK

    choice 1565_VERSION
        prompt "1565 version"
        default 1565_VERSION_3_1
        depends on 1565_SDK_ENABLE

        config 1565_VERSION_3_1
            bool "3.1"
            help
                Select 1565 version 3.1

        config 1565_VERSION_3_9
            bool "3.9"
            help
                Select 1565 version 3.9
    endchoice

    config OTHER_BLE_SDK_ENABLE
        bool "Other Ble Sdk"
        help
            Select Other Ble Sdk
endchoice
2.3.2.3 hardware目录下的Kconfig

Kconfig:

choice MOZART_HARDWARE_CONFIGURATION
    prompt "Hardware Configuration"
    default 1005_ENABLE

config 1005_ENABLE
    bool "1005"
    help
        1006的硬件描述

config 1006_ENABLE
    bool "1006"
    help
        1006的硬件描述

endchoice
2.3.2.4 rtos目录下的Kconfig

Kconfig:

#menu "Kernel Selection"

choice MOZART_KERNEL_CONFIGURATION
    prompt "kernel System"
    default FREE_RTOS_ENABLE

config FREE_RTOS_ENABLE
    bool "free_rtos"
    help
        free_rtos系统描述.

config THREADX_ENABLE
    bool "threadx"
    help
        threadx系统描述.

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 sys

import kconfiglib


DEFAULT_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"
endmenu

menu "hardware Configuration"
    source "hardware/Kconfig"
endmenu

2.3.3 执行脚本

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

图2.3.3.1

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【性能】console.log引起内存泄漏

如下代码中的console.log会引起内存泄漏 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Example<…

降级、熔断、限流学习笔记

1. 面对高流量出现故障的原因 由于依赖的资源或者服务不可用&#xff0c;最终导致整体服务宕机。在电商系统中就可能由于数据库访问缓慢&#xff0c;导致整体服务不可用。 乐观地预估了可能到来的流量&#xff0c;当有超过系统承载能力的流量到来时&#xff0c;系统不堪重负&a…

Vue.js 3.x 必修课|008|计算属性:提高代码服用性和可维护性

欢迎关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 欢迎订阅《Vue 3.x 必修课| 2024》:http://t.csdnimg.cn/hHRrM 精品内容,物超所值,一杯咖啡的价格(9.9 元)只为持续创作提供动力。 在 …

【AI】人工智能时代,程序员如何保持核心竞争力?

目录 程序员在AI时代的应对策略1. 引言2. AI在编程领域的影响2.1 AI辅助编程工具的现状2.2 AI对编程工作的影响2.3 程序员的机遇与挑战 3. 深耕细作&#xff1a;专注领域的深度学习3.1 专注领域的重要性3.2 深度学习的策略3.2.1 选择合适的领域3.2.2 持续学习和研究3.2.3 实践与…

【PXE+kickstart】linux网络服务之自动装机

PXE&#xff1a; 简介&#xff1a;PXE(Preboot execute environment 是一种能够让计算机通过网络启动的引导方式&#xff0c;只要网卡支持PXE协议即可使用Kickstart 是一种无人值守的安装方式&#xff0c;工作原理就是预先把原本需要运维人员手工填写的参数保存成一个 ks.cfg 文…

centos7安装 ES集群 elasticsearch

这里写自定义目录标题 编写启动脚本 elasticsearch.sh启动可能报错&#xff1a;elasticsearch 7.10启动报错 bootstrap checks failed解决方法问题原因&#xff1a;注意 退出xshell&#xff0c;重新登录&#xff1a; 上面两个配置项改完后&#xff0c;ES启动用户(es 或root) **…

Debian | 更换 Gnome 至 Xfce4

Debian | 更换 Gnome 至 Xfce4 更新源 sudo apt update && sudo apt upgrade安装 xfce4 sudo apt install xfce4我选择 lightdm&#xff0c;回车 切换桌面 sudo update-alternatives --config x-session-manager输入 xfce 所在序号&#xff0c;我这里是 3 卸载 …

洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(c++)

describe 蜗牛在制定今天的旅游计划&#xff0c;有 n 个景点可选&#xff0c;它已经把这些景点按照顺路游览的顺序排 成一排了&#xff0c;每个地方有相应的景观&#xff0c;这里用一个整数表示。 蜗牛希望选取连续的一段景点&#xff0c;还要选出来的每一个景点的景观都不同…

ASP.NET Core基础 - 简介

目录 一. 简介 A、跨平台性 B、高性能 C、开源性 D、模块化与可扩展性 E、集成现代前端技术 二. ASP.NET 4.x 和 ASP.NET Core 比较 A、架构与平台支持 B、性能 C、开发体验 D、社区支持与生态系统 三. NET 与 .NET Framework 比较 A、概念范围 B、跨平台能力 C…

文献综述如何有助于识别研究中的关键变量和概念

VersaBot文献综述助手 进行良好的文献综述对于从多个方面确定研究的关键变量和概念起着至关重要的作用&#xff1b; 1.揭示相关领域和理论&#xff1a; 通过沉浸在现有的学术研究中&#xff0c;你会遇到围绕你的主题的各种理论和概念。这些可以作为识别与您的研究问题相关的潜…

天和环保业绩波动性明显,应收账款逾期率和回款率欠佳

《港湾商业观察》施子夫 7月17日&#xff0c;北交所网站更新唐山天和环保科技股份有限公司&#xff08;以下简称&#xff0c;天和环保&#xff09;及保荐机构江海证券关于第三轮审核问询函的回复。 公开信息显示&#xff0c;2023年6月&#xff0c;天和环保的IPO申请获受理。今…

Linux IPC解析:匿名命名管道与共享内存

目录 一.IPC机制介绍二.匿名与命名管道1.匿名管道2.命名管道3.日志 三.共享内存三.System V 标准1.System V简介2.IPC在内核的数据结构设计3.信号量 一.IPC机制介绍 IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;是计算机系统中不同进程之间交…

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

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

低功耗工业控制器用于风电场绿色可持续能源行业

全球对清洁能源的需求不断增长&#xff0c;风电场作为一种可再生能源的重要来源&#xff0c;正经历着快速发展。然而&#xff0c;传统的风电场管理和运营方式存在着效率低下、维护成本高等问题。为了提高风电场的运行效率和可靠性&#xff0c;实现绿色能源的可持续发展&#xf…

c语言-链表1

10 链表 一、链表是什么&#xff1f; -- 数据的一种存储方式 -- 链式存储 &#xff08;1&#xff09;线性存储 -- 地址连续 -- 自动开辟&#xff0c;自动释放 -- 默认是线性存储 &#xff08;2&#xff09;链式存储 -- 地址不连续…

【Git】git 从入门到实战系列(二)—— Git 介绍以及安装方法

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列&#xff08;一&#xff09;—— Git 的诞生&#xff0c;Lin…

S硅谷-AI大模型实战训练

课程概述 AI大模型实战训练课程是一门专为有志于深入学习人工智能领域的学员设计的高级课程。本课程以当前人工智能领域的前沿技术——大模型为核心&#xff0c;通过理论与实践相结合的教学方式&#xff0c;培养学员在AI领域的实战能力。 课程目标 理解大模型的基本原理和架构。…

python爬虫之用scrapy下载中间件爬取网易新闻

python爬虫之用scrapy下载中间件爬取网易新闻 相关资源如下&#xff1a; 采用scrapy下载中间件爬取网易新闻国内、国际、数读、军事、航空五大板块新闻标题和内容 程序wangyi.py主代码&#xff1a; import scrapy from selenium import webdriver from selenium.webdriver.e…

PDF——分割pdf的10个工具

PDF分割器是一种可用于将PDF文档分割成更小的文档甚至单个页面的工具。分割 PDF 文档的主要原因是为了更容易共享。 但该过程的成功取决于您用于拆分 PDF 的工具。较简单的工具仅提供几个选项&#xff0c;可能并不适合所有类型的文档。我们将在本文中列出的 10 个最佳 PDF 分割…

gemini api 应用

安装 gemini Prerequisites To complete this quickstart locally, ensure that your development environment meets the following requirements: Python 3.9 An installation of jupyter to run the notebook. Install the Gemini API SDK The Python SDK for the Gemin…