为什么Yocto的bblayers.conf文件使用绝对路径?

16
Yocto 项目 允许在大多数配置文件中使用相对路径,但不允许在 ./build/conf/bblayers.conf 文件中使用相对路径。为什么只有 BBLAYERSBBLAYERS_NON_REMOVABLE 变量只能使用绝对路径而不能使用其他路径呢?
我查看了BitBake用户手册 Yocto 2.0版(当前版本),但并未说明其原因。我还查看了一些旧版本的手册,但似乎没有提到在讨论bblayers.conf文件或BBLAYERS变量时的原因。同一文件还包含BBPATH = "${TOPDIR}",至少它是动态分配的,并且离 Yocto 根目录不远。
我猜测 bblayers.conf 文件是特定于运行它的系统的。这将使它不适合通过源控制在开发者之间共享,而绝对路径会强制人们在收到副本时编辑该文件。然而,这似乎不是一个非常好的理由,因此就产生了这个问题。

你最终解决了吗?我现在也面临同样的问题 :) - Mario Tacke
@MarioTacke 不,我没有。 我认为答案是 bblayers.conf 文件旨在针对机器上的用户进行特定设置,并且仅是暂时的。 一旦您确定了要使用哪些层,您应该创建一个配方来替换大部分 bblayers.conf 内容。 您可以使用 ${HOME}${TOPDIR} 和其他几个替换,但不能使用相对路径。 - TafT
没有人回答这个问题。我不是在问“如何使用相对路径”,而是在问“为什么它们的使用被阻止”。现在回头看,我猜答案是为了效率。对于绝对路径,你可以直接导航到目标文件。对于相对路径,你必须计算出当前工作目录,计算出比它上面的 N 个 "../",然后移动过去,再返回另一个目录路径。听起来比去 /home/TafT/yocto/meta 更麻烦。 - TafT
1
@TafT 我添加了一个答案,试图回答“为什么”。 - Étienne
6个回答

14

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

您可以使用内联 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/ - TafT
提到的解决方案比最初由poky/oe-init-build-env脚本提出的更灵活,后者寻找##OEROOT##并将其替换为当前路径。因为如果完整的配方树将被移动到另一个位置,conf文件将不会像这里一样自动更新为新路径。 - Oleg Kokorin
在内联Python中是否可以使用新的路径语法(从Python 3.4开始)? 然后是否可以输入多个Python命令? https://dev59.com/onE85IYBdhLWcg3wRBRU#2860193 - Mario Palumbo

10
我已成功实现了bblayers.conf文件中的“相对路径”,通过替换以下内容:
BBLAYERS ?= " \
  /home/username/poky/meta \
  ...

使用

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

我猜这种方法的一个缺点是我要依赖于meta-XXX层目录一直在TOPDIR的父文件夹中。这似乎是使用Yocto的默认方式,但对于更多自定义的构建设置,可能并不一定。


1
听起来你成功地让我可能无法做到的事情工作了。也许现在工具已经更新,允许这种行为了。谢谢你的回答,但它并没有回答被阻止的原因。虽然我想这表明现在它们可能不再被阻止了,所以答案可能是一个没有理由的错误。 - TafT

3

您可以在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路径,那么仍然只使用绝对路径。你是说将构建目录放在任何地方的能力是通过对其要求绝对路径来维护的吗?这些说法有来源吗? - TafT
我不理解这个。相对路径总是需要一个参考点。这就体现了“相对”的含义。在这种情况下,它将是BBPATH。只要安全设置合适,您可以通过相对路径访问文件系统中的任何文件。 - h0ch5tr4355
如果我在使用的路径中输入./../../,它们会失败。 我正在询问的是这种相对路径。 我可以看到使用bitbake系统时,可以将某些时间路径相对于bitbake生态系统中的其他内容。 当我尝试在大多数其他文件中定义路径为../foo/bar.txt时,我想知道为什么不能在bblayers.conf文件中定义它。 - TafT

3
现有的所有答案都是在回答“如何使用相对路径”,但问题是“为什么要使用绝对路径”。据我所知,“为什么”很简单,这样做是为了使构建目录可以移动到文件系统中的任何位置。想一想:您可以从文件系统上的任何位置获取poky/oe-init-build-env,并在那里创建构建目录,因此依赖于相对于构建目录的路径非常脆弱。
编辑:
也许这更清晰,我认为您正在假设文件bblayers.conf始终位于poky/build/conf/bblayers.conf中,因此可以使用类似于../../meta-layer-foo的路径来引用某个层,该层将在poky/meta-layer-foo中,但如果我在另一个路径poky/foo/bar中实例化“build”,则找不到该层。
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 中引用的路径将独立于构建目录,因为构建目录会移动,而其他内容则永远不会移动? - TafT
我的意思是,当你创建一个项目时,你不知道人们会在哪里实例化构建目录,因此使用相对路径是行不通的,除非你对“build”目录的位置做出假设,否则如果人们从其他路径调用“source oe-init-build-env”,这将会破坏它(当你调用这个脚本时,“build”目录被创建为当前目录的子目录,因此它可以在你的文件系统上的任何地方)。 - Étienne
@TafT,我的回答有什么不足之处吗?为什么不接受它呢? - Étienne
需要从文件系统的任何位置获取目录内容可能是原因。你第一次回复中并不是很清楚,但现在更清楚了。 - TafT

2

我正在使用 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 目录。我已经添加了一个单独的答案来提供有关这种策略的详细信息。 - Yves Lhuillier

0

如你在自评中已经提到的那样,bblayers.conf

旨在针对一台机器上的用户,并且仅是临时的。

我认为,bblayers.conf 的想法是永远不应该分发给开发人员。尽管如此,如果图层的绝对路径是每个开发人员的系统安装的特定内容,则保留实际的图层列表作为项目的一部分似乎是合理的。

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

通过将 conf/templateconf.cfg 的内容更改为 conf(而不是默认情况下的 meta-poky/conf),您可以指示 oe-init-build-env 从其配置目录中的 .sample 副本中添加任何缺少的文件。

这样,将您的 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以获得正确的绝对值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接