谷动谷力

 找回密码
 立即注册
查看: 786|回复: 0
打印 上一主题 下一主题
收起左侧

OpenWrt make menuconfig 构建过程

[复制链接]
跳转到指定楼层
楼主
发表于 2023-7-14 15:07:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
OpenWrt make menuconfig 构建过程

1.课题背景
之前在《20190614 OpenWrt如何添加驱动以及应用程序 谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于make menuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。
2. 分析过程2.1 OpenWrt目录下的Makefile
分析make menuconfig的过程也就是分析Makefile的过程,于是我们就从最上层的Makefile 开始。
我们看到它的目标是world,并且ifneq ($(OPENWRT_BUILD),1)成立,所以走的是上面的逻辑。如图:


通过分析,debug.mk,depends.mk,toplevel.mk。发现menuconfig的目标在topleve.mk中。debug.mk和depends.mk只是一些变量和函数的定义。所以我们重心就是在toplevel.mk上。
2.2 toplevel.mk
我们可以看到menuconfig的目标依赖和命令如下:


  • scripts/config/mconf是该文件中一个目标,如图:


它的作用就是编译,再scripts/config目录下生成mconf可执行文件。
  • prepare-tmpinfo是该文件中的一个目标,待会再陈述。
  • FORCE作用是强制去执行,因为我们知道,Makefile的原理是,只有当依赖文件中比目标文件要新,才会去执行相应的命令。所以有FORCE,就一定会执行。
  • 下面的shell语句:
if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \
          cp $(HOME)/.openwrt/defconfig .config; \
        fi
的意思是:当前目录下的.config不存在并且(HOME)/.openwrt/defconfig存在,就将(HOME)/.openwrt/defconfig拷贝一份为.config。由于我们不存在
  • <Config.in中的
最终就是:scripts/config/mconf Config.in。你可以尝试再终端输入该命令,看一下是什么效果。
现在再来看一下prepare-tmpinfo这个目标。如图:


第一行命令似乎没有什么作用;我就不赘诉了。
重点是第三行和第四行,我们可知是调用了scan.mk生成了packageinfo和targetinfo文件,具体的内容,我们待会再说。
后面根据shell语句进行处理:


其中,-nt是newer than的意思,用于判断文件的新旧,若t比f新,则为真。metadata.pl是perl语言文件,具体作用不清楚,不过应该是根据f文件生成t。
后面的几句都是类似的了,都是用于生成一些临时文件。
2.3 scan.mk
scan.mk中的目标是all,如图:


其中,(TMPDIR)/.(SCAN_TARGET)为依赖,因为scan.mk中的内容较多,大多是一些正则表达的内容,所以接下来我主要介绍思路,不会介绍过于详细,依赖如图:


命令中progress只是打印,不需要关心。其中-cat 表示出错也不提示,$(FILELIST)目标如下图:


其中FIND_L表示find -l,,命令行:
(callFINDL,(SCAN_DIR)) (SCANEXTRA)−mindepth1(if (SCANDEPTH),−maxdepth(SCAN_DEPTH)) -name Makefile | xargs grep -aHE ‘call(GREP_STRING)’ | sed -e ‘s#^ (SCAN_DIR)/##’ -e ‘s#/Makefile:.*##’ | uniq | awk -v of=(OVERRIDELIST)−finclude/scan.awk>
表示在(SCANDIR)目录中进行搜索Makefile的文件,再将所有的Makefile以′call(GREP_STRING)’字符串进行过滤,将其保存到
之前《如何在OpenWrt中添加应用程序和驱动程序》的ppt中介绍过,添加的每个Makefile在最后一句都是有
(eval(call BuildPackage,Packagename)),语句。因此在这里就会起到作用。由于篇幅关系,我们只要知道它会根据Package中的Makefile内容生成tmp/.packageinfo文件即可。其内容如图:


2.4 Config.in
在toplevel.mk中我们知道最终执行的是scripts/config/mconf Config.in。来生成图形界面,我们来看一下Config.in的内容:


从内容可知,Config.in的作用类似于一个配置文件,告诉mconf应该加载的文件路径。我们看一下tmp/.config-package.in里面的内容,如图:


有过linux内核开发经验的人可以看出,这里面的语法和linux 内核中Kconfig的语法一致。因此OpenWrt图形界面显示的语法和linux的是一样的,只不过是通过它的package机制进行了转化。
3 总结
通过上面的分析,我认为大致流程可概括如下:
  • 顶层Makefile调用toplevel.mk,执行其中的menuconfig 目标。
  • toplevel.mk的任务有以下几个:
    • 编译script/config/mconf
    • 调用scan.mk生成tmp/.packageinfo文件
    • 使用metadata.pl脚本根据tmp/.packageinfo生成tmp/.config-package文件
    • 调用script/config/mconf Config.in 生成图形配置界面
  • scan.mk的作用就是扫描package和target目录下的Makefile,根据Makefile中的内容生成tmp/.packageinfo,供metadata.pl使用
  • Config.in 只是配置文件,作为mconf的参数。


+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-29 18:43 , Processed in 0.080711 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表