当前位置:   article > 正文

Linux make menuconfig分析及移植kconfig用于应用程序使用_linux kconfig解析程序

linux kconfig解析程序

一、makefile基础

针对make 命令,其MAKECMDGOALS表示传递给make的所有的参数。

测试用例如下(该测试用例输出当前输入的命令内容,MAKECMDGOALS是一个全局变量):

  1. %:
  2. @echo $(MAKECMDGOALS)
  3. all:
  4. @echo "no param"

执行结果如下:

二、Linux make menuconfig命令解析

Make config/%config的解析

在LINUX的Makefile中,根据如下命令确定是否使用make config相关的命令,其中MAKECMDGOALS即为上面说明的内容

  1. ifeq ($(KBUILD_EXTMOD),)
  2. ifneq ($(filter config %config,$(MAKECMDGOALS)),)
  3. config-targets := 1
  4. ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
  5. mixed-targets := 1
  6. endif
  7. endif
  8. endif

当为make config相关的命令时,则将config-targets设为1,继续跟踪

  1. ifeq ($(config-targets),1)
  2. # ===========================================================================
  3. # *config targets only - make sure prerequisites are updated, and descend
  4. # in scripts/kconfig to make the *config target
  5. # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
  6. # KBUILD_DEFCONFIG may point out an alternative default configuration
  7. # used for 'make defconfig'
  8. include $(srctree)/arch/$(SRCARCH)/Makefile
  9. export KBUILD_DEFCONFIG KBUILD_KCONFIG
  10. config: scripts_basic outputmakefile FORCE
  11. $(Q)mkdir -p include/linux include/config
  12. $(Q)$(MAKE) $(build)=scripts/kconfig $@
  13. %config: scripts_basic outputmakefile FORCE
  14. $(Q)mkdir -p include/linux include/config
  15. $(Q)$(MAKE) $(build)=scripts/kconfig $@
  16. else
  17. endif

针对make config相关命令,均依赖scripts_basic outputmakefile、FORCE规则,执行完依赖规则后,则调用mkdir -p include/linux include/config创建两个目录,接着调用$(MAKE) $(build)=scripts/kconfig $@执行kconfig相关的处理,下面分别介绍这几个规则。

scripts_basic规则

scripts_basic的定义如下:

  1. scripts_basic:
  2. $(Q)$(MAKE) $(build)=scripts/basic
  3. $(Q)rm -f .tmp_quiet_recordmcount
  4. 其中build规则的定义如下(scripts/Kbuild.include):
  5. ###
  6. # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
  7. # Usage:
  8. # $(Q)$(MAKE) $(build)=dir
  9. build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
  10. 因此scripts_basic可展开如下:
  11. scripts_basic:
  12. $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
  13. $(Q)rm -f .tmp_quiet_recordmcount

即执行kernel-source/scripts/Makefile.build命令,传递的参数为obj=scripts/basic

其中scripts/Makfile.build文件主要用于编译scripts目录下的各种应用程序,此处是编译scripts/basic目录下的fixdep程序,该程序主要是打印目标文件所依赖的文件列表。

  1. outputmakefile规则
  2. # outputmakefile generates a Makefile in the output directory, if using a
  3. # separate output directory. This allows convenient use of make in the
  4. # output directory.
  5. outputmakefile:
  6. ifneq ($(KBUILD_SRC),)
  7. $(Q)ln -fsn $(srctree) source
  8. $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
  9. $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
  10. endif

这个规则主要是针对传递KBUILD_SRC变量指定kbuild_src源码目录的情况,其中srctree即为kbuild_src,objtree主要是存储编译产生obj的目录,定义为当前执行make的目录。其中CONFIG_SHELL即为当前系统的shell程序路径,即执行shell脚本 $(srctree)/scripts/mkmakefile,在objtree目录下生成一个makefile文件,以便用于编译使用。该规则与make %config关联不大,可不用关注。

FORCE规则

在linux内核中,FORCE规则的定义如下:

PHONY += FORCE

FORCE:

在MAKEFILE中,如果一个规则没有命令或者依赖,而且它的目标不是一个存在的文件名,则在执行此规则时,目标总会被认为是最新的。因此当别的规则依赖该规则时,由于依赖总被认为是被更新过的,所以作为依赖所在的规则定义的命令总会被执行。

scripts/kconfig规则

针对$(MAKE) $(build)=scripts/kconfig $@,扩展后的命令如下:

  1. $(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/kconfig $@
  2. 针对$(srctree)/)scripts/Makefile.build文件,会包含如下文件
  3. -include include/config/auto.conf
  4. include scripts/Kbuild.include
  5. include scripts/Makefile.lib
  6. # Do not include host rules unless needed
  7. ifneq ($(hostprogs-y)$(hostprogs-m),)
  8. include scripts/Makefile.host
  9. endif

三、kconfig移植至应用程序使用

只需要将kconfig目录下的文件以及scripts目录下的makefile.host文件拷贝出来,并稍作修改,即可完成针对make menuconfig的移植。

目前已移植一个kconfig,移植后的kconfig目前支持make menuconfig、make xxx_defconfig命令,可实现针对应用程序的选择,然后在makefile中根据.config文件中的变量,即可决定哪些应用需要编译,哪些应用不需要编译。

移植后的kconfig目录结构如下:其中configs目录存放默认配置文件,顶层目录下的Makefile中定义了加载.config文件中的变量以及支持make menuconfig、make xxx_defconfig命令;tools目录下存放了kconfig源码,以及编译kconfig源码的Makefile.host文件,Uconfig文件即为linux内核中的Kconfig文件(该文件中内容的格式请参考linux doc目录下的介绍),用于make menuconfig显示条目。

├── configs

│ └── app_a_defconfig

├── Makefile

├── Makefile.common

├── tools

│ ├── kconfig

│ └── Makefile.host

└── Uconfig

以上即为本次主题的全部内容(链接地址如下https://gitee.com/jerry_chg/Uconfig.git)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/623914
推荐阅读
相关标签
  

闽ICP备14008679号