Skip to main content

A cross-compiling tool for Python extension modules

Project description

Documentation is available online at https://crossenv.readthedocs.io and in the docs directory.

Porting a Python app to an embedded device can be complicated. Once you have Python built for your system, you may find yourself needing to include many third-party libraries. Pure-Python libraries usually just work, but many popular libraries rely on compiled C code, which can be challenging to build.

This package is a tool for cross-compiling extension modules. It creates a special virtual environment such that pip or setup.py will cross compile packages for you, usually with no further work on your part.

It can be used to:

  • Build binary wheels, for installation on target.

  • Install packages to a directory for upload or inclusion in a firmware image.

Note: While this tool can cross-compile most Python packages, it can’t solve all the problems of cross-compiling. In some cases manual intervention may still be necessary.

This tool requires Python 3.5 or higher (host and build). Significant work has gone into cross-compiling Python in newer versions, and many of the techniques needed to do the cross compilation properly are not available on older releases.

This tool currently only supports Linux build machines.

Vocabulary

Host

The machine you are building for. (Android, iOS, other embedded systems.)

Build

The machine you are building on. (Probably your desktop.)

Host-python

The compiled Python binary and libraries that run on Host

Build-python

The compiled Python binary and libraries that run on Build.

Cross-python

Build-python, configured specially to build packages that can be run with Host-python. This tool creates Cross-python.

How it works

Cross-python is set up carefully so that it reports all system information exactly as Host-python would. When done correctly, a side effect of this is that distutils and setuptools will cross-compile when building packages. All of the normal packaging machinery still works correctly, so dependencies, ABI tags, and so forth all work as expected.

Requirements

You will need:

  1. A version of Python (3.5 or later) that runs on Build. (Build-python.)

  2. A version of Python that will run on Host. (Host-python.) This must be the same version as Build-python.

  3. The cross-compiling toolchain used to make Host-python. Make sure you set PATH correctly to use it.

  4. Any libraries your modules depend on, cross-compiled and installed somewhere Cross-python can get to them. For example, the cryptography package depends on OpenSSL and libffi.

Installation

Crossenv can be installed using pip:

$ pip install crossenv

Usage

To create the virtual environment:

$ /path/to/build/python3 -m crossenv /path/to/host/python3 venv

This creates a folder named venv that contains two subordinate virtual environments: one for Build-python, and one for Cross-python. When activated, python (or its alias cross-python) can be used for cross compiling. If needed, packages can be installed on Build (e.g., a package requires Cython to install) with build-python. There are equivalent pip, cross-pip, and build-pip commands.

The cross-compiler to use, along with any extra flags needed, are taken from information recorded when Host-python was compiled. To activate the environment:

$ . venv/bin/activate

You can now see that python seems to think it’s running on Host:

(cross) $ python -m sysconfig
...

Now you can cross compile! To install a package to venv/cross/lib/python3.6/site-packages, you can use pip directly:

(cross) $ pip -v install numpy
...

You can use setup.py to build wheels:

(cross) $ pip install wheel
(cross) $ pip download numpy
Collecting numpy
  Using cached numpy-1.14.1.zip
  Saved ./numpy-1.14.1.zip
Successfully downloaded numpy
(cross) $ unzip -q ./numpy-1.14.1.zip
(cross) $ cd numpy-1.14.1
(cross) $ python setup.py bdist_wheel
...

When you need packages like Cython or cffi installed to build another module, sometimes satisfying dependencies can get tricky. If you simply pip install the module, you may find it builds Cython as a prerequisite for the host and then tries to run it on the build machine. This will fail, of course, but if we install the necessary package for build-python, then pip will pick up the correct version during install.

For example, to build bcrypt and python-cryptography:

(cross) $ build-pip install cffi
(cross) $ pip install bcrypt
(cross) $ pip install cryptography

Some packages do explicit checks for existence of a package. For instance, a package may do a check for Cython (other than simply trying to import it) before proceeding with installation. If a package is installed with build-pip, etc., then setuptools in cross-python does not recognize it as installed. (Note that you can still import it even if setuptools can’t see it, so the naive check of import Cython will work fine so long as you did build-pip install Cython earlier.) This is by design. To selectively expose build-python packages so that setuptools will count them as installed, you can use the cross-expose script installed in the virtual environment.

Known Limitations

  • Upgrading cross-pip and build-pip must be done carefully, and it’s best not to do so unless you need to. If you need to: upgrade cross-pip first, then build-pip.

  • When installing scripts, the shebang (#!) line is wrong. This will need to be fixed up before using on Host.

  • Any dependant libraries used during the build, such as OpenSSL, are not packaged in the wheel or install directory. You will need to ensure that these libraries are installed on Host and can be used. This is the normal Python behavior.

  • Any setup-time requirement listed in setup.py under setup_requires will be installed in Cross-python’s virtual environment, not Build-python. This will mostly work anyway if they are pure-Python, but for packages with extension modules (Cython, etc.), you will need to install them into Build-python’s environment first. It’s often a good idea to do a build-pip install <whatever> prior to pip install <whatever>.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crossenv-1.6.1.tar.gz (40.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crossenv-1.6.1-py3-none-any.whl (33.9 kB view details)

Uploaded Python 3

File details

Details for the file crossenv-1.6.1.tar.gz.

File metadata

  • Download URL: crossenv-1.6.1.tar.gz
  • Upload date:
  • Size: 40.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for crossenv-1.6.1.tar.gz
Algorithm Hash digest
SHA256 5b7e2f231d9a3c6ea56ce3b7fd7acbe0f1e310e44a8f699909910f1334db1a31
MD5 ccb686da683a1bdb18f0eab4529484ea
BLAKE2b-256 e0cfb765be149abbfeed27ba1f4dda0f19c61ebd3807fdb035bd42a40a31dcff

See more details on using hashes here.

Provenance

The following attestation bundles were made for crossenv-1.6.1.tar.gz:

Publisher: ci.yml on robotpy/crossenv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crossenv-1.6.1-py3-none-any.whl.

File metadata

  • Download URL: crossenv-1.6.1-py3-none-any.whl
  • Upload date:
  • Size: 33.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for crossenv-1.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7f6913668cc59fb6d84953ec275df5f76c42d64347455927c17b7c984162ee6f
MD5 5eda072f62a2a23d895df19bf9b9f6f8
BLAKE2b-256 90ed8644a6ac9fe2e077e20baf7f4231ed6970b7eae24d6094ad3fdd3303c015

See more details on using hashes here.

Provenance

The following attestation bundles were made for crossenv-1.6.1-py3-none-any.whl:

Publisher: ci.yml on robotpy/crossenv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page