执行do_cleansstate后如何恢复Yocto缺失的sstate manifests?
问题描述
执行bitbake -c do_cleansstate <recipe>后手动删除了tmp/sstate-control文件夹,重建时触发报错:
core-image-full-cmdline-1.0-r0 do_prepare_recipe_sysroot: The sstate manifest for task 'XXXX:populate_sysroot' (multilib variant '') could not be found
同时列出大量缺失的populate_sysroot清单,尝试单独执行do_populate_sysroot无效,希望找到全量重建外的修复方法,且疑惑do_cleansstate未实现彻底清理。
可行修复方法
清理sysroot并强制生成populate_sysroot
先清理目标recipe的sysroot缓存,再强制重新生成相关内容:bitbake -c do_clean_sysroot <recipe> bitbake -c do_populate_sysroot -f <recipe>-f参数用于强制绕过任务已完成的标记,重新执行任务。重建sstate-control索引
由于手动删除了全局的sstate-control目录,可通过以下命令重新生成整个sstate索引清单:bitbake -c sstate_index -f <recipe>该命令会补全缺失的manifest文件,恢复sstate的依赖追踪。
针对性修复缺失的依赖recipe
针对报错中提到的XXXX:populate_sysroot对应的依赖recipe,单独执行清理和重建:bitbake -c do_cleansstate XXXX bitbake -c do_populate_sysroot XXXX完成后再重新构建目标recipe即可。
关于do_cleansstate的说明
do_cleansstate仅负责清理目标recipe自身的构建产物和对应sstate缓存,不会处理全局的sstate-control目录——这个目录是记录所有sstate任务的索引清单,手动删除会破坏整个构建系统的sstate依赖追踪逻辑,这就是导致报错的核心原因。
内容的提问来源于stack exchange,提问作者Ulfhetnar

