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

5

注意:总问题在本文末端以粗体标出。

我正在尝试为基于 Linux i.MX6 的嵌入式系统使用 Yocto(Rocko)构建 PostGIS 2.2.7。首先,我从 OpenEmbedded Layers 安装了 PostgreSQL 9.4.15(https://layers.openembedded.org/layerindex/recipe/5558/),并安装了所有(必需的)依赖项,这些依赖项可以在安装手册(https://download.osgeo.org/postgis/docs/postgis-2.2.7.pdf)中找到: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"

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

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

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文件夹也是空的。
因此,真正的问题是:我如何从自己的recipe访问其他recipes生成的文件?我需要指定该路径(以及来自其余依赖项的其他路径),以便配置、编译和安装PostGIS到我的image中。
编辑26/07/2018:
在postgresql ${WORKDIR}中可以找到pg_config在以下目录中:
./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
3个回答

5
首先,您需要检查一下您的配方中的几个事项:
  • 您不必依赖gcc,因为它会自动通过BASEDEPENDS添加正确的交叉编译器,而在这种情况下,您正在依赖于本地编译器(检查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文件,要做到这一点,您需要确保它在postgresql配方的do_install()中被安装,并且通过FILES_${PN}变量打包(同样在postgresql配方中)。
要检查该文件是否由postgresql配方提供,请在sysroot-providers目录(位于TMPDIR下)的popstgresql目录中查找该文件。
希望对您有所帮助。

1
首先,感谢您的回答!是的,pg_config可执行文件是由postgresql配方生成(从.c和.h编译而来),但是,在postgresql配方(或postgresql.inc)中没有对“pg_config”的引用。此外,没有/sysroot-*包含该文件。即使我将它添加到FILES_${PN}中(在.bbappend FILES_${PN} += "${bindir}/pg_config")... - danrodlor

4

系统根目录是在配方之间共享文件的方法。

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

SYSROOT_DIRS += "${bindir}"

这将把postgresql绑定目录中的所有文件复制到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
}

只有在非交叉编译情况下,这才会起作用... 而且由于您正在使用 bitbake/yocto,您可能正在进行交叉编译。老实说,当前的 postgis 配置脚本并不友好于交叉编译器;您可能需要重新编写 configure.ac 以不使用 pg_config,而是以另一种方式提供路径和版本信息。 - Chad
谢谢!这是一项巨大的工作,不是吗?有没有更好的方法将PostGIS包含到我的镜像中?也许我可以从树莓派仓库中获取预构建的软件包之类的...如果没有,我会用这种方式解决的! - danrodlor
你可以在嵌入式系统上运行pg_config,以便显示其中包含的所有变量,并将它们复制到pg-config.sh脚本中(这样它们就会选择正确的sysroot路径)。然后使用该脚本作为二进制pg_config的替代方案。 - Chad
我正在遵循您的建议,但无法将脚本提供给我的PostGIS配方...我正在${D}${bindir}中安装它,但似乎它没有包含在postgis的recipe-sysroot中。 - danrodlor
1
这些配方可能会有所帮助: https://github.com/cnelson711/osm-bb - Chad
哇!非常感谢!它们确实有帮助!然而,我还不能完全编译PostGIS,因为do_compile函数失败了(某个Makefile试图编译/liblwgeom/.libs/liblwgeom.a,但liblwgeom.a不存在,只生成.so和.la库),但我正在努力解决。我非常感激你的帮助! - danrodlor

0

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