标签(空格分隔): Makefile


本周是成胖子每周一博第六周,更好地阅读体验,请点击这里


前言

前面我们已经讲了openwrt编译的大部分过程,包括大致的编译步骤,ipk的编译等.今天是我这个系列的最后一篇,我们来看看openwrt的各个部分是如何组织成为最后的bin文件的.

最后一个步骤,我们的执行的目标是target/install.

执行过程推导

我们首先通过Makefile来分析下我们的依赖关系.

通过前几篇的分析,我们应当知道此时target/install将依赖于target/linux/install.

如下是target/linux/Makefile的节选:

export TARGET_BUILD=1

prereq clean download prepare compile install menuconfig nconfig oldconfig update refresh: FORCE
@+$(NO_TRACE_MAKE) -C $(BOARD) $@

我们可以看出,此时执行compile将会进入对应的目标平台执行目标compile,我们以mt7620a为例.它属于ramips平台.

如下是target/linux/ramips/Makefile的节选:

include $(INCLUDE_DIR)/target.mk

$(eval $(call BuildTarget))

在这个Makefile文件中,我们找不到目标compile,它被文件target.mk封装.我们在ipk的编译中,已经见过类似的用法.

如下是include/target.mk的节选:

ifeq ($(TARGET_BUILD),1)
include $(INCLUDE_DIR)/kernel-build.mk
BuildTarget?=$(BuildKernel)
endif

从上面的节选我们看到变量TARGET_BUILD为1,所以这里函数BuildTarget其实等于在kernel-build.mk定义的变量BuildKernel.

如下是include/kernel-build.mk的节选:

define BuildKernel
$(if $(QUILT),$(Build/Quilt))
$(if $(LINUX_SITE),$(call Download,kernel)) $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TOPDIR)/.config
$(Kernel/Configure)
touch $$@ $(LINUX_DIR)/.image: $(STAMP_CONFIGURED) $(if $(CONFIG_STRIP_KERNEL_EXPORTS),$(KERNEL_BUILD_DIR)/symtab.h) FORCE
$(Kernel/CompileImage)
$(Kernel/CollectDebug)
touch $$@ install: $(LINUX_DIR)/.image
+$(MAKE) -C image compile install TARGET_BUILD= endef

我们绕来绕去,终于找到了我们要的目标,install依赖于$(LINUX_DIR)/.image,

$(LINUX_DIR)/.image的依赖和执行就在节选中,我们略过,

同时将进入image文件夹下,执行目标compileinstall.下面我来看看进入image文件夹下,发生的故事.

打开tareget/linux/ramips/image/Makefile,我们找了一圈,也没找到我们要的目标compileinstall;如果我们是完整编译,其实目标compile已经被执行过了.此时我们以install为目标.玄机就在最后一句$(eval $(call BuildImage))中,函数BuildImage被定义在include/image.mk中,以下为节选:

define BuildImage

  ifeq ($(IB),)
.PHONY: download prepare compile clean image_prepare mkfs_prepare kernel_prepare install
compile:
$(call Build/Compile) clean:
$(call Build/Clean) image_prepare: compile
mkdir -p $(KDIR)/tmp
$(call Image/Prepare)
else
image_prepare:
mkdir -p $(KDIR)/tmp
endif mkfs_prepare: image_prepare
$(call Image/mkfs/prepare) kernel_prepare: mkfs_prepare
$(call Image/BuildKernel)
$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(if $(IB),,$(call Image/BuildKernel/Initramfs)))
$(call Image/InstallKernel) $(foreach device,$(TARGET_DEVICES),$(call Device,$(device)))
$(foreach fs,$(TARGET_FILESYSTEMS) $(fs-subtypes-y),$(call BuildImage/mkfs,$(fs))) install: kernel_prepare
$(foreach fs,$(TARGET_FILESYSTEMS),
$(call Image/Build,$(fs))
)
$(call Image/mkfs/ubifs)
$(call Image/Checksum,md5sum --binary,md5sums)
$(call Image/Checksum,openssl dgst -sha256,sha256sums) endef

这里我们看到了我们的目标install和它的依赖关系及执行语句,这里$(TARGET_FILESYSTEMS)通常为squashfs.其中大部分函数定义在我们对应平台的image文件夹下的Makefile中.

上文中第28行需稍加注意,这里调用函数BuildImage/mkfs,定义如下:

define BuildImage/mkfs
install: mkfs-$(1)
.PHONY: mkfs-$(1)
mkfs-$(1): mkfs_prepare
$(Image/mkfs/$(1))
$(call Build/mkfs/default,$(1))
$(call Build/mkfs/$(1),$(1))
$(KDIR)/root.$(1): mkfs-$(1)
endef

这里可以看到目标install依赖于mkfs-(1).

如此我们可以得到整个依赖关系图如下:



图片不清晰可以下载下来查看.

稍加解释

