如何从核心镜像配方获取指定配方的PN-src RPM包?
核心镜像配方收集指定RPM源码包的实现指引
获取指定配方的TARGET与版本
- 直接利用BitBake内置能力获取元数据:
- 要获取配方的存放路径,使用
${@bb.parse.BBHandler.get_file_location('你的配方名')},从路径中可提取TARGET相关信息; - 版本信息可通过配方的
${PV}变量获取,若要在核心配方中提取指定配方的版本,执行bitbake -e 目标配方名 | grep '^PV='即可; - 完整的部署路径(即你提到的
deploy/[TARGET]/)可通过bitbake -e 目标配方名输出中的DEPLOY_DIR_RPMS变量直接拿到。
- 要获取配方的存放路径,使用
复用现有工具复制RPM源码包
- 无需自行编写find逻辑,直接结合BitBake变量与简单脚本实现:
- 在核心配方的自定义任务中,遍历指定的配方列表,通过
bitbake -e获取每个配方的部署路径,再复制对应的源码包; - 示例脚本逻辑(嵌入配方任务):
# 先在配方中定义要收集的配方列表,比如:SRC_RPM_RECIPES = "recipeA recipeB" mkdir -p ${WORKDIR}/tmp_src_rpms for recipe in ${SRC_RPM_RECIPES}; do deploy_path=$(bitbake -e $recipe | grep '^DEPLOY_DIR_RPMS=' | cut -d '"' -f2) cp ${deploy_path}/*src.rpm ${WORKDIR}/tmp_src_rpms/ done # 将收集到的包打包归档到部署目录 tar -czf ${DEPLOY_DIR}/core-image-src-rpms.tar.gz -C ${WORKDIR}/tmp_src_rpms .
- 在核心配方的自定义任务中,遍历指定的配方列表,通过
- 也可使用
recipetool辅助工具,通过recipetool get --deployed参数直接获取已构建的RPM源码包,省去路径查找步骤。
配方任务的正确实现方式
- 给核心镜像配方添加自定义任务时,需依赖目标配方的deploy任务,确保源码包已构建完成:
# 定义需收集的配方列表 SRC_RPM_RECIPES = "recipe1 recipe2" # 配置自定义任务依赖,确保目标配方的RPM已部署完成 do_collect_src_rpms[depends] = "${@' '.join([f'{r}:do_deploy_rpm' for r in d.getVar('SRC_RPM_RECIPES').split()])}" do_collect_src_rpms() { mkdir -p ${WORKDIR}/collected_src_rpms for recipe in ${SRC_RPM_RECIPES}; do deploy_dir=$(bitbake -e $recipe | grep '^DEPLOY_DIR_RPMS=' | cut -d '"' -f2) cp ${deploy_dir}/*src.rpm ${WORKDIR}/collected_src_rpms/ || true done tar -czf ${DEPLOY_DIR}/core-image-combined-src-rpms.tar.gz -C ${WORKDIR}/collected_src_rpms . } # 将任务插入到镜像构建流程的合适阶段,比如根文件系统生成后、镜像打包前 addtask collect_src_rpms after do_rootfs before do_image
内容的提问来源于stack exchange,提问作者ozimki
相关产品推荐
相关产品推荐

