Kconfig Kbuild
代码工程中常常会见到一些名为Kconfig Kbuild的文件
这种文件的作用是:面向编译脚本,屏蔽硬件的差异。Kconfig 并不是一种特殊的脚本,而是一种解决问题的方法,他可以用任何方法实现:python、shell+makfefile(linux kernal、Busybox)。
引子
对于嵌入式或者OS而言,面对的是成百上千的硬件类型,举个例子。
假如有两个I2C硬件需要适配,常见的做法:方法1 (不建议滥用这种方法,1 新增单板时会修改同一文件,有误修改风险 2 不利于阅读)
一个.c中通过宏区分 然后编译脚本/编译宏来区分
#ifdef I2C_A_HARDWARE
void i2c_write()
#endif#ifdef I2C_B_HARDWARE
void i2c_write()
#endif方法2
通过文件区分 i2c_ahardware.c i2cb_hardware.c 最后也是通过编译脚本区分
对于第二种方法,当添加一种硬件后,构建的脚本需要修改:
if I2C_A_芯片
i2c_ahardware.c 参与构建
else if I2C_B_芯片
i2cbhardware.c 参与构建
else if I2C_X_芯片
i2cx_hardware.c 参与构建
…
else if 芯片xxx
…
…
…
endif
可以想象当有成百上千个芯片时,makefile会成为什么样子,更别说还有if else嵌套的场景、文件路径修改、文件名修改、代码整合,所引发的编译脚本的修改,实在。。。。
想一想
linux kernal如何一套代码适配了成千上万的板子
U-boot如何支持了上千种单板Kconfig的工作方式
Kconfig的工作步骤
1)读取当前目录下的.config文件(没有的话则按照Kconfig文件默认配置)
2)根据.config的内容,显示相应的界面
3)程序员通过界面选中本单板将要参与构建的组件
4)退出Kconfig界面,会保存两个文件:.config、autoconf.hKconfig文件:
Kconfig文件运行后界面:使用者来选择(*代表选择)
生成的.config文件(该文件既可以用来初始化Kconfig界面,也可以保存为不同硬件的配置文件。通过不同的配置文件来替代复杂的if else)
Kbuild文件:将选择的文件进行包含和排除
当选择I2C_A, 最终的obj-y = i2c_a_hardware.o 这个就是编译脚本的输入。autoconf.h (根据Kconfig的选择结果生成,可以作为方法1的宏定义文件)
Kconfig的python实现代码可以参考:
github 项目ulfalizer/Kconfiglib
该库的使用:
https://blog.csdn.net/u010018991/article/details/81867316总结
- Kconfig相当于将编译脚本的功能进行分层,屏蔽掉了各种单板、芯片的差异
- 原先的if else分支仍然"存在",只是被多个硬件单板分支的.config配置文件替代
- Kconfig也可应用于纯软件场景,可以支持纯软件的裁剪和定制
有两种方法在自己的工程中使用Kconfig
Linux Kernel使用了一堆脚本,在scripts目录下,属于GPL协议。
Kconfiglib是另一个选择,它使用Python脚本来实现Kconfig,这个库的License对商业软件更友好。
Kconfig Kbuild相关推荐
- sysadmin默认密码_Sysadmin工具,Kconfig / kbuild的秘密,11个KDE应用程序,tcpdump,Laverna,Python等
sysadmin默认密码 今天,我们发布了LISA18演讲者系列的第一篇文章,Michael Hrivnak 介绍了Kubernetes中的Ansible运算符 . 请查看更多有关LISA18演讲者的 ...
- U-Boot 之四 构建过程(Kconfig 配置 + Kbuild 编译)详解
在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建过程详解 中我们说了要一步步搭建整个嵌入式 Linux 运行环境,今天继续介绍 U-Boot 相关的内容.我所使用的硬件平台及 ...
- 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内 ...
- arch linux引导不启动_Linux 内核源代码的目录结构
内核技术点合集 Linux 内核源代码包括三个主要部分: 1. 内核核心代码,包括第 3 章所描述的各个子系统和子模块,以及其它的支撑子系统,例 如电源管理.Linux 初始化等 2. 其它非核心代码 ...
- Linux内核的整体架构介绍
1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...
- linux 哪个进程在使用串口_Linux内核的整体架构
转载自蜗窝科技 Linux内核的整体架构www.wowotech.net 作者:wowo发布于:2014-2-21 13:23 分类:Linux内核分析 0. 转载者说在前面的话 转载目的: 能够让 ...
- 深度:一文看懂Linux内核,Linux内核架构和工作原理详解
简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个 ...
- Visual Studio Code搭建linux驱动开发环境
前言 Visual Studio Code是一个很优秀的开发软件,但我们并不能直接用来驱动开发.因为驱动开发所需要的头文件来自Linux内核,这就要求我们自己添加内核文件. 一.获取内核? 1.官网 ...
- linux内核源码分析笔记
一.内核源码目录结构 1.Linux 内核源代码包括三个主要部分 1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理.linux初始化等. 2 ...
- Linux内核架构和工作原理详解
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个进程都 ...
最新文章
- 运维-nginx +php 错误状态码说明
- asp.net 访问 access出现 ole_connection.ServerVersion引发了System.InvalidOperationException的解决
- oracle测试表什么名字,Oracle_PLSQL测试题与答案(绝对经典)
- 汽车电子专业知识篇(六十三)-继电器的结构、工作原理、检测方法
- a8处理器相当于骁龙几_天玑700处理器怎么样 天玑700相当于骁龙多少_CPU_硬件教程...
- 谷歌公布4个0day详情,其中3个被滥用于攻击亚美尼亚
- iOS 推送通知详解
- WPF DataGrid使用 后台界面修改前台不刷新问题
- C# 网页自动填表自动登录 .
- MATLAB画图调整分辨率
- 服务器机房监控系统,服务器机房监控建设方案的介绍
- [转] PHP开发通用型标题图片功能
- 华硕 FX5O5GT 黑苹果efi引导文件
- OPENGL学习(四)GLUT三维图像绘制
- 思科vPC (Virtual Por Channel)
- 使用JAVA对象和JSON相互转换问题
- 百度API海王撩妹话术生成器模板
- hsqldb 使用简介
- 舵机的问与答及故障分析
- linux下spi flash驱动程序,SPI Flash(W25Q16DV) 驱动
热门文章
- 有哪些值得推荐的好的算法书?
- allegro17.4绘制PCB封装-R0603
- amap不同样式marker点_amap不同样式marker点_CAD制图软件中如何设置CAD打印样式表(CTB)?...
- HTML和jquery实现播放功能
- 健康管理平台设计与实现
- 开源:通用的日志分析工具(LogViewer)
- 天勤率辉考研数据结构2021
- github java 性能,JavaGuide/手把手教你定位常见Java性能问题.md at master · Github-Programer/JavaGuide · GitHub...
- Android webview缓存机制
- 初中计算机授课教案模板,初中课程教案模板