如何在Yocto构建中添加boot.scr且不修改厂商bbappend
问题
我有一个厂商提供的Yocto项目,该项目已通过u-boot-imx_%.bbappend对u-boot-imx进行追加配置。我希望为项目添加更多u-boot环境变量,但不想修改或替换厂商提供的bbappend文件,避免后续厂商更新时受影响。
实际上我希望添加boot.scr文件到生成的镜像中,从而在启动过程中完成环境变量的修改。构建过程中生成的u-boot-inital-env已包含script=boot.scr这一行。我的问题是:如何在Yocto构建过程中添加boot.scr文件?
uboot-config.bbclass中有如下说明:
Additional environment variables or a script can be installed alongsideu-boot to be used automatically on boot. This file, typically 'uEnv.txt'or 'boot.scr', should be packaged along with u-boot as well as placed in thedeploy directory. Machine configurations needing one of these files shouldinclude it in the SRC_URI and set the UBOOT_ENV parameter.
是否可以创建额外的append或补丁,将该文件与u-boot打包并存放到deploy目录中?
解决方案
完全可以通过创建独立的追加文件实现,无需修改厂商提供的配置,具体步骤如下:
在自定义Layer中创建新的bbappend文件
在你自行维护的Yocto Layer(比如meta-yourlayer)里,新建recipes-bsp/u-boot/u-boot-imx_%.bbappend文件,该文件会和厂商的bbappend文件共同生效,互不冲突。引入boot.scr源文件并配置核心参数
在新的bbappend中添加以下内容:# 引入boot.cmd文本脚本(推荐用cmd文件方便编辑,后续编译为boot.scr) SRC_URI += "file://boot.cmd" # 指定要打包的环境脚本文件 UBOOT_ENV = "boot.scr"把你的
boot.cmd文件放在自定义Layer的recipes-bsp/u-boot/files/目录下,文件内编写需要添加的u-boot环境变量逻辑。添加boot.scr的编译步骤
boot.scr需要通过mkimage工具编译boot.cmd生成,在bbappend中追加编译逻辑:do_compile:append() { if [ -f ${WORKDIR}/boot.cmd ]; then ${STAGING_BINDIR_NATIVE}/mkimage -C none -A arm -T script -d ${WORKDIR}/boot.cmd ${WORKDIR}/boot.scr fi }若目标架构不是arm,将
-A arm替换为对应架构(如aarch64)。自动完成打包与部署
结合uboot-config.bbclass的内置逻辑,上述配置会自动完成:- 将生成的
boot.scr打包到u-boot软件包,最终出现在镜像的/boot目录下 - 同步复制到Yocto的
deploy/images/<machine>/目录中
- 将生成的
这样就实现了不修改厂商配置的前提下添加自定义boot.scr的需求,后续厂商更新项目时,你的自定义配置不会被覆盖。
内容的提问来源于stack exchange,提问作者user7063051

