From 56905032ce21dff3502f4ef43c86bdbea5a0f7ff Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 26 Mar 2018 17:14:48 -0700 Subject: [PATCH] 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. --- setupext.py | 153 +++++++++------------------------------------------- 1 file changed, 24 insertions(+), 129 deletions(-) diff --git a/setupext.py b/setupext.py index e57f1d9b0333..d3d0e13cbcce 100644 --- a/setupext.py +++ b/setupext.py @@ -1390,13 +1390,8 @@ def check(self): return "installing; run-time loading from Python Tcl / Tk" def runtime_check(self): - """ Checks whether TkAgg runtime dependencies are met - """ - try: - import tkinter - except ImportError: - return False - return True + """Checks whether TkAgg runtime dependencies are met.""" + return importlib.util.find_spec("tkinter") is not None def get_extension(self): sources = [ @@ -1417,144 +1412,44 @@ def add_flags(self, ext): ext.libraries.extend(['dl']) -def backend_gtk3agg_internal_check(x): - try: - import gi - except ImportError: - return (False, "Requires pygobject to be installed.") - - try: - gi.require_version("Gtk", "3.0") - except ValueError: - return (False, "Requires gtk3 development files to be installed.") - except AttributeError: - return (False, "pygobject version too old.") - - try: - from gi.repository import Gtk, Gdk, GObject - except (ImportError, RuntimeError): - return (False, "Requires pygobject to be installed.") - - return (True, "version %s.%s.%s" % ( - Gtk.get_major_version(), - Gtk.get_micro_version(), - Gtk.get_minor_version())) - - class BackendGtk3Agg(OptionalBackendPackage): name = "gtk3agg" def check_requirements(self): - if 'TRAVIS' in os.environ: - raise CheckFailed("Can't build with Travis") + if not any(map(importlib.util.find_spec, ["cairocffi", "cairo"])): + raise CheckFailed("Requires cairocffi or pycairo to be installed.") - # This check needs to be performed out-of-process, because - # importing gi and then importing regular old pygtk afterward - # segfaults the interpreter. try: - p = multiprocessing.Pool() - except: - return "unknown (can not use multiprocessing to determine)" - try: - res = p.map_async(backend_gtk3agg_internal_check, [0]) - success, msg = res.get(timeout=10)[0] - except multiprocessing.TimeoutError: - p.terminate() - # No result returned. Probably hanging, terminate the process. - success = False - raise CheckFailed("Check timed out") - except: - p.close() - # Some other error. - success = False - msg = "Could not determine" - raise - else: - p.close() - finally: - p.join() - - if success: - return msg - else: - raise CheckFailed(msg) - - def get_package_data(self): - return {'matplotlib': ['mpl-data/*.glade']} - - -def backend_gtk3cairo_internal_check(x): - try: - import cairocffi - except ImportError: - try: - import cairo + import gi except ImportError: - return (False, "Requires cairocffi or pycairo to be installed.") - - try: - import gi - except ImportError: - return (False, "Requires pygobject to be installed.") - - try: - gi.require_version("Gtk", "3.0") - except ValueError: - return (False, "Requires gtk3 development files to be installed.") - except AttributeError: - return (False, "pygobject version too old.") - - try: - from gi.repository import Gtk, Gdk, GObject - except (RuntimeError, ImportError): - return (False, "Requires pygobject to be installed.") - - return (True, "version %s.%s.%s" % ( - Gtk.get_major_version(), - Gtk.get_micro_version(), - Gtk.get_minor_version())) - - -class BackendGtk3Cairo(OptionalBackendPackage): - name = "gtk3cairo" + raise CheckFailed("Requires pygobject to be installed.") - def check_requirements(self): - if 'TRAVIS' in os.environ: - raise CheckFailed("Can't build with Travis") - - # This check needs to be performed out-of-process, because - # importing gi and then importing regular old pygtk afterward - # segfaults the interpreter. try: - p = multiprocessing.Pool() - except: - return "unknown (can not use multiprocessing to determine)" + gi.require_version("Gtk", "3.0") + except ValueError: + raise CheckFailed( + "Requires gtk3 development files to be installed.") + except AttributeError: + raise CheckFailed("pygobject version too old.") + try: - res = p.map_async(backend_gtk3cairo_internal_check, [0]) - success, msg = res.get(timeout=10)[0] - except multiprocessing.TimeoutError: - p.terminate() - # No result returned. Probably hanging, terminate the process. - success = False - raise CheckFailed("Check timed out") - except: - p.close() - success = False - raise - else: - p.close() - finally: - p.join() + from gi.repository import Gtk, Gdk, GObject + except (ImportError, RuntimeError): + raise CheckFailed("Requires pygobject to be installed.") - if success: - return msg - else: - raise CheckFailed(msg) + return "version {}.{}.{}".format( + Gtk.get_major_version(), + Gtk.get_minor_version(), + Gtk.get_micro_version()) def get_package_data(self): return {'matplotlib': ['mpl-data/*.glade']} +class BackendGtk3Cairo(BackendGtk3Agg): + name = "gtk3cairo" + + class BackendWxAgg(OptionalBackendPackage): name = "wxagg"