OpenWrt make menuconfig 构建过程「建议收藏」

OpenWrt make menuconfig 构建过程「建议收藏」OpenWrtmakemenuconfig构建过程1.课题背景之前在《20190614OpenWrt如何添加驱动以及应用程序谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于makemenuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。2.分析过程2.1OpenWrt目录下的Makefile分析makemenuconfig的过程也…

大家好,又见面了,我是你们的朋友全栈君。

OpenWrt make menuconfig 构建过程

1.课题背景

之前在《20190614 OpenWrt如何添加驱动以及应用程序 谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于make menuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。

2. 分析过程

2.1 OpenWrt目录下的Makefile

分析make menuconfig的过程也就是分析Makefile的过程,于是我们就从最上层的Makefile 开始。

我们看到它的目标是world,并且ifneq ($(OPENWRT_BUILD),1)成立,所以走的是上面的逻辑。如图:

OpenWrt make menuconfig 构建过程「建议收藏」

 

通过分析,debug.mk,depends.mk,toplevel.mk。发现menuconfig的目标在topleve.mk中。debug.mk和depends.mk只是一些变量和函数的定义。所以我们重心就是在toplevel.mk上。

 

2.2 toplevel.mk

我们可以看到menuconfig的目标依赖和命令如下:

OpenWrt make menuconfig 构建过程「建议收藏」

 

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

OpenWrt make menuconfig 构建过程「建议收藏」

它的作用就是编译,再scripts/config目录下生成mconf可执行文件。

  1. prepare-tmpinfo是该文件中的一个目标,待会再陈述。
  2. FORCE作用是强制去执行,因为我们知道,Makefile的原理是,只有当依赖文件中比目标文件要新,才会去执行相应的命令。所以有FORCE,就一定会执行。
  3.  下面的shell语句:

if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \

          cp $(HOME)/.openwrt/defconfig .config; \

        fi

的意思是:当前目录下的.config不存在并且$(HOME)/.openwrt/defconfig存在,就将$(HOME)/.openwrt/defconfig拷贝一份为.config。由于我们不存在$(HOME)/.openwrt/defconfig。所以可以不用在意

  1. $<  Config.in中的$<是自动化变量,表示依赖中的第一个目标名,即scripts/config/mconf。

最终就是:scripts/config/mconf Config.in。你可以尝试再终端输入该命令,看一下是什么效果。

 

现在再来看一下prepare-tmpinfo这个目标。如图:

OpenWrt make menuconfig 构建过程「建议收藏」

第一行命令似乎没有什么作用;我就不赘诉了。

重点是第三行和第四行,我们可知是调用了scan.mk生成了packageinfo和targetinfo文件,具体的内容,我们待会再说。

后面根据shell语句进行处理:

OpenWrt make menuconfig 构建过程「建议收藏」

其中,-nt是newer than的意思,用于判断文件的新旧,若t比f新,则为真。metadata.pl是perl语言文件,具体作用不清楚,不过应该是根据f文件生成t。

后面的几句都是类似的了,都是用于生成一些临时文件。

 

2.3 scan.mk

 

scan.mk中的目标是all,如图:

OpenWrt make menuconfig 构建过程「建议收藏」

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

OpenWrt make menuconfig 构建过程「建议收藏」

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

OpenWrt make menuconfig 构建过程「建议收藏」

 

其中FIND_L表示find -l,,命令行:

$(call FIND_L, $(SCAN_DIR)) $(SCAN_EXTRA) -mindepth 1 $(if $(SCAN_DEPTH),-maxdepth $(SCAN_DEPTH)) -name Makefile | xargs grep -aHE ‘call $(GREP_STRING)’ | sed -e ‘s#^$(SCAN_DIR)/##’ -e ‘s#/Makefile:.*##’ | uniq | awk -v of=$(OVERRIDELIST) -f include/scan.awk > $@

表示在$(SCAN_DIR)目录中进行搜索Makefile的文件,再将所有的Makefile以’call $(GREP_STRING)’字符串进行过滤,将其保存到$(FILELIST)中。

 

之前《如何在OpenWrt中添加应用程序和驱动程序》的ppt中介绍过,添加的每个Makefile在最后一句都是有

