Kconfig与Makfile语法

##Kconfig的语法:(https://www.cnblogs.com/LoTGu/p/5967979.html)
菜单选项
--------
大多数的选项都定义了一个配置选项,其它选项则有助于对它们进行组织。
一个配置选项定义可以是下面的形式:

config MODVERSIONS
   bool "Set version information on all module symbols"
   depends MODULES
   help
      Usually, modules have to be recompiled whenever you switch to a new
      kernel. ...

每行都是以config关键字开始,并可以接多个参数。"config" 为定义了一新的配置选项。
下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型、输入提示(input prompt)、依赖关系、帮助信息和默认值。
配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。

##Makefile语法(https://blog.csdn.net/afei__/article/details/82696682)(https://blog.csdn.net/hxlawf/article/details/96475558)
目标...: 依赖...
    命令1
    命令2
    ...

注意:命令前必须使用有一个制表符(<TAB>)。

分析:
1 source "drivers/hello/Kconfig"

在Kconfig中有类似语句:source "drivers/hello/Kconfig"
内核源码目录树中每一个Kconfig都会用source引入其所有子目录下的Kconfig,
从而保证了所有的Kconfig项目都被包含进menuconfig中。
这个也说明了:如果你自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,
然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。

2 depends on

意思是本配置项依赖于另一个配置项。
如果那个依赖的配置项为Y或者M,则本配置项才有意义;
如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。
depends项会导致make menuconfig的时候找不到一些配置项。
所以在menuconfig中如果找不到一个选项,但是这个选项在Kconfig中却是有的,
则可能的原因就是这个配置项依赖的一个配置项是不成立的。
depends依赖的配置项可以是多个,还可以有逻辑运算。
这种时候只要依赖项目运算式子的结果为真则依赖就成立。

3 comment

用于定义一些帮助信息,出现在界面的第一行。

4 menu/endmenu menuconfig

  1)menu用于生成菜单,其格式如下:

         menu "Floating poing emulation"
         config FPE_NWFPE
         config FPE_NWFPE_XP
         .............
         endmenu

   menu之后的Floating poing emulation是菜单名,menu和endmenu间有很多config条目。
  
  2)menuconfig有点类似menu,但区别就在于menu后面多了一个config,
  这个menu是可以配置的,前面比 menu类型多了一个<>,通过空格可以修改这个配置项的选中状态。

  menuconfig MODULES
  tristate "Enable loadable module support"config
  if MODULES
  xx
  endif

  也就是说,配置项是位于if和endif中。其中的部分就是MODULES子目录显示的内容。
  如果选中了MODULE,那么if和endif中的内容可以显示。如果没有定义,就只能进入一个空目录。 
  可以认为是menu和config的结合体,既在前面有选项,回车后也可以展开。

5 config

config是构成Kconfig的最基本单元,其中定义了配置项的详细信息。
1) 每个config菜单项都要有类型定义: bool布尔类型、 tristate三态(内建、模块、移除)、string字符串、 hex十六进制、 int整型。
例如:

config HELLO_MODULE
bool "hello test module"


bool 类型的只能选中或不选中,显示为[ ];
tristate类型的菜单项多了编译成内核模块的选项,显示为< > ,
假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,
假如选择内建,就是直接编译成内核镜像,就会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置。
2) default:默认值
比如config类型是tristate,则默认值可以是y 、m、n。

6 Kconfig和.config文件和Makefile三者的关联

经过menuconfig配置之后保存,就会在内核顶层目录下生成.config文件。
=y表示该配置将会被编译进内核,=m表示该配置需要单独编译成模块。
内核顶层makefile会调用.config文件,引用.config里的配置,进而选择性的编译内核驱动模块。
配置项被配置成Y、N、M会影响“.config”文件中的CONFIG_XXX变量的配置值。
“.config”中的配置值(=y、=m、没有)会影响最终的编译链接过程。
如果=y则会被编入(built-in),如果=m会被单独连接成一个”.ko”模块,如果没有则对应的代码不会被编译。
那么这是怎么实现的?都是通过makefile实现的。
如makefile中:obj-$(CONFIG_DM9000) += dm9000.o,
如果CONFIG_DM9000变量值为y,则obj += dm9000.o,因此dm9000.c会被编译;
如果CONFIG_DM9000变量未定义,则dm9000.c不会被编译。
如果CONFIG_DM9000变量的值为m则会被连接成“.ko”模块。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值