Postgresql 使用Yocto中其他配方生成的文件

Postgresql 使用Yocto中其他配方生成的文件,postgresql,cross-compiling,embedded-linux,postgis,yocto,Postgresql,Cross Compiling,Embedded Linux,Postgis,Yocto,注:一般问题在本文末尾用粗体显示 我正在尝试使用Yocto(Rocko)为基于Linux I.MX6的嵌入式系统构建PostGIS 2.2.7。首先,我已从OpenEmbedded Layers()安装了PostgreSQL 9.4.15,并在安装手册()中找到了所有(必需的)依赖项:GNU C、Proj4、GEOS、LibXML2和JSON-C。将以下软件包添加到我的映像(local.conf)中: 然后我尝试在我的目标系统中编译PostGIS,并对几个文件进行了一些更改,我成功了 最后,只要

注:一般问题在本文末尾用粗体显示

我正在尝试使用Yocto(Rocko)为基于Linux I.MX6的嵌入式系统构建PostGIS 2.2.7。首先,我已从OpenEmbedded Layers()安装了PostgreSQL 9.4.15,并在安装手册()中找到了所有(必需的)依赖项:GNU C、Proj4、GEOS、LibXML2和JSON-C。将以下软件包添加到我的映像(local.conf)中:

然后我尝试在我的目标系统中编译PostGIS,并对几个文件进行了一些更改,我成功了

最后,只要我想用Yocto将PostGIS集成到我的图像中,我就编写了PostGIS配方(我有一个带有PostGIS-2.2.7.tar.gz tar的“文件”文件夹):

但是当我运行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/sysroot文件夹也是空的

因此,真正的问题是:如何从我自己的配方中访问其他配方生成的文件?我需要指定该路径(以及其他依赖项中的路径),以便配置、编译PostGIS并将其安装到我的映像中

编辑2018年7月26日:

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,因为它将自动添加到Think BaseDependes中,并且它实际上会添加正确的交叉编译器,在这种情况下,您将依赖于本机编译器(它可能会帮助您检查bitbake-e的输出)

  • 另外,您可能不必重写do_configure()/do compile()

现在,回答你的问题:

实际上,您希望访问由其他配方安装的文件,在这种特定情况下,您说文件pg_config是由postgresql配方生成的,那么通常您需要做的是在编译postgis配方之前将postgresql添加到Dependes,bibtake将执行一个名为prepare_recipe_sysroot的任务,该任务获取从上列出的包中安装的所有文件,并将它们添加到recipe sysroot/。。。或配方sysroot native/,这样,当交叉编译包时,它将能够访问它所需的所有内容(或者至少可以访问您列出的所有内容)

因为您已经列出了postgresql依赖项,所以我只能假设postgresql配方没有安装pg_配置文件,为此,您需要确保它安装在postgresql配方的do_install()上,并且它是通过FILES_${PN}变量打包的(同样在postgresql配方上)

要检查该文件是否由postgresql配方提供,您可以在sysroot providers目录(位于您的TMPDIR中)中的popstgresql目录下查找该文件


希望这对跨配方共享文件的方法有所帮助

如果pg_config位于${D}${bindir}中(即,您可以在工作文件夹的image/usr/bin中看到它),则可以添加到postgres_x.x.x.bbappend文件:

SYSROOT_DIRS+=“${bindir}”

将所有文件从postgresql的bindir复制到postgis的recipe sysroot文件夹中。这不是一个好主意,因为pg_config是一个二进制文件,并且是交叉编译的,所以它不会在您的系统上运行。这就是为什么默认情况下不会将映像目录中的/usr/bin/复制到sysroot

您还可以修改暂存,而不是目录:

sysroot_stage_all_append() {
  install -d ${SYSROOT_DESTDIR}${bindir}/crossscripts
  install -m 0755 ${D}${bindir}/pg-config ${SYSROOT_DESTDIR}${bindir}/crossscripts/pg-config
}

“生成”的文件不太清楚。如果您想让其他配方“部署”文件,请查看此处:

首先,感谢您的回答!是的,pg_config可执行文件是由postgresql配方生成的(由.c和.h编译),但是,在postgresql配方(或postgresql.inc)中没有对“pg_config”的引用。此外,没有/sysroot-*包含该文件。即使我将其添加到文件${PN}(在.bbappend FILES${PN}+=“${bindir}/pg_config”)中,…这也只能在您没有交叉编译的情况下工作。。。由于您使用的是bitbake/yocto,所以可能是交叉编译。不过,老实说,当前的postgis配置脚本对交叉编译器并不友好;您可能希望重新编写configure.ac以不使用pg_config,而是以另一种方式提供路径和版本信息。谢谢!这是一项巨大的工作,不是吗?有没有更好的方法将PostGIS包含到我的图像中?也许我可以从覆盆子皮回购或其他东西预建包…如果没有,我会这样处理!您可以在嵌入式系统上运行pg_config,让它显示它包含的所有变量,然后将它们复制到pg-config.sh脚本中(这样它们就可以选择正确的sysroot路径)。然后将其用作二进制pg_配置的替代方案。我遵循您的建议,但我无法将脚本提供给我的PostGIS配方…我正在${D}${bindir}中安装它,但它似乎没有包含在postgisWow的配方系统根中!非常感谢你!他们当然会帮忙!但是,我还不能完全编译PostGIS,因为do_compile函数失败(一些Makefile正试图针对/liblwgeom/.libs/liblwgeom.a进行编译,但liblwgeom.a不存在,只生成了.so和.la libs),但我目前正在处理它。我真的很感谢你的帮助!
./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
sysroot_stage_all_append() {
  install -d ${SYSROOT_DESTDIR}${bindir}/crossscripts
  install -m 0755 ${D}${bindir}/pg-config ${SYSROOT_DESTDIR}${bindir}/crossscripts/pg-config
}