如何让BitBake在清理/重建Recipe B时自动清理依赖的Recipe A?
我们有一个依赖于Recipe B的Recipe A。当执行bitbake -c cleanall B然后bitbake core-image-minimal重新构建Recipe B时,Yocto会先正确构建B,之后尝试构建A,但Recipe A在未先清理的情况下执行configure、compile等步骤会出错。有没有办法让BitBake在清理(或重建)Recipe B时自动清理Recipe A?
补充说明
实际场景中有多个Recipe构建失败,比如fsbl的错误日志如下:
| ERROR: Execution of '[...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/temp/run.do_configure.581607' failed with exit code 1: | MISC_ARG is -yamlconf [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/fsbl.yaml -lib libmetal | APP_ARG is -app "Zynq MP FSBL" | Using xsct from: /opt/Xilinx/Vitis/2020.2/bin/xsct | cmd is: xsct -sdx -nodisp [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/app.tcl -ws [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/build -pname fsbl -rp [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/git -processor psu_cortexa53_0 -hdf [...]/yocto/build/tmp/deploy/images/zcu216-zynqmp/Xilinx-zcu216-zynqmp.xsa -arch 64 -app "Zynq MP FSBL" -yamlconf [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/fsbl.yaml -lib libmetal | INFO: [Hsi 55-2053] elapsed time for repository (/opt/Xilinx/Vitis/2020.2/data/embeddedsw) loading 0 seconds | INFO: Update hw fsbl_plat project | Loading the sw platform from [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/build/fsbl_plat/platform.spr | Reading the platform : "fsbl_plat" | Opening the hardware design, this may take few seconds. | Failed to generate bsp for application zynqmp_fsbl | while executing | "builtin_platform -addbootdomains " | (procedure "platform" line 393) | invoked from within | "platform create -name $params(hwpname) -hw $params(hdf) -out $params(ws)" | invoked from within | "if { $params(ws) ne "" } { | #Local Work Space available | if { $params(pname) ne "" } { | # hwpname/bspname is empty then default it to pname+_hwproj/b[...]" | (file "[...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/app.tcl" line 139) | WARNING: [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/temp/run.do_configure.581607:1 exit 1 from 'eval xsct -sdx -nodisp [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/app.tcl -ws [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/build -pname fsbl -rp [...]/yocto/build/tmp/work/zcu216_zynqmp-poky-linux/fsbl/2020.2+gitAUTOINC+08b9f4304d-r0/git -processor psu_cortexa53_0 -hdf [...]/yocto/build/tmp/deploy/images/zcu216-zynqmp/Xilinx-zcu216-zynqmp.xsa -arch 64 ${APP_ARG} ${MISC_ARG}'
此外还有其他Recipe构建失败,部分错误信息不同。基于make的Recipe失败时,错误提示类似cannot find some_directory.new,后续会补充更多细节,只是这些错误的复现性较差。
针对BitBake清理依赖Recipe时自动清理下游Recipe的需求,有以下几种可行方法:
1. 手动清理下游Recipe
如果依赖关系明确,直接手动清理所有依赖B的Recipe:
bitbake -c cleanall A bitbake core-image-minimal
如果有多个依赖Recipe,可以批量处理:
bitbake -c cleanall A C D bitbake core-image-minimal
2. 使用BitBake依赖追踪自动清理
BitBake提供依赖链分析工具,先找出所有依赖B的Recipe:
bitbake -g core-image-minimal && cat pn-depends.dot | grep -E "-> \"B\"" | cut -d'"' -f2 > depends-on-B.txt
然后批量清理这些Recipe:
bitbake -c cleanall $(cat depends-on-B.txt) bitbake core-image-minimal
执行完毕后可删除临时生成的pn-depends.dot和depends-on-B.txt文件。
3. 修改Recipe依赖关系(长期维护方案)
如果需要长期解决该问题,在Recipe A的配方文件中添加关联清理任务:
# 在Recipe A的.bb文件中添加 do_cleanall[depends] += "B:do_cleanall"
这样执行bitbake -c cleanall B时,会自动触发A的cleanall任务。若有多个依赖Recipe,可批量添加:
do_cleanall[depends] += "B:do_cleanall C:do_cleanall"
4. 自定义Shell脚本自动化流程
编写Shell脚本自动完成清理依赖Recipe和构建的全流程:
#!/bin/bash # 清理Recipe B bitbake -c cleanall B # 获取所有依赖B的Recipe bitbake -g core-image-minimal && cat pn-depends.dot | grep -E "-> \"B\"" | cut -d'"' -f2 > depends-on-B.txt # 清理依赖Recipe bitbake -c cleanall $(cat depends-on-B.txt) # 启动构建 bitbake core-image-minimal # 清理临时文件 rm pn-depends.dot depends-on-B.txt
保存为rebuild-with-deps.sh,赋予执行权限后运行:
chmod +x rebuild-with-deps.sh ./rebuild-with-deps.sh
内容的提问来源于stack exchange,提问作者Schottky

