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,此时 OPENWRT_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 --> (call BuildImage/mkfs,$(fs))

镜像打包

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

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

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/105680788