build.plat: don't check for toolchain presence if do_build=False.
authorwhitequark <whitequark@whitequark.org>
Sun, 12 Apr 2020 03:28:29 +0000 (03:28 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 31 Dec 2021 13:24:52 +0000 (13:24 +0000)
nmigen/build/plat.py

index 422cc857ef6252bc93e46373e499b9e308176777..291d90c1dd0308081f60f65505cbabfb13b58e4a 100644 (file)
@@ -71,7 +71,19 @@ class Platform(ResourceManager, metaclass=ABCMeta):
               build_dir="build", do_build=True,
               program_opts=None, do_program=False,
               **kwargs):
-        if self._toolchain_env_var not in os.environ:
+        # The following code performs a best-effort check for presence of required tools upfront,
+        # before performing any build actions, to provide a better diagnostic. It does not handle
+        # several corner cases:
+        #  1. `require_tool` does not source toolchain environment scripts, so if such a script
+        #     is used, the check is skipped, and `execute_local()` may fail;
+        #  2. if the design is not built (do_build=False), most of the tools are not required and
+        #     in fact might not be available if the design will be built manually with a different
+        #     environment script specified, or on a different machine; however, Yosys is required
+        #     by virtually every platform anyway, to provide debug Verilog output, and `prepare()`
+        #     may fail.
+        # This is OK because even if `require_tool` succeeds, the toolchain might be broken anyway.
+        # The check only serves to catch common errors earlier.
+        if do_build and self._toolchain_env_var not in os.environ:
             for tool in self.required_tools:
                 require_tool(tool)