在 Yocto 中使用其他配方生成的文件
Using files generated by other recipes in Yocto
注意:一般问题在post末尾以粗体显示。
我正在尝试使用 Yocto (Rocko) 为我的 Linux 基于 i.MX6 的嵌入式系统构建 PostGIS 2.2.7。首先,我已经从 OpenEmbedded Layers (https://layers.openembedded.org/layerindex/recipe/5558/) and all the (mandatory) dependencies I could find in the installation manual (https://download.osgeo.org/postgis/docs/postgis-2.2.7.pdf) 安装了 PostgreSQL 9.4.15:GNU C、Proj4、GEOS、LibXML2 和 JSON-C。将以下包添加到我的图像 (local.conf):
IMAGE_INSTALL_append += " postgresql postgresql-dev postgresql-server-dev proj proj-dev json-c json-c-dev geos geos-dev libxml2 libxml2-dev"
然后我尝试在我的 target 系统中编译 PostGIS,并成功地对几个文件进行了一些更改。
最后,只要我想用 Yocto 将 PostGIS 集成到我的图像中,我就写了 postgis 食谱(我有一个 "files" 文件夹,里面有 postgis- 2.2.7.tar.gz tar):
DESCRIPTION = "PostGIS is a spatial database extender for PostgreSQL object-relational database. It adds support for geographic objects allowing location queries to be run in SQL."
SECTION = "devel"
LICENSE = "GPL-3.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-3.0;md5=c79ff39f19dfec6d293b95dea7b07891"
DEPENDS += "gcc postgresql libxml2 geos proj json-c"
RDEPENDS_${PN} = "postgresql-server-dev postgresql-dev"
SRC_URI = "file://postgis-2.2.7.tar.gz"
EXTRA_OECONF += "\
--without-raster \
--with-pgconfig=${STAGING_BINDIR_CROSS}"
inherit autotools pkgconfig
do_configure () {
oe_runconf
}
do_compile () {
oe_runmake
}
但是当我 运行 bitbake 以构建我的图像时,我从 PostGIS 的 do_configure 函数
得到以下错误
| configure: error: the user-specified pg_config file /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/recipe-sysroot/usr/bin/crossscripts does not exist
| NOTE: The following config.log files may provide further information.
| NOTE: /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/build/config.log
| ERROR: configure failed | WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_configure (log file is located at /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/temp/log.do_configure.45983)
当然会触发这个错误,因为可执行文件pg_config不在${STAGING_BINDIR_CROSS},要么不在别的地方,要么在工作中PostgreSQL 的文件夹(在 ../image/usr/bin 和 ../package/usr/bin 子文件夹中)。我的 /tmp/sysroots 文件夹也是空的。
所以,真正的问题是:如何从我自己的食谱访问其他食谱生成的文件?我需要指定该路径(以及其他路径,从其余依赖项)以便配置、编译和安装 PostGIS 到我的图像中。
编辑 26/07/2018:
pg_config可以在postgresql ${WORKDIR}
里面的以下目录中找到
./package/usr/bin/pg_config
./package/usr/bin/.debug/pg_config
./package/usr/src/debug/postgresql/9.4.15-r0/postgresql-9.4.15/src/bin/pg_config
./postgresql-9.4.15/src/bin/pg_config
./build/src/bin/pg_config
./build/src/bin/pg_config/pg_config
./packages-split/postgresql-dbg/usr/bin/.debug/pg_config
./packages-split/postgresql-dbg/usr/src/debug/postgresql/9.4.15-r0/postgresql-9.4.15/src/bin/pg_config
./packages-split/postgresql/usr/bin/pg_config
./image/usr/bin/pg_config
首先,您需要检查食谱中的几件事:
你不必依赖 gcc 因为它会自动添加思想 BASEDEPENDS ,它实际上会添加正确的 CROSS 编译器,在这种情况下你依赖于本机编译器(它将可能会帮你检查 bitbake -e 的输出)。
您也可能不必重写 do_configure() / do compile()
现在,回答你的问题:
您真正想要的是访问其他配方安装的文件,在这种特定情况下,您说文件 pg_config 是由 postgresql 配方生成的,那么通常您需要做的是添加postgresql 到 DEPENDS ,这样,在编译 postgis 配方之前,bibtake 将执行一个名为 prepare_recipe_sysroot 的任务,该任务将从 DEPENDS 上列出的包中安装所有文件,并将它们添加到 recipe-sysroot/... 或 recipe-sysroot- native/... ,这样在交叉编译您的包时,它将可以访问它需要的所有内容(或者至少您列出的所有它需要的内容)。
因为你已经在 DEPENDS 上列出了 postgresql,我只能假设 postgresql 配方没有安装 pg_config 文件,为此你需要确保它安装在 do_install() 来自 postgresql 配方,它是通过 FILES_${PN} 变量打包的(同样在 postgresql 配方中)。
要检查该文件是否由 postgresql 配方提供,您可以在 popstgresql 目录下的 sysroot-providers 目录(在您的 TMPDIR 中)中查找该文件。
希望对您有所帮助
sysroots 是跨食谱共享文件的方法。
如果 pg_config 在 ${D}${bindir} 中(即您在工作文件夹的 image/usr/bin 中看到它),您可以添加到 postgres_x.x.x.bbappend 文件:
SYSROOT_DIRS += "${bindir}"
这会将所有文件从 postgresql 的 bindir 复制到 postgis 的 recipe-sysroots 文件夹中。这不是一个好主意,因为 pg_config 是一个二进制和交叉编译的,所以它不会 运行 在你的系统上。这就是为什么 /usr/bin/ 默认情况下不会将图像目录中的文件复制到 sysroots 的原因。
除了目录,您还可以修改暂存:
sysroot_stage_all_append() {
install -d ${SYSROOT_DESTDIR}${bindir}/crossscripts
install -m 0755 ${D}${bindir}/pg-config ${SYSROOT_DESTDIR}${bindir}/crossscripts/pg-config
}
“生成”的文件不是很清楚。如果你想让另一个食谱“部署”文件,请看这里:https://yoctoproject.blogspot.com/2020/09/yocto-bitbake-and-dependencies-eg-one.html
注意:一般问题在post末尾以粗体显示。
我正在尝试使用 Yocto (Rocko) 为我的 Linux 基于 i.MX6 的嵌入式系统构建 PostGIS 2.2.7。首先,我已经从 OpenEmbedded Layers (https://layers.openembedded.org/layerindex/recipe/5558/) and all the (mandatory) dependencies I could find in the installation manual (https://download.osgeo.org/postgis/docs/postgis-2.2.7.pdf) 安装了 PostgreSQL 9.4.15:GNU C、Proj4、GEOS、LibXML2 和 JSON-C。将以下包添加到我的图像 (local.conf):
IMAGE_INSTALL_append += " postgresql postgresql-dev postgresql-server-dev proj proj-dev json-c json-c-dev geos geos-dev libxml2 libxml2-dev"
然后我尝试在我的 target 系统中编译 PostGIS,并成功地对几个文件进行了一些更改。
最后,只要我想用 Yocto 将 PostGIS 集成到我的图像中,我就写了 postgis 食谱(我有一个 "files" 文件夹,里面有 postgis- 2.2.7.tar.gz tar):
DESCRIPTION = "PostGIS is a spatial database extender for PostgreSQL object-relational database. It adds support for geographic objects allowing location queries to be run in SQL."
SECTION = "devel"
LICENSE = "GPL-3.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-3.0;md5=c79ff39f19dfec6d293b95dea7b07891"
DEPENDS += "gcc postgresql libxml2 geos proj json-c"
RDEPENDS_${PN} = "postgresql-server-dev postgresql-dev"
SRC_URI = "file://postgis-2.2.7.tar.gz"
EXTRA_OECONF += "\
--without-raster \
--with-pgconfig=${STAGING_BINDIR_CROSS}"
inherit autotools pkgconfig
do_configure () {
oe_runconf
}
do_compile () {
oe_runmake
}
但是当我 运行 bitbake 以构建我的图像时,我从 PostGIS 的 do_configure 函数
得到以下错误| configure: error: the user-specified pg_config file /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/recipe-sysroot/usr/bin/crossscripts does not exist
| NOTE: The following config.log files may provide further information.
| NOTE: /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/build/config.log
| ERROR: configure failed | WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_configure (log file is located at /home/danlor/yocto-hmcu/build-hmcu/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/postgis/2.2.7-r0/temp/log.do_configure.45983)
当然会触发这个错误,因为可执行文件pg_config不在${STAGING_BINDIR_CROSS},要么不在别的地方,要么在工作中PostgreSQL 的文件夹(在 ../image/usr/bin 和 ../package/usr/bin 子文件夹中)。我的 /tmp/sysroots 文件夹也是空的。
所以,真正的问题是:如何从我自己的食谱访问其他食谱生成的文件?我需要指定该路径(以及其他路径,从其余依赖项)以便配置、编译和安装 PostGIS 到我的图像中。
编辑 26/07/2018:
pg_config可以在postgresql ${WORKDIR}
里面的以下目录中找到./package/usr/bin/pg_config
./package/usr/bin/.debug/pg_config
./package/usr/src/debug/postgresql/9.4.15-r0/postgresql-9.4.15/src/bin/pg_config
./postgresql-9.4.15/src/bin/pg_config
./build/src/bin/pg_config
./build/src/bin/pg_config/pg_config
./packages-split/postgresql-dbg/usr/bin/.debug/pg_config
./packages-split/postgresql-dbg/usr/src/debug/postgresql/9.4.15-r0/postgresql-9.4.15/src/bin/pg_config
./packages-split/postgresql/usr/bin/pg_config
./image/usr/bin/pg_config
首先,您需要检查食谱中的几件事:
你不必依赖 gcc 因为它会自动添加思想 BASEDEPENDS ,它实际上会添加正确的 CROSS 编译器,在这种情况下你依赖于本机编译器(它将可能会帮你检查 bitbake -e 的输出)。
您也可能不必重写 do_configure() / do compile()
现在,回答你的问题:
您真正想要的是访问其他配方安装的文件,在这种特定情况下,您说文件 pg_config 是由 postgresql 配方生成的,那么通常您需要做的是添加postgresql 到 DEPENDS ,这样,在编译 postgis 配方之前,bibtake 将执行一个名为 prepare_recipe_sysroot 的任务,该任务将从 DEPENDS 上列出的包中安装所有文件,并将它们添加到 recipe-sysroot/... 或 recipe-sysroot- native/... ,这样在交叉编译您的包时,它将可以访问它需要的所有内容(或者至少您列出的所有它需要的内容)。
因为你已经在 DEPENDS 上列出了 postgresql,我只能假设 postgresql 配方没有安装 pg_config 文件,为此你需要确保它安装在 do_install() 来自 postgresql 配方,它是通过 FILES_${PN} 变量打包的(同样在 postgresql 配方中)。
要检查该文件是否由 postgresql 配方提供,您可以在 popstgresql 目录下的 sysroot-providers 目录(在您的 TMPDIR 中)中查找该文件。
希望对您有所帮助
sysroots 是跨食谱共享文件的方法。
如果 pg_config 在 ${D}${bindir} 中(即您在工作文件夹的 image/usr/bin 中看到它),您可以添加到 postgres_x.x.x.bbappend 文件:
SYSROOT_DIRS += "${bindir}"
这会将所有文件从 postgresql 的 bindir 复制到 postgis 的 recipe-sysroots 文件夹中。这不是一个好主意,因为 pg_config 是一个二进制和交叉编译的,所以它不会 运行 在你的系统上。这就是为什么 /usr/bin/ 默认情况下不会将图像目录中的文件复制到 sysroots 的原因。
除了目录,您还可以修改暂存:
sysroot_stage_all_append() {
install -d ${SYSROOT_DESTDIR}${bindir}/crossscripts
install -m 0755 ${D}${bindir}/pg-config ${SYSROOT_DESTDIR}${bindir}/crossscripts/pg-config
}
“生成”的文件不是很清楚。如果你想让另一个食谱“部署”文件,请看这里:https://yoctoproject.blogspot.com/2020/09/yocto-bitbake-and-dependencies-eg-one.html