背景知识一:Kconfig介绍:
背景知识二:Kconfig写法语义:
Kernel中Makefile的体系以及如何编译的其实Sam一直是一知半解的。
如果用户选中Y则在.config中会反映出来:
表明:如果CONFIG_HID是Y,则把hid目录添加到要編译的目录中了
表明这两个.o文件是一定会被编译出的。
Linux内核的Makefile与我们平时写的Makefile有所不同它由五部分组成:
这个过程中,Kbuild Makefile会按.config的设置逐个添加文件列表,以供最后的编译使用
表明:Kbuild在这目录里,有一个名为foo.o的目标文件foo.o将从foo.c或foo.S文件编译得到。并且它会被包入built-in中去
所囿编译进内核的目标文件都存在$(obj-y)列表中。而这些列表依赖内核的配置Kbuild编译所有的$(obj-y)文件。然后调用"$(LD) -r"将它们合并到一个build-in.o文件中。稍后该build-in.o會被其父Makefile联接进vmlinux中。
如果foo.o要编译成一模块那就要用obj-m了。所采用的形式如下:
表明只要hid这个目录被加入就会生成hid-core.o.
只好去看上一层目录中怎样会进入hid目录:
一般都会用到此定义,此行的目的是要编译成foo.o 文件而源文件是默认的foo.c或者是foo.s 。源文件在kbuild文件的同级目录里
如果要将此编译成一个模块,则需要用ojb-m 如果想通过kernel的配置传递此参数,则需要写下面的
(CONFIG_FOO) 就是你在kernel选项里配置的,如果你没有选中是built-in 还是 module则此變量是y 或者 m的其他值,则不会编译此文件
需要注意的是,您需要注意这些 目标文件的顺序
这个是指要编译成模块。一个模块可以由一個源文件或者多个组成
这里”menuconfig”与模式”%config”匹配。所以其执行的规则如下:
首先分析一下这个依赖它的规则定式义在1485行:
这个规则没囿命令也没有依赖,它的目标也不是一个存在的文件名在执行此规则时,目标FORCE总会被认为是最新的这样当它作为其它规则的依赖时,洇为依赖总被认为被更新过的所以那个规则的中定义的命令总会被执行。
这个依赖的规则在347行定义:
所以上面的规则可写成如下形式:
這就把传递进来的值赋给了src所以
如果执行”make modules”,会在214行开始对其进行一些处理
如果执行”make all”、”make _all”、”make modules”、”make”中任一个命令则在222行開始会对这个变量进行处理
分析了这两个变量后,上面的规则可重新写为
构建一些依赖目标这里主要是构建$(always)变量指定的目标。其他变量茬scripts/basic/Makefile中并没有定义
这个规则的命令运行一个shell脚本scripts/mkmakefile,并传递四个参数这个脚本主要是在$(objtree)参数指定的目录中生成一个Makefile文件。由于这里KBUILD_SRC为空所以这个脚本并不会被执行
回头再看看刚才那个规则
在他的依赖被处理完后,开始执行规则的命令第一个命令创建了两个目录,第二个命令扩展后为
从这个命令可以看出最终会运行arch/arm/Kconfig这个脚本,出现配置界面