(二)openwrt make kernel_menuconfig流程分析

(二)openwrt make kernel_menuconfig流程分析


在上一篇文章“(一)openwrt make menuconfig流程分析”中,我们分析了make menuconfig的流程,在配置菜单中,我们并没有看到kernel相关的配置,这是因为在openwrt中,我们想要配置内核的话,需要使用make kernel_menuconfig命令。我们将通过分析这个命令执行的流程,看看它具体做了哪些工作。下面是我总结的分析过程,希望与大家分享,共同学习,共同成长,其中可能会有一些理解不正确的地方,还望各位不吝指教,谢谢,^_^。


当我们在顶层目录输入make kernel_menuconfig时,由于指定的目标为kernel_menuconfig,所以make会去寻找文件中kernel_menuconfig所在的地方,然后去执行其相应规则。同menuconfig目标一样,我们可以看到,kernel_menuconfig目标也在$(TOPDIR)/include/toplevel.mk中,下面是它的依赖和规则。其中$(TOPDIR)就是顶层目录,定义在主Makefile中TOPDIR:=${CURDIR}。

kernel_menuconfig: prepare_kernel_conf  
    $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig  

kernel_menuconfig的依赖目标prepare_kernel_conf

第1行,依赖目标prepare_kernel_conf的定义在$(TOPDIR)/include/toplevel.mk中

prepare_kernel_conf: .config FORCE

ifeq ($(wildcard staging_dir/host/bin/quilt),)
  prepare_kernel_conf:
	@+$(SUBMAKE) -r tools/quilt/install
else
  prepare_kernel_conf: ;
endif

下面对各依赖目标和规则进行分析。

1.1 prepare_kernel_conf的依赖目标.config

.config定义在$(TOPDIR)/include/toplevel.mk中:

ifeq ($(FORCE),)
  .config scripts/config/conf scripts/config/mconf: tmp/.prereq-build
endif

.config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo)
	@+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
		[ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
		$(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \
	fi
  1)第1~3行,默认FORCE是等于空的,所以这里的if条件成立,即.config依赖于tmp/.prereq-build,我们看一下 tmp/.prereq-build的定义:
tmp/.prereq-build: include/prereq-build.mk
	mkdir -p tmp
	rm -f tmp/.host.mk
	@$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \
		echo "Prerequisite check failed. Use FORCE=1 to override."; \
		false; \
	}
	touch $@

    下面分析tmp/.prereq-build的依赖目标和规则。

    1.1)第1~3行,tmp/.prereq-build依赖include/prereq-build.mk文件,创建tmp目录,删除tmp/.host.mk。

    1.2)第4~7行,执行prereq-build.mk文件,用于检查一些必备条件是否准备好,例如下面列出的检查项,如果检查失败,则打印后面“Prerequisite check ...”信息。

Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
...
    1.3)第8行,检查完后,创建tmp/.prereq-build文件。
  2)第5~9行,继续来看简化一下如下:
.config: ./scripts/config/conf prepare-tmpinfo
	@+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
		[ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
		make menuconfig; \
	fi
    第5行,./scripts/config/conf依赖目标的分析可参考(一)openwrt make menuconfig流程分析”文章中scripts/config/mconf。CONFIG_HAVE_DOT_CONFIG变量的值为空,所以if条件不成立,得到prepare-tmpinfo依赖条件,该依赖条件的分析也在“(一)openwrt make menuconfig流程分析”文章中有讲到。

    第6~9行,这里的规则只有一个if条件语句,其表示如果顶层目录下不存在.config文件,或存在.config,但是该文件中没找到CONFIG_HAVE_DOT_CONFIG,则if条件成立,那将会执行make menuconfig命令;否则该规则什么也不做。

1.2 prepare_kernel_conf的依赖目标FORCE

依赖目标FORCE在“

Luci是OpenWrt中的一种Web界面管理工具,它基于Lua语言和MVC框架。它提供了一种友好且易于使用的方式来管理路由器设备,包括网络设置、软件安装、用户管理等等。下面是Luci的流程分析。 1. 用户请求 当用户在浏览器中输入路由器IP地址并访问时,就会向路由器发送一个HTTP请求。这个请求包含了用户请求的页面信息和参数。 2. HTTP服务器 路由器中运行着一个HTTP服务器,它接收用户的HTTP请求并将请求转发给Luci。 3. URL分发 Luci中的URL分发器会解析HTTP请求中的URL,并将其映射到对应的控制器和方法上。URL分发器是Luci的核心组件之一,它负责将用户请求与Luci后端代码进行关联。 4. 控制器 控制器是Luci的另一个核心组件,它接收URL分发器分发的请求并处理用户请求,包括输入参数验证、数据查询、业务逻辑处理等等。控制器会将处理后的结果返回给视图。 5. 视图 视图是Luci的界面组件,它负责将控制器返回的数据渲染成HTML页面并返回给用户。视图采用MVC模式,将业务逻辑和界面逻辑分离,从而提高代码的可维护性和可扩展性。 6. 数据库 Luci中使用SQLite作为默认的数据库,用于存储和管理路由器设备的配置信息、用户信息等等。控制器会调用数据库API,从数据库中读取或写入数据,从而支持Luci的各种功能。 7. 系统调用 Luci还提供了一些系统调用接口,用于执行系统命令、读取系统信息等等。控制器可以通过系统调用来获取系统状态、执行网络管理等操作。 以上就是Luci的流程分析,Luci的设计理念是简单、易用、可扩展。通过良好的代码架构和设计模式,Luci提供了一种高效、安全、可靠的管理方式,使得路由器设备的管理变得更加简单和方便。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值