$(eval $(call BuildPackage,Packagename)),语句。因此在这里就会起到作用。由于篇幅关系,我们只要知道它会根据Package中的Makefile内容生成tmp/.packageinfo文件即可。其内容如图:

 

OpenWrt make menuconfig 构建过程「建议收藏」

2.4 Config.in

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

OpenWrt make menuconfig 构建过程「建议收藏」

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

OpenWrt make menuconfig 构建过程「建议收藏」

有过linux内核开发经验的人可以看出,这里面的语法和linux 内核中Kconfig的语法一致。因此OpenWrt图形界面显示的语法和linux的是一样的,只不过是通过它的package机制进行了转化。

3 总结

通过上面的分析,我认为大致流程可概括如下:

  1. 顶层Makefile调用toplevel.mk,执行其中的menuconfig 目标。
  2. toplevel.mk的任务有以下几个:
    1. 编译script/config/mconf
    2. 调用scan.mk生成tmp/.packageinfo文件
    3. 使用metadata.pl脚本根据tmp/.packageinfo生成tmp/.config-package文件
    4. 调用script/config/mconf Config.in 生成图形配置界面
  3. scan.mk的作用就是扫描package和target目录下的Makefile,根据Makefile中的内容生成tmp/.packageinfo,供metadata.pl使用
  4. Config.in 只是配置文件,作为mconf的参数。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145132.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月12日 下午10:20
下一篇 2022年5月12日 下午10:40


相关推荐

  • 06 Redis主从库的数据同步

    06 Redis主从库的数据同步06Redis 主从库的数据同步前言一 采用读写分离的原因二 主从库间进行第一次同步三 主从级联模式分担全量复制时的主库压力四 主从库间网络断开后的增量复制五 repl backlog buffer 环形缓冲区总结前言 Redis 具有高可靠性 数据尽量少丢失 AOF 和 RDB 保证 服务尽量少中断 增加副本冗余量 即使有一个实例出现了故障 需要过一段时间才能恢复 其他实例也可以对外提供服务 不会影响业务使用 Redis 的主从库模式 以保证数据副本的一致 主从库之间采用的是读写分离的方

    2026年3月19日
    2
  • 全链路解析:OpenClaw 本地智能体部署与获取OpenAI API KEY调度全攻略

    全链路解析:OpenClaw 本地智能体部署与获取OpenAI API KEY调度全攻略

    2026年3月13日
    2
  • Nginx的默认端口是_https默认端口

    Nginx的默认端口是_https默认端口我们前面一篇说了nginx的默认端口是80,可是空说无凭,我们用事实来说话。我们首先用whereisnginx.conf来看一下哪些目录里面有nginx.conf文件,我们看到了一共有6个目录,这里是应该分别到这六个文件里面去看一下,但是由于我们提前找过了,是/etc/nginx这个目录,所以我们就直接到该目录下面,即采用cd来切换目录,下图已经把这个文件标出来了。接着,我们查看…

    2025年10月8日
    6
  • VS PDB文件详解

    VS PDB文件详解转自https://blog.csdn.net/feihe0755/article/details/54233714PDB文件的介绍PDB(ProgramDataBase),意即程序的基本数据,是VS编译链接时生成的文件。PDB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB…

    2022年5月5日
    145
  • pycharm2021激活码下载(JetBrains全家桶)

    (pycharm2021激活码下载)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月21日
    65
  • mysql锘縖_根据中文字符串查询拼音声母

    mysql锘縖_根据中文字符串查询拼音声母说明 准备出一个系列 所谓精髓讲 C 语言要点 这个系列没有先后顺序 不过尽量做到精 可能会不断增删整理 本系列最原始出处是 csdn 博客 谢谢关注 C 精髓第四讲 GridVie region 汉字首字母列表 privatestati strChineseCh A 阿啊锕嗄厑哎哀唉埃挨溾锿鎄啀捱皑凒溰嘊敳皚癌毐昹嗳矮蔼躷噯藹譪霭靄艾伌爱砹硋隘嗌塧嫒愛碍暧瑷僾壒嬡

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号