使用其他recipes生成的文件,using files generated by other recipes
原本期望在recipes之间共享文件会有类似namespace的实现方式,即,可以在recipes-bb的build脚本中,任意通过recipes-aa namespace下的环境变量来轻松访问recipes-aa下生成的编译文件。如
::recipes-aa:${WORKDIR}
::recipes-aa:${D}
等。
一番查阅之后,没有找到类似的机制,改为使用staging.bbclass
提供的do_populate_sysroot
和do_prepare_recipe_sysroot
来实现
1. 需求
期望能在recipes-bb编译过程中使用recipes-aa生成的文件
2. 实现方式
使用yocto提供的staging.bbclass提供的标准任务来完成该需求。
文档描述:https://www.yoctoproject.org/docs/2.3.1/ref-manual/ref-manual.html#ref-classes-staging
假设recipes-bb依赖recipes-aa的编译输出文件。
基本原理:
- Stage 0:在recipes-bb文件中添加对recipes-aa的依赖
# recipes-bb.bb
DEPENDS = "recipes-aa"
- Stage one: build recipes-aa时,其
do_populate_sysroot
任务负责从recipes-aa$D}
目录的sysroot-destdir
的文件中挑出一部分放到,recipes-aa$WORKDIR}
的sysroot-destdir
中 - Stage two: build recipes-bb时,其
do_prepare_recipe_sysroot
任务负责将Stage one中准备好的文件,拷贝到recipes-bb的${WORKDIR}
的recipe-sysroot
中。至此,在编译recipes-bb时,则可以通过访问当前WORKDIR的recipe-sysroot内容,来获取recipes-aa的编译输出文件
其他说明
- Stage one拷贝的对象由
SYSROOT_DIRS
,SYSROOT_DIRS_NATIVE
,SYSROOT_DIRS_BLACKLIST
变量来配置 - 另外可以通过
SYSROOT_PREPROCESS_FUNCS
变量来配置额外的拷贝函数,而且实测该方式比较有效也可控
eg:
SYSROOT_PREPROCESS_FUNCS += "additional_populate_sysroot"
additional_populate_sysroot() {
sysroot_stage_dir ${D}/lib ${SYSROOT_DESTDIR}/lib
}