前言
前一篇博客中,我们已经知道整个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