添加menuconfig菜单选项和编译

博客看不清的朋友可以在文章末尾下载笔记



解析:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

打开顶层目录下的 Makefile,搜索 %config 找到如下内容:
# ===========================================================================
 521 # *config targets only - make sure prerequisites are updated, and descend
 522 # in scripts/kconfig to make the *config target
 523 
 524 # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
 525 # KBUILD_DEFCONFIG may point out an alternative default configuration
 526 # used for 'make defconfig'
 527 include arch/$(SRCARCH)/Makefile
 528 export KBUILD_DEFCONFIG KBUILD_KCONFIG CC_VERSION_TEXT
 529 
 530 config: scripts_basic outputmakefile FORCE
 531     $(Q)$(MAKE) $(build)=scripts/kconfig $@
 532 
 533 %config: scripts_basic outputmakefile FORCE                                                              
 534     $(Q)$(MAKE) $(build)=scripts/kconfig $@

注:vim搜索方法
	进入底行模式输入 "/搜索内容" 回车, 按键盘 n 下一个, shift + n 上一个

makefile语法备注:
	$@	:目标
	$^	:所有的依赖
	$<	:第一个依赖
	@	:隐藏回显


[1] 运行$make -p Makefile >> makefile.txt 导出宏定义到指定文件
	参数备注: 
		-p:输出所有宏定义和目标文件描述
		-f:指定"makefile"文件

	在makefile.txt文件中搜索 "Q",找到:

		145 Q = @

	可知 $(Q) = @,也就是说 $(Q) 这个宏定义的作用就是关闭这两句话的回显

[2]	删除 $(Q),再次运行$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

	出现如下内容:
		make -f ./scripts/Makefile.build obj=scripts/kconfig bcmrpi_defconfig
		#
		# configuration written to .config
		#

	那么我们猜测$(MAKE)是什么呢? $(build)又是什么呢?
		我们再在makefile.txt文件中搜索 "MAKE",找到:
			937 MAKE = make
		所以 $(MAKE) = make,那么$(build) = -f ./scripts/Makefile.build obj 而 $@ = bcmrpi_defconfig
	
	也就是说这条命令的作用是指定makefile文件"./scripts/Makefile.build" ,进入 "scripts/kconfig" 目录,
	调用该目录下的 Makefile 执行 "make bcmrpi_defconfig"

[3] 分析 scripts/kconfig/ 中的 Makefile
	打开 scripts/kconfig/Makefile, 搜索 "%_defconfig",找到:

		103		%_defconfig: $(obj)/conf
		104     $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

	里面的宏定义太多了不好分析,我们先删除回显,再次执行$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

	出现如下内容:
	make -f ./scripts/Makefile.build obj=scripts/kconfig bcmrpi_defconfig
	scripts/kconfig/conf  --defconfig=arch/arm/configs/bcmrpi_defconfig Kconfig
	#
	# configuration written to .config
	#

	其他的内容前面已经看过了,我们看第二行:
	scripts/kconfig/conf  --defconfig=arch/arm/configs/bcmrpi_defconfig Kconfig

	显然
	$(obj)		=	scripts/kconfig
	$<	   		=	$(obj)/conf		=	scripts/kconfig/conf
	$(silent) 	= 	空
	$(SRCARCH)	=	arm
	$@			=	bcmrpi_defconfig
	$(Kconfig)	=	Kconfig

	通过file conf 查看conf文件,发现其中scripts/kconfig/conf的conf其实是一个可执行文件,
	所以后面两个都是参数的作用是根据 arch/arm/configs/bcmrpi_defconfig 文件和顶层目录下
	的 Kconfig 文件 在顶层目录下生成.config文件!

[4] 总结
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig 命令以下简化成:
	make bcmrpi_defconfig 命令. 通过内核源码顶层目录下的Makefile ,然后这个Makefile调用
	当前目录下的 ./scripts/kconfig/Makefile, 然后./scripts/kconfig/Makefile这个 Makefile
	再调用./scripts/kconfig/conf
	conf 可执行程序根据传参 将arch/arm/configs/bcmrpi_defconfig 文件和顶层目录下的 Kconfig
	文件,从而在顶层目录下生成.config文件!





解析:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

[1] make menuconfig 的步骤和 make bcmrpi_defconfig 相似
	也是通过顶层目录下的 Makefile 调用 ./scripts/kconfig/Makefile.
	这里的第一步和之前一样,所以不再分析.

[2] 分析 ./scripts/kconfig/Makefile
	打开这个文件,搜索menuconfig ,找到如下内容:

	28 menuconfig: $(obj)/mconf
 	29     $< $(silent) $(Kconfig)

	我们之前已经分析出部分宏所代表的参数
	$(obj)		=	scripts/kconfig
	$<	   		=	$(obj)/mconf		=	scripts/kconfig/mconf
	$(silent) 	= 	空
	$(Kconfig)	=	Kconfig

	所以把这些参数代入就能得出这条完整的命令
	scripts/kconfig/mconf  Kconfig

