Search code examples
postgresqlcross-compilingembedded-linuxpostgisyocto

Using files generated by other recipes in Yocto


Note: The general question is in bold at the end of this post.

I'm trying to build PostGIS 2.2.7 with Yocto (Rocko) for my Linux i.MX6 based embedded system. First of all, I have installed PostgreSQL 9.4.15 from 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): GNU C, Proj4, GEOS, LibXML2 and JSON-C. Adding the following packages to my image (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"

Then I tried to compile PostGIS inside my target system, and making some changes to a couple of files I succeeded.

Finally, as long as I want to integrate PostGIS into my image with Yocto, I wrote the postgis recipe (I have a "files" folder with the 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
}

But when I run bitbake in order to build my image, I get the following ERROR coming from PostGIS' do_configure function

| 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)

Of course, this error is triggered because the executable pg_config is not located in ${STAGING_BINDIR_CROSS}, either nowhere else but in the work folder of PostgreSQL (in ../image/usr/bin and ../package/usr/bin subfolders). My /tmp/sysroots folder is empty also.

So, the real question is: How can I access to the files generated by other recipes from my own recipe? I need to specify that path (along with others, from the rest of dependencies) in order to configure, compile and install PostGIS into my image.

EDIT 26/07/2018:

pg_config can be found in the following directories inside the 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

Solution

  • sysroots are the method for sharing files across recipes.

    If pg_config is in in ${D}${bindir} (i.e. you see it in the work folder's image/usr/bin), you can add to a postgres_x.x.x.bbappend file:

    SYSROOT_DIRS += "${bindir}"

    Which will copy all the files from postgresql's bindir into postgis's recipe-sysroots folder. This isn't a great idea, as pg_config is a binary and cross compiled so it won't run on your system. This is why /usr/bin/ from your image directory isn't copied to sysroots by default.

    Instead of directories, you can also modify the staging:

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