yocto project允许在大多数配置文件中使用相对路径,但不允许在./build/conf/bblayers.conf
文件中使用相对路径。阻止使用除BBLAYERS
和BBLAYERS_NON_REMOVABLE
变量的绝对路径之外的任何内容的原因是什么?
我查看了BitBake user manual for yocto version 2.0(当前版本),但这并没有解释推理。我还检查了一些较旧的手动版本,但在谈论bblayers.conf
文件或BBLAYERS
变量时似乎没有提到推理。同一个文件还包含BBPATH = "${TOPDIR}"
,它至少是动态分配的,而不是远离根yotco目录。
我最好的猜测是bblayers.conf文件特定于正在运行的系统。这将使它不适合通过源代码控制在开发人员之间共享,绝对路径会强制人们在收到副本时编辑文件。这似乎不是一个很好的理由,因此这个问题。
答案 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.sample
,layer.conf
和local.conf.sample
的目录。
我导出了TEMPLATECONF
变量以在构建目录中获取所需的bblayers.conf
和local.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
变量引起了问题。
另外,如果有人找到更好的解决方案,请回复。