Files
sqlalchemy/setup.py
T
Trevor Gross 7b67920fcb Use cibuildwheel to create wheels
Using cibuildwheel the following wheels are created:
- windows x64 and x84
- macos x64 and arm
- linux x64 and arm on manylinux and mosulinux (for alpine)
- create a pure python wheel (for pypy and other archs)

Fixes: #6702
Fixes: #7607
Closes: #7992
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7992
Pull-request-sha: 61d5e24e5b

Change-Id: If0c0b353766e0b61d421789d619eb2b940c08ad0
2022-08-29 17:21:51 +00:00

170 lines
4.8 KiB
Python

import os
import platform
import sys
from setuptools import __version__
from setuptools import setup
if not int(__version__.partition(".")[0]) >= 47:
raise RuntimeError(f"Setuptools >= 47 required. Found {__version__}")
# attempt to use pep-632 imports for setuptools symbols; however,
# since these symbols were only added to setuptools as of 59.0.1,
# fall back to the distutils symbols otherwise
try:
from setuptools.errors import CCompilerError
from setuptools.errors import DistutilsExecError
from setuptools.errors import DistutilsPlatformError
except ImportError:
from distutils.errors import CCompilerError
from distutils.errors import DistutilsExecError
from distutils.errors import DistutilsPlatformError
try:
from Cython.Distutils.old_build_ext import old_build_ext
from Cython.Distutils.extension import Extension
CYTHON = True
except ImportError:
CYTHON = False
cmdclass = {}
cpython = platform.python_implementation() == "CPython"
ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError)
extra_compile_args = []
if sys.platform == "win32":
# Work around issue https://github.com/pypa/setuptools/issues/1902
ext_errors += (IOError, TypeError)
cython_files = [
"collections.pyx",
"immutabledict.pyx",
"processors.pyx",
"resultproxy.pyx",
"util.pyx",
]
cython_directives = {"language_level": "3"}
if CYTHON:
def get_ext_modules():
module_prefix = "sqlalchemy.cyextension."
source_prefix = "lib/sqlalchemy/cyextension/"
ext_modules = []
for file in cython_files:
name, _ = os.path.splitext(file)
ext_modules.append(
Extension(
module_prefix + name,
sources=[source_prefix + file],
extra_compile_args=extra_compile_args,
cython_directives=cython_directives,
)
)
return ext_modules
class BuildFailed(Exception):
pass
class ve_build_ext(old_build_ext):
# This class allows Cython building to fail.
def run(self):
try:
super().run()
except DistutilsPlatformError:
raise BuildFailed()
def build_extension(self, ext):
try:
super().build_extension(ext)
except ext_errors as e:
raise BuildFailed() from e
except ValueError as e:
# this can happen on Windows 64 bit, see Python issue 7511
if "'path'" in str(e):
raise BuildFailed() from e
raise
cmdclass["build_ext"] = ve_build_ext
ext_modules = get_ext_modules()
else:
ext_modules = []
def status_msgs(*msgs):
print("*" * 75)
for msg in msgs:
print(msg)
print("*" * 75)
def run_setup(with_cext):
kwargs = {}
if with_cext:
kwargs["ext_modules"] = ext_modules
else:
if os.environ.get("REQUIRE_SQLALCHEMY_CEXT"):
raise AssertionError(
"Can't build on this platform with REQUIRE_SQLALCHEMY_CEXT"
" set. Cython is required to build compiled extensions"
)
kwargs["ext_modules"] = []
setup(cmdclass=cmdclass, **kwargs)
if not cpython:
run_setup(False)
status_msgs(
"WARNING: Cython extensions are not supported on "
"this Python platform, speedups are not enabled.",
"Plain-Python build succeeded.",
)
elif not CYTHON:
run_setup(False)
status_msgs(
"WARNING: Cython is required to build the compiled "
"extensions, speedups are not enabled.",
"Plain-Python build succeeded.",
)
elif os.environ.get("DISABLE_SQLALCHEMY_CEXT"):
run_setup(False)
status_msgs(
"DISABLE_SQLALCHEMY_CEXT is set; "
"not attempting to build Cython extensions.",
"Plain-Python build succeeded.",
)
else:
try:
run_setup(True)
except BuildFailed as exc:
if os.environ.get("REQUIRE_SQLALCHEMY_CEXT"):
status_msgs(
"NOTE: Cython extension build is required because "
"REQUIRE_SQLALCHEMY_CEXT is set, and the build has failed; "
"will not degrade to non-C extensions"
)
raise
status_msgs(
exc.__cause__,
"WARNING: The Cython extension could not be compiled, "
"speedups are not enabled.",
"Failure information, if any, is above.",
"Retrying the build without the C extension now.",
)
run_setup(False)
status_msgs(
"WARNING: The Cython extension could not be compiled, "
"speedups are not enabled.",
"Plain-Python build succeeded.",
)