Gracefully handle missing dependencies.
authorwhitequark <whitequark@whitequark.org>
Wed, 1 Jul 2020 07:00:02 +0000 (07:00 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 31 Dec 2021 14:33:02 +0000 (14:33 +0000)
Some people's workflows involve not using `pip`. This is not
a recommended way to use nMigen, but is prevalent enough for good
enough reason that we try to keep them working anyway.

nmigen/__init__.py
nmigen/_yosys.py

index 78a8dec0c3b15ad49cef3dc925a2ef0c128804d6..93a3a9a9fa358ccadd2dcbdab66d29f5c2afb35f 100644 (file)
@@ -1,8 +1,14 @@
 try:
-    from importlib import metadata as importlib_metadata # py3.8+ stdlib
+    try:
+        from importlib import metadata as importlib_metadata # py3.8+ stdlib
+    except ImportError:
+        import importlib_metadata # py3.7- shim
+    __version__ = importlib_metadata.version(__package__)
 except ImportError:
-    import importlib_metadata # py3.7- shim
-__version__ = importlib_metadata.version(__package__)
+    # No importlib_metadata. This shouldn't normally happen, but some people prefer not installing
+    # packages via pip at all, instead using PYTHONPATH directly or copying the package files into
+    # `lib/pythonX.Y/site-packages`. Although not a recommended way, we still try to support it.
+    __version__ = "unknown"
 
 
 from .hdl import *
index c02c7c497b5550ff10e6b5cbe6594a2d6501508c..e84da53ac3bee2f4923f1d617f7da00b65f98ca0 100644 (file)
@@ -12,13 +12,16 @@ except ImportError:
     except ImportError:
         importlib_metadata = None # not installed
 try:
-    from importlib import resources as importlib_resources
     try:
-        importlib_resources.files # py3.9+ stdlib
-    except AttributeError:
-        import importlib_resources # py3.8- shim
+        from importlib import resources as importlib_resources
+        try:
+            importlib_resources.files # py3.9+ stdlib
+        except AttributeError:
+            import importlib_resources # py3.8- shim
+    except ImportError:
+        import importlib_resources # py3.6- shim
 except ImportError:
-    import importlib_resources # py3.6- shim
+    importlib_resources = None
 
 from ._toolchain import has_tool, require_tool
 
@@ -115,7 +118,7 @@ class _BuiltinYosys(YosysBinary):
 
     @classmethod
     def available(cls):
-        if importlib_metadata is None:
+        if importlib_metadata is None or importlib_resources is None:
             return False
         try:
             importlib_metadata.version(cls.YOSYS_PACKAGE)