[3] 分析 scripts/kconfig/mconf
	通过file mconf 发现mconf也是一个可执行文件.
	mconf 的作用是根据Kconfig中的信息生成菜单选项的图形化配置界面.

[4] 总结
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 命令以下简化成:
	make menuconfig 命令. 通过内核源码顶层目录下的Makefile ,然后这个Makefile调用
	当前目录下的 ./scripts/kconfig/Makefile, 然后./scripts/kconfig/Makefile这个 Makefile
	再调用./scripts/kconfig/mconf
	mconf 根据Kconfig中的信息生成菜单选项的图形化配置界面.


解析:将内核驱动代码编译选项添加到menuconfig

[1] Kconfig 文件的作用
		Kconfig 文件中保存了 menuconfig 菜单的配置项的信息.

[2]	Kconfig 中配置菜单的语法格式
	复制两段 menuconfig 界面
	1> 主界面
	=========================================================
		[*] Networking support  --->
			Device Drivers  --->
			File systems  --->
			Security options  --->

	2> Device Drivers的界面
	=========================================================
			Character devices  --->
			I2C support  --->
		[*] SPI support  --->
		< > SPMI support  ----
		< > HSI support  ----
		<M> PPS support  --->

	复制一段./drivers/char/Kconfig 的代码
	=========================================================
		14 menu "Character devices"
		15 
		16 source "drivers/char/broadcom/Kconfig"
		17 
		18 source "drivers/tty/Kconfig"
		19 
		20 config DEVMEM
		21     bool "/dev/mem virtual device support"
		22     default y
		23     help
		24       Say Y here if you want to support the /dev/mem device.
		25       The /dev/mem device is used to access areas of physical
		26       memory.
		27       When in doubt, say "Y".

		... ... #此处省略N行
		endmenu
	=========================================================

		menu 关键字的作用:主菜单名字
			用法:menu "主菜单名字"
		
		source 关键字的作用:包含下级子菜单文件
			用法:souce "驱动顶层目录下的 Kconfig 文件的路径"
		
		bool 关键字的作用:菜单选项类型(bool只有 y 和 n)
			用法: bool "子菜单的名字"

		default 关键字的作用:菜单默认值
			用法: default 默认值
		
		help 关键字的作用:提供更多帮助信息
			用法: help 换行 帮助信息 直到下一个子菜单或者endmenu或者文件末尾
		
		endmenu  关键字的作用:结束子菜单
			用法: 在子菜单后加endmenu

		config 关键字的作用:添加到.config文件的菜单信息
			用法: config 菜单信息(自己起个名字)

[3] 自己写一个菜单
	在drivers/char/broadcom/Kconfig 中添加如下内容
	=========================================================
	menu "My_Char_Device" 		#主菜单名字
	config MY_CHDEV 			#保存到.config中的信息
	bool "Do not enable this"	#子菜单名字
	default n					#默认值
	help						#帮助说明
		This is a demo of add a device menu.
		Please do not enable it!
	endmenu						#结束主菜单(注意!主菜单中不能再包含一个主菜单)

	添加效果
	=========================================================
	[*] Network device support  --->
		Input device support  --->
		My_Char_Device  --->				#这是我添加的
		Character devices  --->
		I2C support  --->
	[*] SPI support  --->

	打开之后
	=========================================================
	[ ] Do not enable this (NEW)
	

	如果我将这个选项选启用 .config 中就会出现:
	#
	# My_Char_Device
	#
	CONFIG_Char_Device=y

	如果我将这个选项选禁用 .config 中就会出现:
	#
	# My_Char_Device
	#
	# CONFIG_Char_Device is not set

[4] 自己添加一个驱动并编译进去
	拷贝 "chrdev.c" 驱动源码到/devices/char/
	打开该目录下的Makefile,添加一行

		obj-$(CONFIG_Char_Device) += chrdev.o

	CONFIG_Char_Device  就是.config中的驱动信息(名字,自己定义在Kconfig菜单的congfig关键字中)
	chrdev.o			就是编译源码生成的二进制文件名称(名称一定要和源码对应, xxx.c 一定是 xxx.o)

[5] Kconfig .config Makefile 的关系.
	1> .config保存了通过make xxx_defconfig 和 make menuconfig 两种设置方式的配置信息.
	2> make xxx_defconfig 通过scripts/kconfig/中的conf把Kconfig和xxx_defconfig生成.config
	3> make menuconfig 通过./scripts/kconfig/中的mconf读取Kconfig保存的菜单信息生成图形界面,
	   再将更改的参数保存到.config
	4> make uImage 通过各个驱动文件夹下的Makefile和.config配置文件,将有关的驱动源码编译成二进制
	   文件并添加到内核当中

拍拍小站,XiaoYang
转载请注明来源:www.pypyn.com