I'm trying to build my legacy project with the pypy-2.7-buster
Docker image.
Some requirements need to be built in the install process inside the container.
Problem arises when one of my dependencies needs setuptools
to build itself, their specified version in the pyproject.toml
or setup.py
is too loose and it fetches setuptools-57.something
which is not compatible with Python 2.7.
requirements.txt
setuptools==44.1.1
numpy==1.16.6
cryptography==3.3.1
Here's a case when it happens with cryptography-3.3.1
(lines 15 and 16 give it away):
1 Requirement already satisfied: setuptools==44.1.1 in /opt/pypy/site-packages (from -c constraints.txt (line 1)) (44.1.1)
2 Collecting numpy==1.16.6
3 Downloading .../numpy-1.16.6.zip (5.1 MB)
4 Collecting cryptography==3.3.1
5 Downloading ...cryptography-3.3.1.tar.gz (539 kB)
6 Installing build dependencies: started
7 Installing build dependencies: finished with status 'error'
8 ERROR: Command errored out with exit status 1:
9 command: /opt/pypy/bin/pypy /opt/pypy/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-rDC5lF/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i repo --trusted-host host -- 'setuptools>=40.6.0' wheel 'cffi>=1.12; platform_python_implementation != '"'"'PyPy'"'"''
10 cwd: None
11 Complete output (34 lines):
12 DEPRECATION: pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
13 Looking in indexes: repo
14 Ignoring cffi: markers 'platform_python_implementation != "PyPy"' don't match your environment
15 Collecting setuptools>=40.6.0
16 Downloading repo/setuptools-57.4.0.tar.gz (2.1 MB)
17 Installing build dependencies: started
18 Installing build dependencies: finished with status 'done'
19 Getting requirements to build wheel: started
20 Getting requirements to build wheel: finished with status 'error'
21 ERROR: Command errored out with exit status 1:
22 command: /opt/pypy/bin/pypy /opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /tmp/tmpXomGVX
23 cwd: /tmp/pip-install-8S7wKA/setuptools
24 Complete output (19 lines):
25 Traceback (most recent call last):
26 File "/opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py", line 280, in <module>
27 main()
28 File "/opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py", line 263, in main
29 json_out['return_val'] = hook(**hook_input['kwargs'])
30 File "/opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py", line 108, in get_requires_for_build_wheel
31 backend = _build_backend()
32 File "/opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py", line 86, in _build_backend
33 obj = import_module(mod_path)
34 File "/opt/pypy/lib-python/2.7/importlib/__init__.py", line 37, in import_module
35 __import__(name)
36 File "/tmp/pip-install-8S7wKA/setuptools/setuptools/__init__.py", line 16, in <module>
37 import setuptools.version
38 File "/tmp/pip-install-8S7wKA/setuptools/setuptools/version.py", line 1, in <module>
39 import pkg_resources
40 File "/tmp/pip-install-8S7wKA/setuptools/pkg_resources/__init__.py", line 1367
41 raise SyntaxError(e) from e
42 ^
43 SyntaxError: invalid syntax
44 ----------------------------------------
45 ERROR: Command errored out with exit status 1: /opt/pypy/bin/pypy /opt/pypy/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /tmp/tmpXomGVX Check the logs for full command output.
46 ----------------------------------------
47w ERROR: Command errored out with exit status 1: /opt/pypy/bin/pypy /opt/pypy/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-rDC5lF/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i repo --trusted-host host -- 'setuptools>=40.6.0' wheel 'cffi>=1.12; platform_python_implementation != '"'"'PyPy'"'"'' Check the logs for full command output.
In the pyproject.toml
of cryptography-3.3.1
source, there is this:
requires = ["setuptools>=40.6.0"...
so it ignores the setuptools-44.1.1
it already installed and goes to get the latest one which is not Python 2.7 compatible.
I see that the command it runs when installing build dependencies has a --ignore-installed
flag, could that be overridden?
I tried changing the source, PKG-INFO, uploading this custom version to my repo and it worked. The thing is, it happens in multiple places (pandas, PyYAML...) and it feels hacky to do custom versions for each requirement. :(
Also tried some pip flags to override this, nothing helped.
Thanks!