【问题标题】:Why does the yocto bblayers.conf file use absolute paths?为什么 yocto bblayers.conf 文件使用绝对路径?
【发布时间】:2016-12-17 20:43:47
【问题描述】:

yocto project 允许在其大多数配置文件中使用相对路径,但不允许在 ./build/conf/bblayers.conf 文件中使用。阻止对BBLAYERSBBLAYERS_NON_REMOVABLE 变量使用除绝对路径以外的任何内容的原因是什么?

我查看了BitBake user manual for yocto version 2.0(当前版本),但这并不能解释原因。我还检查了一些较旧的手动版本,但在谈到 bblayers.conf 文件或 BBLAYERS 变量时,它们似乎没有提及推理。同一个文件还包含BBPATH = "${TOPDIR}",它至少是动态分配的,并且距离 yotco 根目录不远。

我最好的猜测是 bblayers.conf 文件特定于它正在运行的系统。这将使其不适合通过源代码控制在开发人员之间共享,并且绝对路径将迫使人们在收到副本时编辑文件。不过,这似乎不是一个很好的理由,因此提出了这个问题。

【问题讨论】:

  • 你有没有想过怎么做?现在坐在同一条船上:)
  • @MarioTacke 不,我没有。我认为答案是bblayers.conf 文件旨在特定于机器上的用户并且只是临时的。整理好想要的图层后,您应该制作一个替换大部分 bblayers.conf 内容的配方。您可以使用${HOME}${TOPDIR} 和其他一些替换,但不能使用相对路径。
  • 没有人回答这个问题。我不是在问“我如何使用相对路径”,而是在问“为什么它们的使用被阻止”。现在回想起来,我猜答案是为了提高效率。对于绝对路径,您可以直接导航到目标文件。对于相对路径,您必须计算出当前的工作目录,计算出它上面有多少个../,然后移到那里,然后再移回另一个目录路径。这听起来比去 /home/TafT/yocto/meta 还要多。
  • @TafT 我添加了一个答案试图回答“为什么”。

标签: configuration-files absolute-path yocto bitbake


【解决方案1】:

我找到了一种使用相对路径的方法。

您可以使用inline python 来遍历文件系统。以下脚本使用提供的TOPDIR 变量,然后通过python 的os.path api 导航到其父级。

# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

YOCTOROOT = "${@os.path.abspath(os.path.join("${TOPDIR}", os.pardir))}"

BBLAYERS ?= " \
  ${YOCTOROOT}/poky/meta \
  ${YOCTOROOT}/poky/meta-yocto \
  ${YOCTOROOT}/poky/meta-yocto-bsp \
"

BBLAYERS_NON_REMOVABLE ?= " \
  ${YOCTOROOT}/poky/meta \
  ${YOCTOROOT}/poky/meta-yocto \
"

参考文献

【讨论】:

  • YOCTOROOT 与 BBPATH 或 TOPDIR 有何不同?我想它为您提供了有效的 ../ 操作,可以解决问题并允许您执行 ${YOCTOROOT}/my-layer/.
  • 提到的解决方案更加灵活,最初由 poky/oe-init-build-env 脚本提出的寻找##OEROOT## 并替换为当前路径的解决方案。因为如果将完整的recipies树移动到另一个地方,conf文件将不会像这里那样自动更新为新路径。
【解决方案2】:

我已经设法通过替换在bblayers.conf 文件中获得“相对路径”

BBLAYERS ?= " \
  /home/username/poky/meta \
  ...

BBLAYERS ?= " \
  ${TOPDIR}/../meta \
  ...

我想这种方法的一个警告是我依赖meta-XXX 层目录始终位于TOPDIR 的父文件夹中。这似乎是使用 yocto 的默认方式的情况,但对于更自定义的构建设置可能并非如此。

【讨论】:

  • 听起来你设法让我可能没能做的事情发挥作用。也许这些工具现在已经更新以允许这种行为。感谢您的回答,但它没有解决为什么他们被阻止的问题。虽然我认为这表明现在它们可能不再被阻止,所以答案可能是没有理由的错误。
【解决方案3】:

所有现有答案都在回答“如何使用相对路径”,但问题是“为什么使用绝对路径”。据我所知,“为什么”很简单,这样做是为了使构建目录可以移动到文件系统上的任何位置。想一想:您可以从文件系统的任何位置获取 poky/oe-init-build-env 并且构建目录将在那里创建,因此依赖相对于构建目录的路径非常脆弱。

