(四) openwrt单个ipk编译过程

Tags : Makefile


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


前言

前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单个ipk的编译过程.在开发者进行二次开发的时候,我们既可以单个编译ipk也可以完整编译整个镜像文件.在完整编译的时候,我们选中的单个ipk同样会被编入镜像文件中,所以完整编译同样会进行单个ipk包的编译.

我们前面在stampfile函数部分提高过,当编译目标为package/stamp-compile的时候,实际执行的目标为package/compile;同时根据subdir函数的定义,package/compile将会依赖于package文件夹下被make menuconfig选中的子文件夹的compile.简而言之,当我们执行make package/compile相当于对所有选中的文件夹执行make package/XXX/compile.


ipk Makefile分析

我们以一个具体的包的编译过程来看看,本文我们以package/network/services/dropbear这个包为例.当我们在命令行中输入make package/network/services/dropbear/compile的时候,make将会读入dropbear下的Makefile文件,同时目标指定为compile.1

因为空间问题,我在这里不展开具体的Makefile文件.相信能看这篇博客的同学应该都有源码,自己打开便是.
下面我们根据GNU make语法来分析这个Makefile文件.它包含了两个.mk文件:一个是rules.mk,另一个是package.mk.

rules.mk
: 这个文件我们前文已经提到过了,主要是大量变量的定义.包括各种路径的定义,编译器的定义等等.其中要说明的是.config文件也是这里被包含进来的.

package.mk
: 这个文件首先定义和补充了一些变量.其次是openwrt为我们封装了BuildPackage函数,对于普通开发者而言,只需要参照模板定义相应的变量,最后调用这个函数即可.

其余的我们可以认为是变量的赋值语句,很明显使用它们的地方并不在这里.关于模板和变量值的说明及作用.,你可以参照官方说明,也可以在网上找到一大堆资料.

最后,最重要的语句是这一句:

$(eval $(call BuildPackage,dropbear))

这里将会把dropbear作为参数值传给函数BuildPackage

Tips
: 不知道大家还记得我们Makefile的执行顺序么?Makefile是先读入所有信息,展开,然后生成依赖关系.最后再按依赖关系先后来执行.


依赖关系

BuildPackage分析

BuildPackage的定义在package.mk中,定义如下:

define BuildPackage
  $(Build/IncludeOverlay)
  $(eval $(Package/Default))
  $(eval $(Package/$(1)))

ifdef DESCRIPTION
$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description)
endif

ifndef Package/$(1)/description
define Package/$(1)/description
    $(TITLE)
endef
endif

  BUILD_PACKAGES += $(1)
  $(STAMP_PREPARED): $$(if $(QUILT)$(DUMP),,$(call find_library_dependencies,$(DEPENDS)))

  $(foreach FIELD, TITLE CATEGORY SECTION VERSION,
    ifeq ($($(FIELD)),)
      $$(error Package/$(1) is missing the $(FIELD) field)
    endif
  )

  $(if $(DUMP), \
    $(Dumpinfo/Package), \
    $(foreach target, \
      $(if $(Package/$(1)/targets),$(Package/$(1)/targets), \
        $(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg) \
      ), $(BuildTarget/$(target)) \
    ) \
  )
  $(if $(PKG_HOST_ONLY)$(DUMP),,$(call Build/DefaultTargets,$(1)))
endef

那么这里的$(1)就是指的传入的参数dropbear.这里包含了一些检查和补充变量定义.继续深究下去的线索是第25~32行之间.这里我将它简化后就是展开BuildTarget/ipkg;同时第33行,将dropbear当作参数传给函数Build/DefaultTargets.

BuildTarget/ipkg定义在package-ipkg.mk中,我们需要重点关注其中的冒号,这个形成我们的依赖关系.
Build/DefaultTargets定义在package.mk中,其中形成了我们stamp-*的依赖关系.根据这些依赖关系,我将关系图绘制如下:
package/compile

执行

当我们得出依赖关系后,执行过程就是倒序进行而已,即从上图的右边向左执行.这也可以和我们预料的执行过程相印证.

$(stamp-prepared)
: 主要完成代码包的准备工作,如果开发者定义了build/prepare,则执行build/prepare.如果开发者未定义,则执行build/prepare/default这其中包含了多个情形,最为常见的是将dl下的压缩包解压并打上patch.

$(stamp-built)
: 这个将会进入到build_dir/target-XXX/下对应的文件夹进行编译.同时将会带入一些定义好的变量.比如CFLAGS,LDFLAGS.

IPKG_(1)
: 这个目标将会将编译好的文件安装到对应的ipkg-arch目录下,同时将这个目录打包为ipk文件.


尾记

本周博客基本就到这里,本来私心想着元旦没啥大事,可以写两篇的.结果混着混着就到第三天晚上了.剩下的最后一篇我们看看单个的ipk编译好了,内核的编译过程,最后的打包过程.整个镜像文件由哪些部分组成.下周再见.


  1. 全部过程分析请参见前文,至少还应包含必要的检查,tools和toolchain的编译.这里因为我们主要分析单个ipk的编译过程,所以我将之略过

转载于:https://www.cnblogs.com/chengyi818/p/5096701.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenWRT中安装IPK(包)是一个相对直接的过程,主要是通过命令行终端来进行操作。以下是步骤概览: ### 安装前准备 1. **登录设备**:首先需要登录到您的OpenWRT设备上。 2. **确认权限**:确保您有足够的权限去修改系统文件或安装额外软件。通常在SSH终端下输入`su`然后按提示键入密码即可获得root权限。 ### 下载IPK文件 您可以从OpenWRT官方网站或者其他可信的开源社区下载IPK文件。网站提供了一个专门的页面用于查找和下载适用于特定硬件平台的IPK文件。 ### 使用opkg安装IPK文件 一旦您有了IPK文件,可以按照以下步骤进行安装: ```bash # 首先更新本地的opkg缓存 opkg update # 接着使用opkg命令安装下载的IPK文件 opkg install <IPK_FILE_NAME>.ipk ``` 将 `<IPK_FILE_NAME>` 替换为您实际下载的IPK文件名。例如,如果您下载的是 `example_app.ipk`,则应使用: ```bash opkg install example_app.ipk ``` ### 检查安装状态 安装完成后,可以通过检查opkg的状态来验证是否成功: ```bash opkg list-installed | grep <IPK_FILE_NAME> ``` 这将显示安装的IPK文件信息以及相关的依赖。 ### 相关问题 - OpenWRT IPK安装指南 1. **为什么opkg无法找到我的IPK文件?** - 确保您已更新opkg缓存,并尝试重新连接服务器。 - 确认IPK文件路径是否正确。 2. **如何解决opkg安装过程中遇到的权限问题?** - 当您尝试安装新软件时,可能会遇到缺少必要的文件或目录的问题。通常这是由于用户权限不足导致的。 - 使用`sudo opkg install <IPK_FILE_NAME>.ipk`(针对非root用户),或者使用前面提到的`opkg update && opkg install <IPK_FILE_NAME>.ipk`组合,确保所有必要组件都可用并允许安装。 3. **安装某个IPK后系统重启了怎么办?** - 很有可能是该软件有重启服务作为其一部分的操作,或是配置更改触发了重启。 - 您可以在安装后检查日志或监控服务状态,以了解为何系统重启,并确保一切正常运行。 通过上述步骤,您应该能够顺利地在OpenWRT中安装IPK文件,并对可能出现的问题有基本的理解和处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值