.config 和 kconfig以及 makefile的关系
当我们编写完一个驱动后,我们要把它以模块形式编译或者直接编译进内核时,需要修改相关文件,其中最重要的便是kconfig ,makefile。主要是分析一下三者之间的关系,然后就其语法简要的谈一下。当我们在内核源码目录下执行make (或者make menuconfig等命令)命令时,实际上是根据makefile 来进行编译的。我在mini2440开发板上编写了一个按键控制led灯的驱动。文件名为buttons_leds_zhao.c属于字符驱动。因此在/driver/char/目录下的makefile部分最后添加一行
obj-$(CONFIG_BUTTONS_LEDS_ZHAO) += buttons_leds_zhao.o
如下:
obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o
obj-$(CONFIG_BFIN_JTAG_COMM) += bfin_jtag_comm.o
obj-$(CONFIG_CONSOLE_TRANSLATIONS) += consolemap.o consolemap_deftbl.o
obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o
obj-$(CONFIG_AUDIT) += tty_audit.o
obj-$(CONFIG_BUTTONS_LEDS_ZHAO) += buttons_leds_zhao.o
其中第一行obj-y 中的y表示编译进内核,而obj-$(CONFIG_LEGACY_PTYS) 中CONFIG_LEGACY_PTYS则表示一个变量,类似于我们C语言中的变量,用$( )来表示,它一般可以取三种值y ,m ,n.y表示编译进内核,而m则表示以模块的方式进行编译,n表示不编译进内核。obj-y += 等号后面的.o后缀文件则是由该目录下的对应名称的.c文件编译而来。
而上面CONFIG_LEGACY_PTYS变量的取值则是通过.config文件来集中赋值的。.config部分内容如下
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_DEVKMEM is not set
CONFIG_MINI2440_HELLO_MODULE=m
CONFIG_BUTTONS_LEDS_ZHAO=m
CONFIG_LEDS_MINI2440=m
CONFIG_MINI2440_BUTTONS=m
CONFIG_MINI2440_BUZZER=y
CONFIG_MINI2440_ADC=y
# CONFIG_SERIAL_NONSTANDARD is not set
从上面几行我们可以看到,在makefile里面的变量都是在.config中赋值的。当我们在源代码目录下输入make命令时,都是默认从.config中读入。因此,在输入make之前,用ls -a 查看一下是否有该文件。对于只包含几个文件的工程来说,手动写.config和makefile并不是一件很难的事情,但如果是一个包含有几百个文件的项目来说,则是一件比较困难的事情。可以用autoconf来自动生成.config,automake来制作makefile。看起来问题是解决的,但实际上,这种做法缺乏一定的灵活性,不能实现按需定制的要求。如果要添加或删掉某个驱动,将要在.config文件中找到相应的项进行修改。非常的不方便。因此,便出现了kconfig。
当我们在内核源码目录下输入make menuconfig时,出现如下内容:
.config - Linux Kernel v2.6.32.2 Configuration
──────────────────────────────────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Linux Kernel Configuration ─────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted letters are │
│ hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> │
│ to exit, <?> for Help, </> for Search. Legend: [*] built-in [ ] excluded <M> module │
│ < > module capable │
│ ┌─────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ General setup ---> │ │
│ │ [*] Enable loadable module support ---> │ │
│ │ -*- Enable the block layer ---> │ │
│ │ System Type ---> │ │
│ │ Bus support ---> │ │
│ │ Kernel Features ---> │ │
│ │ Boot options ---> │ │
│ │ CPU Power Management ---> │ │
│ │ Floating point emulation ---> │ │
│ │ Userspace binary formats ---> │ │
│ │ Power management options ---> │ │
│ │ [*] Networking support ---> │ │
│ │ Device Drivers ---> │ │
│ │ File systems ---> │ │
│ └─────────┴(+)────────────────────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
它是通过读取在内核源码目录下的Kconfig文件来配置的。在/drivers/char/下的目录kconfig部分内容如下:
config DEVKMEM
bool "/dev/kmem virtual device support"
default y
help
Say Y here if you want to support the /dev/kmem device. The
/dev/kmem device is rarely used, but can be used for certain
kind of kernel debugging operations.
When in doubt, say "N".
config MINI2440_HELLO_MODULE
tristate "Mini2440 module sample"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
Mini2440 module sample.
config BUTTONS_LEDS_ZHAO
tristate "Mini2440 button and leds sample"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
Mini2440 button and leds module sample.
其具体语法格式说明如下:
config关键字是一个新的配置选项的入口 其后的选项MINI2440_HELLO_MODULE省略了CONFIG。完整的表示为CONFIG_MINI2440_HELLO_MODULE,也即是当我们将该选项设置成y时,它将自动的将.config的CONFIG_MINI2440_HELLO_MODULE=m改写成CONFIG_MINI2440_HELLO_MODULE=y。
紧接着的是菜单的属性 最主要的有2种tristate ,boolean 。tristate表示三态:编译进内核(y),编译成模块(m),不编译(n)。boolean 主要有两种y或ndepend则表示依赖项 default缺省的编译选项 m表示默认该文件表示以模块方式编译。后面的help是帮助信息,当我们选中help菜单时就可以看见,它不是必需的。随着操作系统升级,编译选项
达到几千个。对于一般人来说,要搞清每一个选项是很困难的,一般很多选项都是默认的。
总的来说,三者之间的关系如下:当我们在内核源码目录下输入makemenuconfig时,在出现的菜单界面中选择一项时,它会自动跟新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释。类似于# CONFIG_SERIAL_NONSTANDARD is not set,当我们输入make时,根据makefile文件来编译,makefile文件中的变量值则由.config来进行赋值操作。仅仅只在kconfig中添加选项,只会在菜单界面中显示,即使此时选择y或m,也不会编译文件。还需要在makefile文件中按照规定添加相应行才能进行编译。简单图解如下:
kconfig------->.config---------->makefile
.config 和 kconfig以及 makefile的关系相关推荐
- Android编译系统中的Kconfig,Makefile,.config编译系统浅析
在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfi ...
- 解析linux内核中makefile,.config以及Kconfig的作用
申明,下面这篇文章是原文,本文参考了这篇文章,这篇文章分析得比较透彻,下面是链接. https://zhuanlan.zhihu.com/p/28461589 首先我们要知道makefile文件是什么 ...
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核 ...
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...
- 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译
本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...
- KConfig、Makefile详解以及ARM平台Linux内核的编译
本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...
- enc28j60 linux 驱动_enc28j60网卡驱动模块添加进Linux内核,Kconfig,Makefile配置过程...
这里是要把 http://www.linuxidc.com/Linux/2017-02/140819.htm 中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改 ...
- 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...
转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...
- Linux内核源码树学习:Kconfig和Makefile
Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单 ...
最新文章
- 实战:基于OpenCV实现偏斜文档校正
- 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头
- mysql text类型 使用方法_MySQL使用TEXT/BLOB类型的知识点详解
- C语言 指针与数组
- MyApplicationToast工具类
- TCPMP-interface相关文件函数解析 -about.c
- 刻录linux-iso至u盘工具,ISO USB刻录工具ISO to USB burning tool V1.5 完美版
- 移动端证件识别,支持离线识别
- 一个不简单的Procedure body例子
- 永洪科技发布Yonghong Z-Suite V7.5 重新定义大数据驱动业务增长成功标准
- 微信小程序 延时执行 设置固定时间间隔
- AlphaStar 实战技巧分析
- html怎么设置毛笔字体,三种实用的毛笔书法字体设计制作教程
- 脑卒中css评分是什么意思,你知道房颤卒中新评分—ABC评分量表吗?
- 今天是2019年大年三十儿,写了几幅字,给大家拜个年啦
- STM32 PWM周期与频率的计算
- 原生js实现字幕滚动
- [WikiOI] 2.3.3 素数判定
- intellij idea、notepad++、Google浏览器以及Windows 10系统修改背景为豆沙绿护眼色
- leelen可视对讲怎么接线_电梯对讲系统解决方案
热门文章
- Ant Design Pro 登录超时处理
- windows 下cmd命令行的替换工具cmder
- 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
- Linux中常用命令(文件与目录)
- 担当大任者的九大特征
- JQuery学习记录——DOM的加载
- 我的20132014
- java 调用r语言包传参数_Java与R语言的配置,调用
- etlgr是什么服务器_ETL是指什么 - 金融行业 - ITPUB论坛-中国专业的IT技术社区
- java面向对象程序设计董小园_java面向对象程序设计(董小园版).doc