编辑:

也许这更清楚,我认为您假设文件 bblayers.conf 始终位于 poky/build/conf/bblayers.conf 中,因此您可以使用像 ../../meta-layer-foo 这样的路径来引用 poky/meta-layer-foo 中的某个层,但是如果我在另一个路径poky/foo/bar 中实例化“构建”,则找不到该层:

etienne@ubuntu:~/repos/poky-tx2$ mkdir -p foo/bar
etienne@ubuntu:~/repos/poky-tx2$ cd foo/bar/
etienne@ubuntu:~/repos/poky-tx2/foo/bar$ ls
etienne@ubuntu:~/repos/poky-tx2/foo/bar$ source ../../oe-init-build-env 
You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to, for
example, select a different MACHINE (target hardware). See conf/local.conf
for more information as common configuration options are commented.

You had no conf/bblayers.conf file. This configuration file has therefore been
created for you with some default values. To add additional metadata layers
into your configuration please add entries to conf/bblayers.conf.

The Yocto Project has extensive documentation about OE including a reference
manual which can be found at:
    http://yoctoproject.org/documentation

For more information about OpenEmbedded see their website:
    http://www.openembedded.org/


### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
etienne@ubuntu:~/repos/poky-tx2/foo/bar/build$ ls
conf

【讨论】:

  • 您的意思是对于大多数开发来说,./build/conf/bblayers.conf 中引用的目录可能对机器上的所有项目都是通用的?所以 bblayers.conf 中引用的路径将独立于构建目录,因为构建目录将移动其他东西永远不会?
  • 我的意思是当你创建一个项目时,你不知道人们会在哪里实例化构建目录,所以使用相对路径是行不通的,除非你对“构建”的位置做出假设,如果人们从其他路径调用“source oe-init-build-env”,它将中断(当您调用此脚本时,“build”目录被创建为当前目录的子目录,因此它可以位于文件系统上的任何位置)。
  • @TafT 我的回答中缺少什么吗?为什么不接受呢?
  • 需要从文件系统的任何位置获取目录内容可能是原因。您的第一个回复不是很清楚,但现在更清楚了。
【解决方案4】:

您可以在bblayers.conf 中使用相对路径。

您的bblayers.conf 中可能有这一行:

BBPATH = "${TOPDIR}"

当你想找出这个变量的内容时,你可能会找到你的构建目录的顶级目录:

bitbake -e | grep ^TOPDIR
# searches for bitbake variables

在此目录中,您可以创建一个层 meta-test 并使用相对路径将其添加到 bblayers.conf

BBLAYERS ?= " \
  meta-test \
  [...]
  "

因此,关于为什么bblayers.conf 中有绝对路径的问题的答案是,您可以将构建目录放在系统上的任何位置,而不依赖于 Yocto。

层的相对路径必须始终相对于构建目录。

【讨论】:

  • 您的回答似乎表明相对于构建目录的路径是可能的。没有说实际上可以使用相对路径。如果 Yocto(或 bitbake)系统只使用 ${TOPDIR} 的绝对路径,然后使用字符串操作来附加 BBLAYERS 路径,那么仍然只使用绝对路径。您是说将构建目录放在任何地方的能力是由绝对路径的要求来维护的吗?这些陈述是否有来源。
  • 我不明白这个。相对路径总是需要一个参考点。这坚持使用“相对”一词。在这一点上,它将是 BBPATH。只要安全设置适合,您就可以通过相对路径访问文件系统上的任何文件。
  • 如果我在使用的路径中输入./../../,它们会失败。这就是我要问的那种相对路径。我可以看到,使用 bitbake 系统可能会在相对于 bitbake 生态系统中的其他事物的路径中出现一些时间。我在问为什么我不能在 bblayers.conf 文件中定义为../foo/bar.txt 的路径,而在我尝试使用的大多数其他文件中似乎都可以。
【解决方案5】:

我正在使用Rocko 版本 而我的bblayers.conf 文件也不支持相对路径 我尝试使用TEMPLATECONF 变量更改bblayers.conf 文件。 TEMPLATECONF 变量指向包含bblayers.conf.samplelayer.conflocal.conf.sample 的目录。 我导出了TEMPLATECONF 变量以在构建目录中获取所需的bblayers.conflocal.conf 文件,但在我的bblayers.conf.sample 中,BBLAYERS 变量由相对路径设置,如下所示:

