【问题标题】:How to conditionally install and ship files in yocto bb recipe?如何有条件地在 yocto bb recipe 中安装和发送文件?
【发布时间】:2020-01-26 13:41:28
【问题描述】:

我的 yocto build/conf/auto.conf 文件包含一个变量:

READ_ONLY_FS ?= "true"

我想安装一个可以修改的配置文件,因为我希望如果 READ_ONLY_FS 为“true”,my.conf 文件直接安装在 /etc 中。但如果 R​​EAD_ONLY_FS 为“false”,我希望 my.conf 文件安装在 /data/etc 中,然后软链接到 /etc。 (/data为读写分区)

目前我的食谱包含这个作为实现我想要的尝试:

FILES_${PN} += " ${@bb.utils.contains('READ_ONLY_FS', 'true', '', '/data/${sysconfdir}/my.conf', d)}"

do_install_append() {
    install -d ${D}/${sysconfdir}
    if [ "${@bb.utils.contains('READ_ONLY_FS', 'true', 'true', 'false', d)} == "true" ]; then
        install -d ${D}/data/${sysconfdir}
        install -m 0755 ${S}/my.conf ${D}/data/${sysconfdir}/my.conf
        ln -sf ${D}/data/${sysconfdir}/my.conf ${D}/${sysconfdir}/my.conf
    else
        install -m 0755 ${S}/my.conf ${D}/${sysconfdir}/my.conf
    fi    
}

但我收到一个错误:文件/目录已安装但未发货。我做错了什么?

【问题讨论】:

    标签: embedded-linux yocto bitbake


    【解决方案1】:

    我通常在我自己的层中创建一个 bbappend 以附加到 volatile-binds.bb, 例如:meta-mylayer/recipes-core/volatile-binds/volatile-binds.bbappend 包含

    VOLATILE_BINDS += "\
        /data/${sysconfdir}/my.conf /${sysconfdir}/my.conf\n\
    "
    

    我必须确保我的 rootfs 通过包组或 IMAGE_INSTALL 拉入 volatile-binds 包。

    安装my.conf的配方不需要知道这个重定向,只需安装到${sysconfdir}/my.conf

    volatile-binds 会生成一个启动脚本,该脚本仅在${sysconfdir}/my.conf 为只读时才会执行。在这种情况下,它会将${sysconfdir}/my.conf 复制到/data/${sysconfdir}/my.conf(如果它尚不存在)并将后者绑定安装在前者之上。

    我用

    IMAGE_FEATURES += "read-only-rootfs"
    

    在我的“只读图像”配方中。

    【讨论】:

      【解决方案2】:

      Bitbake 通常会告诉您哪些文件“已安装但未发布”。在您的情况下,您似乎安装了/data/${sysconfdir}/my.conf/${sysconfdir}/my.conf 的符号链接,但只将以前的路径添加到FILES

      顺便说一句:我认为,您可以通过删除FILES 分配中的条件并直接访问READ_ONLY_FS 来简化代码。

      这样的东西应该可以工作(根本没有经过测试):

      FILES_${PN} += "/data/${sysconfdir}/my.conf /${sysconfdir}/my.conf"
      
      do_install_append() {
          install -d ${D}/${sysconfdir}
          if [ ${READ_ONLY_FS} == "true" ]; then
              install -d ${D}/data/${sysconfdir}
              install -m 0755 ${S}/my.conf ${D}/data/${sysconfdir}/my.conf
              ln -sf ${D}/data/${sysconfdir}/my.conf ${D}/${sysconfdir}/my.conf
          else
              install -m 0755 ${S}/my.conf ${D}/${sysconfdir}/my.conf
          fi    
      }
      

      【讨论】:

      • 但是如果它有 FILES_${PN} += " /data/${sysconfdir}/my.conf " 并且 READ_ONLY_FS 是假的,那么,它不会期望 /data/etc/my .conf 不会被安装?
      • 不,恰恰相反。您将所需的文件安装在do_install 中,并且所有这些文件都需要通过将路径添加到FILES 来以某个包的形式提供。据我所知,在FILES 中有其他实际未安装的路径不是问题,但我可能错了。
      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2019-01-27
      • 2020-04-18
      • 1970-01-01
      • 2018-10-25
      • 2020-07-01
      相关资源
      最近更新 更多