Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 939
danrodlor Avatar asked Jul 24 '18 10:07

danrodlor


People also ask

What is .BB file in yocto?

bb , are the most basic metadata files. These recipe files provide BitBake with the following: Descriptive information about the package. The version of the recipe. Existing Dependencies.

What is the default package in yocto generated files?

The default value is “${PACKAGES}”, which causes the debian class to act on all packages that are explicitly generated by the recipe. Enables creating an automatic menu for the syslinux bootloader. You must set this variable in your recipe. The syslinux class checks this variable.


2 Answers

First of all there are a couple of things you need to check on your recipe:

  • You dont have to DEPEND on gcc since it will automatically be added thought BASEDEPENDS , and it will actually add the correct CROSS compiler, in this case you are depending on the native compiler instead (It will probably help you out to check the output of bitbake -e).

  • Also it is likely that you don't have to override do_configure() / do compile()

Now, to answer your question:

What you actually want to is to have access to files INSTALLED by other recipes, in this specific case you say the file pg_config is generated by the postgresql recipe, then usually what you need to do is add postgresql to DEPENDS , this way, before compiling the postgis recipe, bibtake will perform a task called prepare_recipe_sysroot which takes all files installed from packages listed on DEPENDS and adds them to recipe-sysroot/... or recipe-sysroot-native/... , this way when cross compiling your package it will have access to all that it requires (or at least all that you listed it requires).

Since you already listed postgresql on DEPENDS, I can only assume that the postgresql recipe is not installing the pg_config file, to do this you need to make sure that it is being installed on do_install() from the postgresql recipe and that it is packaged via the FILES_${PN} variable (again on the postgresql recipe).

To check that the file is being provided by the postgresql recipe, you can look for the file inside the sysroot-providers directory (which is inside your TMPDIR), under the popstgresql directory.

Hope that helps

like image 54
aehs29 Avatar answered Sep 26 '22 15:09

aehs29


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
}
like image 43
Chad Avatar answered Sep 23 '22 15:09

Chad