BBLAYERS ?= " \
  ##OEROOT##/meta \
  ##OEROOT##/../meta-xilinx \
  ##OEROOT##/../meta-xilinx-tools \
  ##OEROOT##/../meta-openembedded/meta-oe \
  ##OEROOT##/../meta-openembedded/meta-perl \
  ##OEROOT##/../meta-openembedded/meta-python \
  ##OEROOT##/../meta-openembedded/meta-multimedia \
  ##OEROOT##/../meta-openembedded/meta-networking \
  ##OEROOT##/../meta-openembedded/meta-filesystems \
  ##OEROOT##/../meta-openembedded/meta-webserver"

但它似乎不起作用。OEROOT 变量无法设置正确的路径。 一个原因可能是oe-init-build-env 脚本结束它取消设置OEROOT 变量。 尽管如果您手动将 OEROOT 变量导出为所需的值,它可能会有所帮助。 但是,当我从 OEROOT 更改为 TOPDIR 变量时,它就像一个魅力,如下所示:

BBLAYERS ?= " \
  ${TOPDIR}/../meta \
  ${TOPDIR}/../meta-poky \
  ${TOPDIR}/../meta-skeleton \
  ${TOPDIR}/../meta-selftest \
  ${TOPDIR}/../meta-yocto-bsp \
  ${TOPDIR}/../../meta-xilinx/meta-xilinx-bsp \
  ${TOPDIR}/../../meta-xilinx/meta-xilinx-contrib \
  ${TOPDIR}/../../meta-xilinx-tools \
  ${TOPDIR}/../../meta-openembedded/meta-oe \
  ${TOPDIR}/../../meta-openembedded/meta-perl \
  ${TOPDIR}/../../meta-openembedded/meta-python \
  ${TOPDIR}/../../meta-openembedded/meta-multimedia \
  ${TOPDIR}/../../meta-openembedded/meta-networking \
  ${TOPDIR}/../../meta-openembedded/meta-filesystems \
  ${TOPDIR}/../../meta-openembedded/meta-webserver"

这可能让我认为oe-root-init-env 脚本取消设置OEROOT 变量会导致问题。 另外,如果有人找到更好的解决方案,请回复。

【讨论】:

  • 您可以使用##OEROOT##,前提是您在bblayers.conf.sample 中使用它并更新您的templateconf.cfg 以指向您的conf 目录。我添加了一个单独的答案来提供有关此策略的详细信息。
【解决方案6】:

正如您在自我评论中已经提到的,bblayers.conf

旨在特定于机器上的用户并且只是临时的。

恕我直言,这个想法是 bblayers.conf 永远不应该在开发人员之间分发。然而,如果层的绝对路径是特定于每个开发人员的系统安装的,那么将实际层列表保留为项目的一部分似乎是合理的。

受 Kamal Pandey 的回答启发,我想出了一个利用 oe-init-build-env 脚本背后的模板文件引擎的解决方案。

通过将conf/templateconf.cfg 的内容更改为conf(而不是默认情况下的meta-poky/conf),您可以指示oe-init-build-env 从其.sample 对应项(现在位于您的conf 目录)。

这样,将bblayers.conf 重命名为bblayers.conf.sample 可以让您使用OEROOT 变量(不幸的是,在oe-init-build-env 调用之后不再可用)。

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf                                                                                                                                      
# changes incompatibly                                                                                                                                                                                            
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \                                                                                                                                                                                                   
  ##OEROOT##/meta \                                                                                                                                                                                               
  ##OEROOT##/meta-poky \                                                                                                                                                                                          
  ##OEROOT##/meta-yocto-bsp \                                                                                                                                                                                     
  ${TOPDIR}/meta-tensorflow-lite \                                                                                                                                                                                
  "

有了这个bblayers.conf.sample 文件,您现在可以使用##OEROOT## 替换变量来引用相对于您的poky 安装目录的文件。通过删除bblayers.conf(或不对其进行版本控制/分发),您可以确保采购oe-init-build-env 将重新生成具有正确绝对值的bblayers.conf

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多