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

时间:2016-08-11 08:11:35

标签: configuration-files absolute-path yocto bitbake

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文件特定于正在运行的系统。这将使它不适合通过源代码控制在开发人员之间共享,绝对路径会强制人们在收到副本时编辑文件。这似乎不是一个很好的理由,因此这个问题。

5 个答案:

答案 0 :(得分:9)

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

您可以使用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 \
"

参考

答案 1 :(得分:4)

我设法得到了相对路径"在通过替换

工作的bblayers.conf个文件中
BBLAYERS ?= " \
  /home/username/poky/meta \
  ...

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

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

答案 2 :(得分: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。

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

答案 3 :(得分:2)

所有现有答案都在回答“如何使用相对路径”,但问题是“为什么要使用绝对路径”。据我所知,“为什么”很简单,它是通过这种方式完成的,因此可以将构建目录移动到文件系统上的任何位置。考虑一下:您可以从文件系统上的任何位置获取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

答案 4 :(得分:1)

我正在使用Rocko版本 而且我的bblayers.conf文件也不支持相对路径 我尝试使用bblayers.conf变量来更改TEMPLATECONF文件。 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"

这可能使我认为OEROOT脚本未设置oe-root-init-env变量引起了问题。 另外,如果有人找到更好的解决方案,请回复。