【问题标题】:Yocto: Install different config files based on MACHINE type or target imageYocto:根据机器类型或目标图像安装不同的配置文件
【发布时间】:2018-08-22 06:24:20
【问题描述】:

我有几个硬件平台(相同的 cpu 等)需要不同的 asound.conf 文件。

我控制目标平台的方式是通过 MACHINE 变量和目标图像(即 MACHINE=machine_1 nice bitbake machine-1-bringup-image

通常,如果只是替换 conf 文件,我会创建一个 alsa-state.bbappend 并创建一个 do_install_append 函数来替换它。

但是,由于不同的硬件平台需要不同的 conf 文件,我不确定如何处理它。

我尝试在附加文件 do_install_append 函数中添加一些逻辑,但没有成功。它并不总是选择正确的文件(就像它认为没有任何改变,所以它使用以前缓存的 conf?)

这是我尝试过的附加文件之一的示例:

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

SRC_URI += " \ file://asound_MACHINE1.conf \ 
               file://asound_MACHINE2.conf \ "

do_install_append() {

echo "    alsa-state.bbappend MACHINE: ${MACHINE}"
if [ "${MACHINE}" = "machine_1" ]; then
    echo "    machine_1"
    echo "    installing ${WORKDIR}/asound_MACHINE1.conf to ${D}${sysconfdir}/asound.conf"

    install -m 644 ${WORKDIR}/asound_MACHINE1.conf {D}${sysconfdir}/asound.conf

else
    echo "    installing ${WORKDIR}/asound_MACHINE2.conf to ${D}${sysconfdir}/asound.conf"
    install -m 644 ${WORKDIR}/asound_MACHINE2.conf ${D}${sysconfdir}/asound.conf

fi

}

我可以根据逻辑在日志中看到正确的回声。

无论如何,我不认为我要走的路是处理这个问题的最佳方式。

是否有一种“标准”方法可以根据目标图像或 MACHINE 变量安装不同的文件?

【问题讨论】:

    标签: yocto bitbake


    【解决方案1】:
    do_install_append () {
        // install common things here
    }
    
    do_install_append_machine-1 () {
        // install machine-1 specific things here
    }
    
    do_install_append_machine-2 () {
        // install machine-2 specific things here
    }
    

    MACHINE 的值会自动添加到 OVERRIDES,可在函数 append 的末尾使用,以对函数进行特定于 MACHINE 的添加。

    也许有用:https://www.yoctoproject.org/docs/2.4/mega-manual/mega-manual.html#var-OVERRIDES

    【讨论】:

    • 好的。从那以后。我知道我让它变得比我需要的更复杂。明天我会试试,当它修复它时标记它已解决。
    【解决方案2】:

    在您的特定情况下,您可以在特定于机器的目录中拥有配置文件(只是每台机器的特定配置文件)。 OpenEmbedded 将获取最具体的一个。您的配方目录中的目录结构如下所示:

    files/<machine1>/asound.conf
    files/<machine2>/asound.conf
    

    您的alsa-state.bbappend 将只包含一行(您无需更改do_install,因为alsa-state.bb 已经安装了asound.conf):

    FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
    

    顺便说一句:我们正在使用该设置在我们的项目中为每台机器设置特定的 asound.state 文件。

    此外,OpenEmbedded 将检测到 SRC_URI 包含机器特定文件并相应地更改 PACKAGE_ARCH,请参阅:https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#var-SRC_URI_OVERRIDES_PACKAGE_ARCH

    关于机器、发行版或架构特定文件的更多信息:OE 正在尝试获取file:// fetcher 中最特定的文件。它还在由发行版(例如 files/&lt;distro&gt;/asound.conf)和架构(例如 armv7a、arm)命名的目录中进行搜索。如果您想拥有特定于某些设备集的文件,这可能会很有用。更多信息:https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#var-FILESOVERRIDEShttps://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#best-practices-to-follow-when-creating-layers(“将机器特定文件放置在机器特定位置”一节)

    【讨论】:

    • 感谢您提供更多信息。在测试和发布之前的解决方案之前,我没有看到它。我也会玩你的解决方案。
    • 因此,请查看您对机器/发行版/arch 特定文件的评论,我有一个问题。如果我想为特定发行版和特定机器提供特定文件,目录结构将是:files///asound.conf 或 files///asound.conf 或者确实有关系吗?
    • @zonedar,不幸的是没有。它是files/&lt;distro&gt;/asound.conffiles/&lt;machine1&gt;/asound.conf。发行版和机器路径不能在默认配置中组合。但是如果你想要这样的行为,你可以使用FILESEXTRAPATHS 变量。
    • @Thomas:知道了。谢谢!
    【解决方案3】:

    clsulliv 的上述答案比宣传的效果更好。以下是我使用的附加文件以供将来参考:

    FILESEXTRAPATHS_prepend:= "${THISDIR}/${PN}:"
    
    SRC_URI += " \
       file://machine1_asound.conf \
       file://machine2_asound.conf \
       "
    
    
    do_install_append_machine1() {
    
        echo "    machine1"
        echo "    installing ${WORKDIR}/machine1_asound.conf to ${D}${sysconfdir}/asound.conf"
        install -m 644 ${WORKDIR}/machine1_asound.conf ${D}${sysconfdir}/asound.conf
    }
    
    
    do_install_append_machine2() {
    
        echo "    machine2"
        echo "    installing ${WORKDIR}/machine2_asound.conf to ${D}${sysconfdir}/asound.conf"
        install -m 644 ${WORKDIR}/machine2_asound.conf ${D}${sysconfdir}/asound.conf
    }
    

    感谢您的帮助!

    【讨论】:

    • 恕我直言,@tomas 解决方案更好地遵循 yocto 最佳实践
    猜你喜欢
    • 2019-10-23
    • 2016-09-10
    • 2020-11-06
    • 2010-10-18
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多