193 lines
7.9 KiB
ReStructuredText
193 lines
7.9 KiB
ReStructuredText
========================
|
|
Installing From Source
|
|
========================
|
|
|
|
If you are unable to use the binary wheels (for platforms where no
|
|
pre-built wheels are available or if wheel installation is disabled),
|
|
you can build gevent from source. A normal ``pip install`` will
|
|
fallback to doing this if no binary wheel is available. (If you'll be
|
|
:ref:`developing <development>` gevent, you'll need to install from
|
|
source also; follow that link for more details.)
|
|
|
|
|
|
General Notes
|
|
=============
|
|
|
|
- You can force installation of gevent from source with ``pip
|
|
install --no-binary gevent gevent``. This is useful if there is a
|
|
binary wheel available, but you want to change the compile-time
|
|
options, such as to use a system version of libuv instead of the
|
|
embedded version. See :ref:`build-config`.
|
|
|
|
- You'll need `pip 19 and setuptools 40.8
|
|
<https://pip.pypa.io/en/stable/reference/pip/#pep-517-and-518-support>`_
|
|
with fully functional :pep:`518` and :pep:`517` support to install
|
|
gevent from source.
|
|
|
|
- You'll need a working C compiler toolchain that can build Python
|
|
extensions. On some platforms, you may need to install Python
|
|
development packages. You'll also need the ability to compile `cffi
|
|
<https://pypi.org/project/cffi/>`_ modules, which may require
|
|
installing FFI development packages. Installing `make
|
|
<https://en.wikipedia.org/wiki/Make_(software)>`_ and other common
|
|
utilities such as `file
|
|
<https://en.wikipedia.org/wiki/File_(command)>`_ may also be
|
|
required.
|
|
|
|
For example, on Alpine Linux, one might need to do this::
|
|
|
|
apk add --virtual build-deps file make gcc musl-dev libffi-dev
|
|
|
|
On Fedora Rawhide for Fedora 33, one might need to do this::
|
|
|
|
yum install python3-devel gcc kernel-devel kernel-headers make diffutils file
|
|
|
|
(Newer versions of Fedora use ``dnf`` for package management but as
|
|
of this writing ``yum`` is still available and widely used,
|
|
especially for backwards compatibility.)
|
|
|
|
On the Docker image for Ubuntu 20.04, one might need to do this::
|
|
|
|
apt-get install python3.9-full python3.9-dev linux-headers-virtual make gcc libtool
|
|
|
|
See :issue:`1567`, :issue:`1559`, and :issue:`1566`.
|
|
|
|
.. note::
|
|
|
|
The exact set of external dependencies isn't necessarily fixed
|
|
and depends on the configure scripts of the bundled C libraries
|
|
such as libev, libuv and c-ares. Disabling :ref:`embed-lib` and
|
|
using system libraries can reduce these dependencies, although
|
|
this isn't encouraged.
|
|
|
|
- On older versions of Linux, linking to ``librt`` might be useful to
|
|
avoid system calls from libev accessing the current time. One way to
|
|
do this is to set the ``LDFLAGS`` environment variable to include
|
|
``-lrt`` when installing from source. (This is done automatically
|
|
when gevent builds manylinux wheels.) See :pr:`1650`.
|
|
|
|
- Installing from source requires ``setuptools``. This is installed
|
|
automatically in virtual environments and by buildout. However,
|
|
gevent uses :pep:`496` environment markers in ``setup.py``.
|
|
Consequently, you'll need a version of setuptools newer than 25
|
|
(mid 2016) to install gevent from source; a version that's too old
|
|
will produce a ``ValueError``. Older versions of pipenv may also
|
|
`have issues installing gevent for this reason
|
|
<https://github.com/pypa/pipenv/issues/2113>`_.
|
|
|
|
- gevent 1.5 and newer come with a ``pyproject.toml`` file that
|
|
installs the build dependencies, including CFFI (needed for libuv
|
|
support). pip 18 or above is required for this support.
|
|
|
|
- You can use pip's `VCS support
|
|
<https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support>`_
|
|
to install gevent directly from its code repository. This can be
|
|
useful to check if a bug you're experiencing has been fixed. For
|
|
example, to install the current development version::
|
|
|
|
pip install git+git://github.com/gevent/gevent.git#egg=gevent
|
|
|
|
Often one would install this way into a virtual environment.
|
|
|
|
If you're using pip 18 or above, that should be all you need. If you
|
|
have difficulties, see the development instructions for more information.
|
|
|
|
|
|
Common Installation Issues
|
|
==========================
|
|
|
|
The following are some common installation problems and solutions for
|
|
those compiling gevent from source.
|
|
|
|
- Some Linux distributions are now mounting their temporary
|
|
directories with the ``noexec`` option. This can cause a standard
|
|
``pip install gevent`` to fail with an error like ``cannot run C
|
|
compiled programs``. One fix is to mount the temporary directory
|
|
without that option. Another may be to use the ``--build`` option to
|
|
``pip install`` to specify another directory. See `issue #570
|
|
<https://github.com/gevent/gevent/issues/570>`_ and `issue #612
|
|
<https://github.com/gevent/gevent/issues/612>`_ for examples.
|
|
|
|
- Also check for conflicts with environment variables like ``CFLAGS``.
|
|
For example, see `Library Updates
|
|
<http://www.gevent.org/whatsnew_1_1.html#library-updates-label>`_.
|
|
|
|
- Users of a recent SmartOS release may need to customize the
|
|
``CPPFLAGS`` (the environment variable containing the default
|
|
options for the C preprocessor) if they are using the libev shipped
|
|
with gevent. See `Operating Systems
|
|
<http://www.gevent.org/whatsnew_1_1.html#operating-systems-label>`_
|
|
for more information.
|
|
|
|
- If you see ``ValueError: ("Expected ',' or end-of-list in", "cffi >=
|
|
1.11.5 ; sys_platform == 'win32' and platform_python_implementation
|
|
== 'CPython'", 'at', " ; sys_platform == 'win32' and
|
|
platform_python_implementation == 'CPython'")``, the version of
|
|
setuptools is too old. Install a more recent version of setuptools.
|
|
|
|
.. _build-config:
|
|
|
|
Build-Time Configuration
|
|
========================
|
|
|
|
There are a few knobs that can be tweaked at gevent build time. These
|
|
are mostly useful for downstream packagers. They all take the form of
|
|
environment variables that must be set when ``setup.py`` is called
|
|
(note that ``pip install`` will invoke ``setup.py``). Toggle flags
|
|
that have boolean values may take the form of 0/1, true/false, off/on,
|
|
yes/no.
|
|
|
|
``CPPFLAGS``
|
|
A standard variable used when building the C extensions. gevent may
|
|
make slight modifications to this variable.
|
|
``CFLAGS``
|
|
A standard variable used when building the C extensions. gevent may
|
|
make slight modifications to this variable.
|
|
``LDFLAGS``
|
|
A standard variable used when building the C extensions. gevent may
|
|
make slight modifications to this variable.
|
|
``GEVENTSETUP_EV_VERIFY``
|
|
If set, the value is passed through as the value of the
|
|
``EV_VERIFY`` C compiler macro when libev is embedded.
|
|
|
|
In general, setting ``CPPFLAGS`` is more general and can contain
|
|
other macros recognized by libev.
|
|
|
|
.. _embed-lib:
|
|
|
|
Embedding Libraries
|
|
-------------------
|
|
|
|
By default, gevent builds and embeds tested versions of its C
|
|
dependencies libev, libuv, and c-ares. This is the recommended
|
|
configuration as the specific versions used are tested by gevent, and
|
|
sometimes require patches to be applied. Moreover, embedding,
|
|
especially in the case of libev, can be more efficient as features not
|
|
needed by gevent can be disabled, resulting in smaller or faster
|
|
libraries or runtimes.
|
|
|
|
However, this can be disabled, either for all libraries at once or for
|
|
individual libraries.
|
|
|
|
When embedding a library is disabled, the library must already be
|
|
installed on the system in a way the compiler can access and link
|
|
(i.e., correct ``CPPFLAGS``, etc) in order to use the corresponding C
|
|
extension.
|
|
|
|
``GEVENTSETUP_EMBED``
|
|
A boolean defaulting to true. When turned off (e.g.,
|
|
``GEVENTSETUP_EMBED=0``), libraries are not embedded in the gevent C
|
|
extensions. The value of this is used as the default for all the
|
|
libraries if no more specific version is defined.
|
|
``GEVENTSETUP_EMBED_LIBEV``
|
|
Controls embedding libev.
|
|
``GEVENTSETUP_EMBED_CARES``
|
|
Controls embedding c-ares.
|
|
``GEVENTSETUP_EMBED_LIBUV``
|
|
This is not defined or used, only a CFFI extension is available and
|
|
those are always embedded.
|
|
|
|
Older versions of gevent supported ``EMBED`` and ``LIBEV_EMBED``, etc,
|
|
to mean the same thing. Those aliases still work but are deprecated
|
|
and print a warning.
|