Search code examples
pythonopenembeddedbitbake

Building python packages


I am bitbaking a couple of python libraries and got this warning while adding second one of them:

WARNING: The recipe is trying to install files into a shared area when those files already exist. Those files are:
   /home/ilya/beaglebone-dany/build/tmp/sysroots/beaglebone/usr/lib/python2.7/site-packages/site.py
   /home/ilya/beaglebone-dany/build/tmp/sysroots/beaglebone/usr/lib/python2.7/site-packages/site.pyo

The libraries both use inherit distutils. So this is okay as far as bitbake goes, but when I tried to install the second package via opkg, I got this error:

# opkg install http://yocto.local:8080/python-requests_1.2.0-r0_armv7a-vfp-neon.ipk
Downloading http://yocto.local:8080/python-requests_1.2.0-r0_armv7a-vfp-neon.ipk.
Installing python-requests (1.2.0-r0) to root...
Configuring python-requests.

# opkg install http://yocto.local:8000/python-mylib_0.0.1-r0_armv7a-vfp-neon.ipk
Downloading http://yocto.local:8080/python-mylib_0.0.1-r0_armv7a-vfp-neon.ipk.
Installing python-mylib (0.0.1-r0) to root...
Collected errors:
 * check_data_file_clashes: Package mylib-python wants to install file /usr/lib/python2.7/site-packages/site.py
        But that file is already provided by package  * python-requests
 * check_data_file_clashes: Package mylib-python wants to install file /usr/lib/python2.7/site-packages/site.pyo
        But that file is already provided by package  * python-requests
 * opkg_install_cmd: Cannot install package mylib-python.

Both recipes look just like so:

DESCRIPTION = "Requests: HTTP for Humans"
HOMEPAGE = "http://docs.python-requests.org/en/latest/"
SECTION = "devel/python"
LICENSE = "Apache-2.0"

DEPENDS = "python"
RDEPENDS_${PN} = "python-core"
PR = "r0"

SRC_URI = "git://github.com/kennethreitz/requests;protocol=git"

S = "${WORKDIR}/git/"

inherit distutils

#NOTE: I'm not 100% sure whether I still need to export these?
export BUILD_SYS
export HOST_SYS
export STAGING_INCDIR
export STAGING_LIBDIR

BBCLASSEXTEND = "native"

I have copied this from pycurl recipe, which also have had these lines that I removed:

do_install_append() {
    rm -rf ${D}${datadir}/share
}

Solution

  • To get rid of the conflicting /usr/lib/python2.7/site-packages/site.py, one needs to avoid shipping this file by doing this:

    do_install_append() {
      rm -f ${D}${libdir}/python*/site-packages/site.py*
    }
    

    There had been another issue with the original version of recipe, the files it installed contained just .egg directory. I wasn't able to import the resulting package.

    It turns out that using inherit setuptools instead of inherit distutils works.

    I'm not a Python expert, but all setuptools class does is just this:

    inherit distutils
    
    DEPENDS += "python-setuptools-native"
    
    DISTUTILS_INSTALL_ARGS = "--root=${D} \
        --single-version-externally-managed \
        --prefix=${prefix} \
        --install-lib=${PYTHON_SITEPACKAGES_DIR} \
        --install-data=${datadir}"
    

    It turns out that some modules (e.g. PyBBIO) do not recognise --single-version-externally-managed, so then you have to use inherit distutils and you do get a working package.

    Below is full recipe for the python-requests package which should soon be available upstream, in case you are intending to use it.

    DESCRIPTION = "Requests: HTTP for Humans"
    HOMEPAGE = "http://docs.python-requests.org/en/latest/"
    SECTION = "devel/python"
    LICENSE = "Apache-2.0"
    
    #DEPENDS = "python-core"
    RDEPENDS_${PN} = "python"
    PR = "r0"
    
    SRC_URI = "git://github.com/kennethreitz/requests;protocol=git"
    
    S = "${WORKDIR}/git/"
    
    inherit setuptools
    
    # need to export these variables for python-config to work
    export BUILD_SYS
    export HOST_SYS
    export STAGING_INCDIR
    export STAGING_LIBDIR
    
    BBCLASSEXTEND = "native"
    
    do_install_append() {
      rm -f ${D}${libdir}/python*/site-packages/site.py*
    }