Skip to content

Commit 3a3a058

Browse files
committed
Move GTK3 setupext checks to within the process.
Now that we don't support GTK2, there is no need to run the checks in a separate process anymore (gtk3, pyqt5, tk, and wx can all be imported into the same process). A cairo binding is also a dependency for gtk3agg, so the checks for gtk3agg and gtk3cairo should be literally identical.
1 parent 912f9b6 commit 3a3a058

File tree

1 file changed

+25
-129
lines changed

1 file changed

+25
-129
lines changed

setupext.py

Lines changed: 25 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from distutils.core import Extension
33
import distutils.command.build_ext
44
import glob
5+
import importlib
56
import multiprocessing
67
import os
78
import pathlib
@@ -1398,13 +1399,8 @@ def check(self):
13981399
return "installing; run-time loading from Python Tcl / Tk"
13991400

14001401
def runtime_check(self):
1401-
""" Checks whether TkAgg runtime dependencies are met
1402-
"""
1403-
try:
1404-
import tkinter
1405-
except ImportError:
1406-
return False
1407-
return True
1402+
"""Checks whether TkAgg runtime dependencies are met."""
1403+
return importlib.util.find_spec("tkinter") is not None
14081404

14091405
def get_extension(self):
14101406
sources = [
@@ -1425,144 +1421,44 @@ def add_flags(self, ext):
14251421
ext.libraries.extend(['dl'])
14261422

14271423

1428-
def backend_gtk3agg_internal_check(x):
1429-
try:
1430-
import gi
1431-
except ImportError:
1432-
return (False, "Requires pygobject to be installed.")
1433-
1434-
try:
1435-
gi.require_version("Gtk", "3.0")
1436-
except ValueError:
1437-
return (False, "Requires gtk3 development files to be installed.")
1438-
except AttributeError:
1439-
return (False, "pygobject version too old.")
1440-
1441-
try:
1442-
from gi.repository import Gtk, Gdk, GObject
1443-
except (ImportError, RuntimeError):
1444-
return (False, "Requires pygobject to be installed.")
1445-
1446-
return (True, "version %s.%s.%s" % (
1447-
Gtk.get_major_version(),
1448-
Gtk.get_micro_version(),
1449-
Gtk.get_minor_version()))
1450-
1451-
14521424
class BackendGtk3Agg(OptionalBackendPackage):
14531425
name = "gtk3agg"
14541426

14551427
def check_requirements(self):
1456-
if 'TRAVIS' in os.environ:
1457-
raise CheckFailed("Can't build with Travis")
1428+
if not any(map(importlib.util.find_spec, ["cairocffi", "cairo"])):
1429+
sys.exit("Requires cairocffi or pycairo to be installed.")
14581430

1459-
# This check needs to be performed out-of-process, because
1460-
# importing gi and then importing regular old pygtk afterward
1461-
# segfaults the interpreter.
14621431
try:
1463-
p = multiprocessing.Pool()
1464-
except:
1465-
return "unknown (can not use multiprocessing to determine)"
1466-
try:
1467-
res = p.map_async(backend_gtk3agg_internal_check, [0])
1468-
success, msg = res.get(timeout=10)[0]
1469-
except multiprocessing.TimeoutError:
1470-
p.terminate()
1471-
# No result returned. Probably hanging, terminate the process.
1472-
success = False
1473-
raise CheckFailed("Check timed out")
1474-
except:
1475-
p.close()
1476-
# Some other error.
1477-
success = False
1478-
msg = "Could not determine"
1479-
raise
1480-
else:
1481-
p.close()
1482-
finally:
1483-
p.join()
1484-
1485-
if success:
1486-
return msg
1487-
else:
1488-
raise CheckFailed(msg)
1489-
1490-
def get_package_data(self):
1491-
return {'matplotlib': ['mpl-data/*.glade']}
1492-
1493-
1494-
def backend_gtk3cairo_internal_check(x):
1495-
try:
1496-
import cairocffi
1497-
except ImportError:
1498-
try:
1499-
import cairo
1432+
import gi
15001433
except ImportError:
1501-
return (False, "Requires cairocffi or pycairo to be installed.")
1502-
1503-
try:
1504-
import gi
1505-
except ImportError:
1506-
return (False, "Requires pygobject to be installed.")
1507-
1508-
try:
1509-
gi.require_version("Gtk", "3.0")
1510-
except ValueError:
1511-
return (False, "Requires gtk3 development files to be installed.")
1512-
except AttributeError:
1513-
return (False, "pygobject version too old.")
1514-
1515-
try:
1516-
from gi.repository import Gtk, Gdk, GObject
1517-
except (RuntimeError, ImportError):
1518-
return (False, "Requires pygobject to be installed.")
1519-
1520-
return (True, "version %s.%s.%s" % (
1521-
Gtk.get_major_version(),
1522-
Gtk.get_micro_version(),
1523-
Gtk.get_minor_version()))
1524-
1525-
1526-
class BackendGtk3Cairo(OptionalBackendPackage):
1527-
name = "gtk3cairo"
1434+
raise CheckFailed("Requires pygobject to be installed.")
15281435

1529-
def check_requirements(self):
1530-
if 'TRAVIS' in os.environ:
1531-
raise CheckFailed("Can't build with Travis")
1532-
1533-
# This check needs to be performed out-of-process, because
1534-
# importing gi and then importing regular old pygtk afterward
1535-
# segfaults the interpreter.
15361436
try:
1537-
p = multiprocessing.Pool()
1538-
except:
1539-
return "unknown (can not use multiprocessing to determine)"
1437+
gi.require_version("Gtk", "3.0")
1438+
except ValueError:
1439+
raise CheckFailed(
1440+
"Requires gtk3 development files to be installed.")
1441+
except AttributeError:
1442+
raise CheckFailed("pygobject version too old.")
1443+
15401444
try:
1541-
res = p.map_async(backend_gtk3cairo_internal_check, [0])
1542-
success, msg = res.get(timeout=10)[0]
1543-
except multiprocessing.TimeoutError:
1544-
p.terminate()
1545-
# No result returned. Probably hanging, terminate the process.
1546-
success = False
1547-
raise CheckFailed("Check timed out")
1548-
except:
1549-
p.close()
1550-
success = False
1551-
raise
1552-
else:
1553-
p.close()
1554-
finally:
1555-
p.join()
1445+
from gi.repository import Gtk, Gdk, GObject
1446+
except (ImportError, RuntimeError):
1447+
raise CheckFailed("Requires pygobject to be installed.")
15561448

1557-
if success:
1558-
return msg
1559-
else:
1560-
raise CheckFailed(msg)
1449+
return "version {}.{}.{}".format(
1450+
Gtk.get_major_version(),
1451+
Gtk.get_micro_version(),
1452+
Gtk.get_minor_version())
15611453

15621454
def get_package_data(self):
15631455
return {'matplotlib': ['mpl-data/*.glade']}
15641456

15651457

1458+
class BackendGtk3Cairo(BackendGtk3Agg):
1459+
name = "gtk3cairo"
1460+
1461+
15661462
class BackendWxAgg(OptionalBackendPackage):
15671463
name = "wxagg"
15681464

0 commit comments

Comments
 (0)