【问题标题】:Using files generated by other recipes in Yocto在 Yocto 中使用其他配方生成的文件
【发布时间】:2018-12-31 22:11:59
【问题描述】:

注意:一般问题在本文末尾以粗体显示。

我正在尝试使用 Yocto (Rocko) 为我的基于 Linux i.MX6 的嵌入式系统构建 PostGIS 2.2.7。首先,我从 OpenEmbedded Layers (https://layers.openembedded.org/layerindex/recipe/5558/) 安装了 PostgreSQL 9.4.15 以及我可以在安装手册 (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,并成功地对几个文件进行了一些更改。

最后,只要我想用 Yocto 将 PostGIS 集成到我的图像中,我就编写了 postgis 配方(我有一个带有 postgis-2.2.7.ta​​r.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

【问题讨论】:

    标签: postgresql cross-compiling embedded-linux postgis yocto


    【解决方案1】:

    首先,您需要检查您的食谱的几件事:

      1234563检查 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 配方提供,您可以在 popstgresql 目录下的 sysroot-providers 目录(位于您的 TMPDIR 内)中查找该文件。

    希望有帮助

    【讨论】:

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

    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
    }
    

    【讨论】:

    • 这仅在您不进行交叉编译时才有效......并且由于您使用的是 bitbake/yocto,因此您可能正在交叉编译。不过,老实说,当前的 postgis 配置脚本对交叉编译器不友好。您可能需要重写 configure.ac 以不使用 pg_config 而是以另一种方式提供路径和版本信息。
    • 谢谢!不过,这是一项巨大的工作,不是吗?有没有更好的方法将 PostGIS 包含到我的图像中?也许我可以从 Raspberry Pi 存储库或其他东西中获取一个预构建的包......如果没有,我会那样处理它!
    • 你可以在你的嵌入式系统上运行 pg_config,它会显示它包含的所有变量,并将它们复制到一个 pg-config.sh 脚本中(这样它们就会选择正确的 sysroot 路径)。然后使用它作为二进制 pg_config 的替代品。
    • 我正在听从您的建议,但我无法使脚本可用于我的 PostGIS 配方...我将其安装在 ${D}${bindir} 中,但看起来像它没有包含在 postgis 的 recipe-sysroot 中
    • 这些食谱可能会有所帮助:github.com/cnelson711/osm-bb
    【解决方案3】:

    “生成”的文件不是很清楚。如果您希望其他配方“部署”文件,请查看此处:https://yoctoproject.blogspot.com/2020/09/yocto-bitbake-and-dependencies-eg-one.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2016-07-10
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      相关资源
      最近更新 更多