build.plat: allow selecting a specific UNIX shell interpreter.
authorwhitequark <cz@m-labs.hk>
Sun, 4 Aug 2019 13:18:29 +0000 (13:18 +0000)
committerwhitequark <cz@m-labs.hk>
Sun, 4 Aug 2019 13:20:54 +0000 (13:20 +0000)
Mostly because vendor tools have bashisms.

nmigen/build/plat.py

index dc917e7cb68e7c6bb63141fd8aa6cfefb979f153..94fd79fb0d3d0d7c44d5654c4eb450704304f8a3 100644 (file)
@@ -221,11 +221,13 @@ class TemplatedPlatform(Platform):
     toolchain         = abstractproperty()
     file_templates    = abstractproperty()
     command_templates = abstractproperty()
+    unix_interpreter  = "sh"
 
     build_script_templates = {
         "build_{{name}}.sh": """
             # {{autogenerated}}
             set -e{{verbose("x")}}
+            {{emit_unix_interpreter()}}
             [ -n "$NMIGEN_{{platform.toolchain}}_env" ] && . "$NMIGEN_{{platform.toolchain}}_env"
             {{emit_commands("sh")}}
         """,
@@ -242,6 +244,13 @@ class TemplatedPlatform(Platform):
         # and to incorporate the nMigen version into generated code.
         autogenerated = "Automatically generated by nMigen {}. Do not edit.".format(__version__)
 
+        def emit_unix_interpreter():
+            if self.unix_interpreter == "sh":
+                return "# runs on any POSIX sh"
+            if self.unix_interpreter == "bash":
+                return """if [ -z "$BASH" ] ; then exec /bin/bash "$0" "$@"; fi"""
+            assert False
+
         def emit_design(backend):
             return {"rtlil": rtlil, "verilog": verilog}[backend].convert(fragment, name=name,
                 ports=list(self.iter_ports()), missing_domain=lambda name: None)
@@ -308,6 +317,7 @@ class TemplatedPlatform(Platform):
             return compiled.render({
                 "name": name,
                 "platform": self,
+                "emit_unix_interpreter": emit_unix_interpreter,
                 "emit_design": emit_design,
                 "emit_commands": emit_commands,
                 "get_tool": get_tool,