天天看点

OpenWRT开发之——BuildPackage剖析前言正文结语

但是有个问题博主始终没有弄明白。为什么我们 make 一下,管理器就为我们从网上仓库下载软件源码,并编译打包。这个过程是怎么回事儿?还有,为什么我们在 package/<包名>/ 下的makefile文件下的最后一行是:

这句话的语意是什么?buildpackage是什么?

带着这个问题,我们今天来研究一下 buildpackage 以及展开后的makefile全貌。

我们还是来看看一个完整的makefile内貌,如cpp11-demo的makefile:

知道makefile基本语法的同学们都知道 define xxxx ... endef 其实就是给 xxxx 变量赋值,只不过是多行文本而已。

依此,可以将上面的简化为:

从上面,没有看到一个目标的定义,如下面这样:

那,这些目标在哪里?

玄机就在最后一行的buildpackage,它根据上面定义的变量生成了所有上面的一切。

$(eval <text>),是将<text>作为makefile文件中的一部分。

$(eval $(call buildpackage,cpp11-demo)),是引用buildpackage变量中的内容,并将内部中的$(1)替换为cpp11-demo,然后将处理后的内部作为makefile的一部分。

buildpackage 变量定义在 include/package.mk 文件中。

tip1

buidpackage的第一行就是:$(build/includeoverlay),其定义:

build/includeoverlay作用就是 inlcude $(topdir)/overlay/*/$(pkg_name).mk 文件。

比如我要更改lua这个包里面的某个变量,如果我们直接修改 package/xx/lua/makefile 文件,总有不妥之处。因为这个文件是从网上源码上同步下来的。我们最好不要去直修改它们。若需要用户自定义某些内容,不防使用overlay。就是在 trunk/overlay/ 路径下的任意子目录下建立与包名对应的 .mk 文件,比如lua,那么就建 lua.mk。

我们在 trunk/overlay/xxx/lua.mk 文件里重新定义我们的变量或操作。

tip2

其中第9~13行:

如果没有定义package/$(1)/description,那么就以$(title)来定义一个默认的。这里$(1)为 "cpp11-demo"。

tip3

将cpp11-demo追加到变量 build_packages 后面,可能是将来编译的时候需要。

tip4

如果 $(quilt)$(dump) 都没有定义,那么以$(depends)为参引用 find_library_dependencies 变量。

其中 find_library_dependencies 定义如下:

博主暂不解释,有点复杂,略过。其功能应该是找出依赖的库。

生成:

tip5

这几句是判断 field, title, category, section, version 这几个变量有没有定义,如果没有定义那就就报错。

tip6

虽然写得有点复杂,但意思是:

将 package/$(1)/targets 或 pkg_targets 中的每一项或 ipk 作为$(target),引用 $(buildtarget/$(target))。其中:

buildtarget/bin 定义在 include/package-bin.mk

buildtarget/ipk 定义在 include /package-ipk.mk

具体这两个变量的内容博主暂时不去研究。其内容莫非是描述如何生成bin与ipk目标。这里留个引子,下次再研究。

如果没有定义 package/$(1)/targets 与 pkg_targets,那么上次就默认将ipk作为target,引用 buildtarget/ipk 变量了。

tip7

如果没有定义 pkg_host_only 与 dump,那么这句可以简化为:

即默认的目标构建。

如下为 build/defaulttargets 的定义:

<明日再续>

若想与博文一起研究新技术,请关注我吧!

下一篇: vsftp