Skip to content

Commit 781dc8f

Browse files
authored
[mypyc] Fix self-compilation on Python 3.12 (#15582)
1 parent e86f097 commit 781dc8f

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

mypyc/build.py

+24-14
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,31 @@
4040
from mypyc.namegen import exported_name
4141
from mypyc.options import CompilerOptions
4242

43-
if TYPE_CHECKING:
44-
from distutils.core import Extension as _distutils_Extension
45-
from typing_extensions import TypeAlias
43+
if sys.version_info < (3, 12):
44+
if TYPE_CHECKING:
45+
from distutils.core import Extension as _distutils_Extension
46+
from typing_extensions import TypeAlias
4647

47-
from setuptools import Extension as _setuptools_Extension
48+
from setuptools import Extension as _setuptools_Extension
4849

49-
Extension: TypeAlias = Union[_setuptools_Extension, _distutils_Extension]
50+
Extension: TypeAlias = Union[_setuptools_Extension, _distutils_Extension]
5051

51-
52-
try:
53-
# Import setuptools so that it monkey-patch overrides distutils
52+
try:
53+
# Import setuptools so that it monkey-patch overrides distutils
54+
import setuptools
55+
except ImportError:
56+
pass
57+
from distutils import ccompiler, sysconfig
58+
else:
5459
import setuptools
55-
except ImportError:
56-
if sys.version_info >= (3, 12):
57-
# Raise on Python 3.12, since distutils will go away forever
58-
raise
59-
from distutils import ccompiler, sysconfig
60+
from setuptools import Extension
61+
from setuptools._distutils import (
62+
ccompiler as _ccompiler, # type: ignore[attr-defined]
63+
sysconfig as _sysconfig, # type: ignore[attr-defined]
64+
)
65+
66+
ccompiler = _ccompiler
67+
sysconfig = _sysconfig
6068

6169

6270
def get_extension() -> type[Extension]:
@@ -65,11 +73,13 @@ def get_extension() -> type[Extension]:
6573
use_setuptools = "setuptools" in sys.modules
6674
extension_class: type[Extension]
6775

68-
if not use_setuptools:
76+
if sys.version_info < (3, 12) and not use_setuptools:
6977
import distutils.core
7078

7179
extension_class = distutils.core.Extension
7280
else:
81+
if not use_setuptools:
82+
sys.exit("error: setuptools not installed")
7383
extension_class = setuptools.Extension
7484

7585
return extension_class

0 commit comments

Comments
 (0)