Yocto中如何在一个recipe内访问另一recipe生成的自定义文件
Yocto跨配方共享生成文件实现方案
核心逻辑
Yocto中每个配方的工作目录(包括${S}、${B}等)是相互隔离的,依赖方无法直接访问被依赖方的私有工作目录。必须将需要共享的文件通过被依赖方的do_install安装到自身的${D}目录,再通过BitBake的staging机制导出到全局sysroot目录,依赖方才可通过STAGING_*系列变量访问。
第一步:修改a.bb配方
你需要先调整a.bb的逻辑,将生成的sample.txt导出到staging目录:
do_install () { # 生成sample.txt echo "sample" > ${S}/sample.txt # 创建安装目录 install -d ${D}${datadir}/a-shared/ # 将文件安装到a的${D}目录下的标准共享路径 install -m 0644 ${S}/sample.txt ${D}${datadir}/a-shared/ } # 声明该文件属于a的输出包 FILES:${PN} += "${datadir}/a-shared/sample.txt" # 声明该路径需要加入sysroot,供其他依赖a的配方访问 SYSROOT_DIRS += "${datadir}/a-shared"
第二步:修改b.bb配方
你已经配置了DEPENDS = "a"保证执行顺序,直接通过STAGING_DATADIR变量访问staging目录中的文件即可:
do_install () { # 读取sample.txt示例 cat ${STAGING_DATADIR}/a-shared/sample.txt # 也可以将文件拷贝到b自身的安装目录 install -d ${D}${datadir}/b/ install -m 0644 ${STAGING_DATADIR}/a-shared/sample.txt ${D}${datadir}/b/ }
补充说明
- 常用STAGING_*变量说明:
${STAGING_DIR_TARGET}:目标架构的sysroot根目录,自定义非标准路径时可以用该变量拼接,比如你将文件放到${D}/opt/myfiles/,就可以通过${STAGING_DIR_TARGET}/opt/myfiles/sample.txt访问${STAGING_INCDIR}:头文件staging路径,对应sysroot下的/usr/include,一般用于共享头文件${STAGING_LIBDIR}:库文件staging路径,对应sysroot下的/usr/lib,一般用于共享动态/静态库
- 如果你只需要临时共享文件不需要打包到最终镜像,也可以把文件安装到
${D}${sysconfdir}/staging-aux/之类的路径,只要对应加到SYSROOT_DIRS即可正常访问。
内容的提问来源于stack exchange,提问作者SD.
相关产品推荐
相关产品推荐

