如何有条件地在yocto bb配方中安装和运送文件?

时间:2019-09-26 09:47:27

标签: embedded-linux yocto bitbake

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

READ_ONLY_FS ?= "true"

我想安装一个可以修改的配置文件,为此,如果READ_ONLY_FS为“ true”,则我的my.conf文件直接安装在/ etc中。但是,如果READ_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    
}

但是出现错误:已安装文件/目录,但未发货。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

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    
}

答案 1 :(得分:0)

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

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

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

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

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

我用

IMAGE_FEATURES += "read-only-rootfs"

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