上一节我们分析了依赖关系,执行过程其实就是倒叙执行的过程.

主要编辑过程就是先将内核编译完成,然后将安装ipk的root-ramips文件夹制作为squash格式的二进制文件,然后包括压缩内核,为内核制作头部,最后将加工过的内核部分和文件系统部分组合起来.

尾记

  1. 在网上查找资料的时候,发现大部分资料要么雷同,要么浅尝辄止.
  2. 下面这篇文章在我深入学习的过程中,起了不小的作用.链接;就是排版太差了,我才有了自己写写的冲动.
  3. openwrt的整个编译过程是很复杂的,想想电脑一秒可以做多少次计算,而一次完整编译轻轻松松就要两三个小时.可想而知编译过程之复杂.但是我觉得我把大体的编译过程是弄明白了,也欢迎大家交流.一共用了5篇的篇幅,大体的编译过程也算是交代完了.
  4. 纸上得来终觉浅,下面我觉得我还需要更多的改改写写来加深了解.最近在瞎看看linux内核相关的东西,那本书上也说了要加深学习了解,需要更多的修修补补.与大家共勉.

(五) openwrt打包过程的更多相关文章

  1. Android应用程序(APK)的编译打包过程

    (9878) (7) 现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的 ...

  2. 【转】android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程.   流程概述: 1.打包资源文件,生成 ...

  3. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...

  4. Android系统的镜像文件的打包过程

    在前面一篇文章中,我们分析了Android模块的编译过程.当Android系统的所有模块都编译好之后,我们就可以对编译出来的模块文件进行打包了.打包结果是获得一系列的镜像文件,例如system.img ...

  5. android Apk打包过程概述_android是如何打包apk的

    流程概述:1.打包资源文件,生成R.java文件2.处理aidl文件,生成相应java 文件3.编译工程源代码,生成相应class 文件4.转换所有class文件,生成classes.dex文件5.打 ...

  6. android基础-Apk打包过程(了解)

    此文来源于<Android软件安全与逆向分析> 一.打包资料文件,生成R.java文件. 二.处理aidl文件,生成相应的Java文件. 三.编译工程源代码,生成相应的class文件. 四 ...

  7. iOS 用命令实现简单的打包过程

    `xcode-select --print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication // 获得打包 ...

  8. 使用meaven打包过程中遇到的一些问题

    开始使用如下代码进行打包 <build> <!-- mvn assembly:assembly -Dmaven.test.skip=true --> <plugins&g ...

  9. rpm打包过程

    [需求] 接触那么久的Linux,还没有试验过怎么打rpm包 [过程] 1.rpm打包准备工作 系统默认的rpmbuild的相关路径

随机推荐

  1. 区间合并 --- Codeforces 558D : Gess Your Way Out ! II

    D. Guess Your Way Out! II Problem's Link: http://codeforces.com/problemset/problem/558/D Mean: 一棵满二叉 ...

  2. 译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志

    译文出处:http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC 在 ...

  3. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  4. sql:Oracle11g 表,视图,存储过程结构查询

    -- Oracle 11 G --20160921 涂聚文再次修改 --Geovin Du --GetTables SELECT owner, object_name, created FROM al ...

  5. Wijmo金融图表系列之平均K线图&砖形图

    2015年7月16日将会发布有史以来最令人兴奋的控件-Wijmo 金融图表,它的一体化设计为单个自定义集合提供了所有主要的金融图表,这是市场上的其他控件都不具备的独一无二的好处.它像Wijmo其他任意 ...

  6. spring报nested exception is java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected错误

    http://www.oschina.net/question/1539472_159699

  7. 我所了解的WEB开发(3) - 彩虹的颜色

    据说彩虹有七彩颜色,从外至内分别为:红.橙.黄.绿.青.蓝.紫.这些我倒是没有验证过,但是学生时代就不止一次色盲检测,还是让我足够确信对颜色的分辨应该和大多数人相似的. 还听说大多数哺乳动物是色盲.如 ...

  8. [经验][JS]如何观察网站,进而模仿

    应该存在着一类人: 1.看到美丽的网站时,就会F12,看看他是怎么实现的 2.看到网站数据是自己需要的时候,就会F12,看看他是怎么拿到数据的 3.看到网站一个有趣的模块时,,就会F12,看看他是怎么 ...

  9. RHEL7文件归档与压缩

    本文介绍RHEL7.2文件的归档和压缩 文件归档 归档的好处:方便使用.查询.阅读,易于管理 (批量删除文件) 常用操作 命令:tar 作用:将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中 ...

  10. SharePoint 网站登录不上,3次输入用户名/密码白页

    新搭建的SharePoint 2013环境,第一次干的这么憋屈的慌,先是接了一个Ghost的服务器,装好的服务器.Sql.SharePoint.VS等一系列,却发现怎么都登陆不上去,输入账号3次以后白 ...