(转)menuconfig的执行流程,构建一个menuconfig系统的方法
2017-10-04 15:22
239 查看
最近在搞menuconfig,觉得这篇文章很不错,留存一下。 原文博客已被关闭,转的地址为:http://blog.csdn.net/kof98765/article/details/38515239 正文如下:
linux/2.6.20.6/make menuconfig
当在顶层目录执行”make menuconfig”会执行顶层Makefile 第415行的规则
config %config: scripts_basic outputmakefile FORCE
(Q)mkdir−pinclude/linuxinclude/config(Q)(MAKE)(build)=scripts/kconfig $@
这里”menuconfig”与模式”%config”匹配。所以其执行的规则如下:
menuconfig: scripts_basic outputmakefile FORCE
(Q)mkdir−pinclude/linuxinclude/config(Q)(MAKE)(build)=scripts/kconfig menuconfig
这个规则有三个依赖:scripts_basic、outputmakefile、FORCE。下面看一下这三个依赖:
1、 FORCE
首先分析一下这个依赖,它的规则定式义在1485行:
PHONY += FORCE
FORCE:
这个规则没有命令也没有依赖,它的目标也不是一个存在的文件名。在执行此规则时,目标FORCE总会被认为是最新的。这样当它作为其它规则的依赖时,因为依赖总被认为被更新过的,所以那个规则的中定义的命令总会被执行。
2、 scripts_basic
这个依赖的规则在347行定义:
scripts_basic:
(Q)(MAKE) $(build)=scripts/basic
build这个变量定义在scripts/kbuild.include的114行:
build := -f (if(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
所以上面的规则可写成如下形式:
scripts_basic:
(Q)(MAKE) -f (if(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
这个规则的命令最终会进入scripts目录,执行Makefile.build文件,并传递参数obj=scripts/basic.
在Makefile.build的第5行有:
src := $(obj)
这就把传递进来的值赋给了src,所以
src := scripts/basic
从第16行开始的两行把src (即scripts/basic)目录下的Makefile包含进来(如果有Kbuild则包含Kbuild)
kbuild-dir := (if(filter /%,(src)),(src),(srctree)/(src))
include (if(wildcard (kbuild−dir)/Kbuild),(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
在第19行包含了scripts/Makefile.lib进来,
在Makefile.build的第83行,是make在Makefile.build中遇到的第一个目标
__build: (if(KBUILD_BUILTIN),(builtin−target)(lib-target) (extra−y)) (if (KBUILDMODULES),(obj-m)) \
(subdir−ym)(always)
@:
KBUILD_BUILTIN在顶层Makefile的第207行定义
KBUILD_BUILTIN := 1
如果执行”make modules”,会在214行开始对其进行一些处理
ifeq ((MAKECMDGOALS),modules)KBUILDBUILTIN:=(if $(CONFIG_MODVERSIONS),1)
endif
所以我们这里 KBUILD_BUILTIN :=1
KBUILD_MODULES在顶层Makefile的第206行定义,
KBUILD_MODULES :=
如果执行”make all”、”make _all”、”make modules”、”make”中任一个命令,则在222行开始会对这个变量进行处理
ifneq ((filterallallmodules,(MAKECMDGOALS)),)
KBUILD_MODULES := 1
endif
ifeq ($(MAKECMDGOALS),)
KBUILD_MODULES := 1
endif
因此,我们这里KBUILD_MODULES :=
分析了这两个变量后,上面的规则可重新写为
__build: (builtin−target)(lib-target) (extra−y))(subdir-ym) $(always)
@:
这就是通过规则
scripts_basic:
(Q)(MAKE) -f (if(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
在scripts/Makefile.build文件中执行的第一个规则,
规则中的依赖由几个变量(builtin−target)(lib-target) (extra−y))(subdir-ym) (always)表示。规则的命令是一个冒号命令”:”,冒号(:)命令是bash的内建命令,通常把它看作true命令。bash的help解释(help :)为:No effect; the command does nothing. A zero exit code is returned.(没有效果,该命令是空操作,退出状态总是0)。
__build:(builtin-target) (lib−target)(extra-y)) (subdir−ym)(always)
@:
构建一些依赖目标,这里主要是构建$(always)变量指定的目标。其他变量在scripts/basic/Makefile中并没有定义。
3、 outputmakefile
回到顶层Makefile中看规则
menuconfig: scripts_basic outputmakefile FORCE
(Q)mkdir−pinclude/linuxinclude/config(Q)(MAKE)(build)=scripts/kconfig menuconfig
中的outputmakefile参数构建规则在357行开始定义
outputmakefile:
ifneq ((KBUILDSRC),)(Q)(CONFIGSHELL)(srctree)/scripts/mkmakefile \
(srctree)(objtree) (VERSION)(PATCHLEVEL)
endif
这个规则的命令运行一个shell脚本scripts/mkmakefile,并传递四个参数。这个脚本主要是在$(objtree)参数指定的目录中生成一个Makefile文件。由于这里KBUILD_SRC为空,所以这个脚本并不会被执行
回头再看看刚才那个规则
menuconfig: scripts_basic outputmakefile FORCE
(Q)mkdir−pinclude/linuxinclude/config(Q)(MAKE)(build)=scripts/kconfig menuconfig
在他的依赖被处理完后,开始执行规则的命令。第一个命令创建了两个目录,第二个命令扩展后为
(Q)(MAKE) -f (if(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj =scripts/kconfig menuconfig
这个命令依然是执行scripts/Makefile.build这个makefile文件。并执行它里面menuconfig的规则。根据上面的分析,在Makefile.build会包含scripts/kconfig/Makefile文件。然后执行以menuconfig为目标的规则,在scripts/kconfig/Makefile的13行定义
menuconfig: (obj)/mconf< arch/$(ARCH)/Kconfig
从这个命令可以看出,最终会运行arch/arm/Kconfig这个脚本,出现配置界面
原文地址 http://blog.csdn.net/BoySKung/archive/2008/12/24/3596762.aspx
相关文章推荐
- 【转帖】menuconfig的执行流程,构建一个menuconfig系统的方法
- make menuconfig 执行流程分析
- linux make menuconfig 执行流程小结
- linux make menuconfig 执行流程小结
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- linux make menuconfig 执行流程小结
- linux make menuconfig 执行流程小结
- linux make menuconfig 执行流程小结
- linux make menuconfig 执行流程小结
- linux make menuconfig 执行流程小结
- 现代流程企业的制造执行系统
- 需要开发一个合同执行状态系统
- 在DELPHI中调用一个可执行程序得方法
- 讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
- 给IBuySpy构建一个PlugIn系统(2)
- ERP系统验收时测试流程方法及内容[1]
- ERP系统验收时测试流程方法及内容[2]
- ERP系统验收时测试流程方法及内容[3]
- 重新安装系统后 Sql Server 2005 升级注意!以及执行attach 错误,提示05错误的解决方法!
- 一个button同时执行多个有返回值的函数的解决方法(return false; or return true;)