Openwrt实践过程--编译过程

1.注意点

a.make -n可打印makefile执行的命令,而不执行
b.在规则的命令中增加echo跟踪执行进度

2.顶层Makefile分析

第一个编译目标world是make的默认编译目标
编译简单可划分为两个逻辑:

world:
ifndef ($(OPENWRT_BUILD),1)
# 第一逻辑
else
# 第二逻辑
endif

第一逻辑
make V=99时, O P E N W R T B U I L D 没 有 定 义 赋 值 , 所 以 总 是 执 行 “ 第 一 逻 辑 ” , “ 第 一 逻 辑 ” 结 束 时 再 次 执 行 m a k e w o r l d , 此 时 OPENWRT_BUILD没有定义赋值,所以总是执行“第一逻辑”,“第一逻辑”结束时再次执行make world,此时 OPENWRTBUILDmakeworldOPENWRT_BUILD=1,所以执行“第二逻辑”。toplevel.mk中%::解释world目标的规则。

第二逻辑
首先就引入了target, package, tools, toolchain这四个关键目录里的Makefile文件。

include target/Makefile
include package/Makefile
include tools/Makefile
include toolchain/Makefile

这些子目录里的Makefile使用include/subdir.mk里定义的两个函数来动态生成规则,这两个函数是subdir和stampfile。 subdir会遍历参数子目录,执行make -C操作。stampfile可以简单的看作:

对于target分别生成了:$(target/stamp-prereq), $(target/stamp-compile), $(target/stamp-install)
对于toolchain分别生成了 : $(toolchain/stamp-install)
对于package分别生成了: $(package/stamp-prereq),$(package/stamp-cleanup), $(package/stamp-compile),$(package/stamp-install)
对于tools分别生成了 : $(tools/stamp-install)

依赖关系如下:

$(toolchain/stamp-install): $(tools/stamp-install)
$(target/stamp-compile): $(toolchain/stamp-install) $(tools/stamp-install) $(BUILD_DIR)/.prepared
$(package/stamp-compile): $(target/stamp-compile) $(package/stamp-cleanup)
$(package/stamp-install): $(package/stamp-compile)
$(target/stamp-install): $(package/stamp-compile) $(package/stamp-install)

基本上就是toolchain依赖tools,target依赖toolchain,package依赖target,最后target/stamp-install依赖package。

3.kernel编译

编译kernel时clean/prepare/compile/install目标规则出现,涉及的Makefile包括:include/kernel-build.mk,include/kernel-defaults.mk。

4.firmware编译

firmware由kernel和rootfs两个部分组成,要对两个部分先分别处理,然后再合并成一个.bin文件。target/linux/xxxx/image/Makefile中最后定义了生成image的规则:$(eval $(call BuildImage)),本文件中也定义了生成Image镜像(包含ubifs镜像)的规则,编译kernel的compile或install时也会执行image下的compile和install。include/image.mk定义BuildImage命令包。

kernel处理

install–>kernel_prepare -->mkfs_prepare -->image_prepare --> $(call Image/Prepare)
主要处理命令包为:Image/BuildKernel,将设备树和镜像打包成镜像树文件:
define Image/BuildKernel

rootfs处理

生成squashfs文件系统镜像
install–>kernel_prepare -->mkfs_prepare --> ( c a l l I m a g e / m k f s / p r e p a r e ) i n s t a l l − − > k e r n e l p r e p a r e − − > (call Image/mkfs/prepare) install-->kernel_prepare --> (callImage/mkfs/prepare)install>kernelprepare>(call BuildImage/mkfs,$(fs))

镜像打包

install --> $(call Image/mkfs/ubifs)

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值