From c18e7dd93b9a0df806412d6831d25bcdb12fb516 Mon Sep 17 00:00:00 2001
From: vauban353 <vauban353@gmail.com>
Date: Wed, 15 May 2024 10:26:00 +0100
Subject: [PATCH 1/2] Build scripts: Fix script execution on Windows.

Libero script arguments need to be relative when executing on Windows.
---
 build-bitstream.py                 |  6 ++----
 gateware_scripts/build_gateware.py | 10 +++++-----
 gateware_scripts/create_release.py |  7 ++-----
 3 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/build-bitstream.py b/build-bitstream.py
index a0d25ff..35ef2f0 100644
--- a/build-bitstream.py
+++ b/build-bitstream.py
@@ -36,6 +36,7 @@ import sys
 import gateware_scripts
 from gateware_scripts.build_gateware import build_gateware
 
+
 global yaml_input_file
 
 
@@ -68,10 +69,7 @@ def main():
 
     parse_arguments()
 
-    build_dir = os.getcwd()
-    gateware_top_dir = build_dir
-
-    build_gateware(yaml_input_file, build_dir, gateware_top_dir)
+    build_gateware(yaml_input_file, ".", ".")
 
 
 if __name__ == '__main__':
diff --git a/gateware_scripts/build_gateware.py b/gateware_scripts/build_gateware.py
index e67ad3e..c48682f 100644
--- a/gateware_scripts/build_gateware.py
+++ b/gateware_scripts/build_gateware.py
@@ -400,14 +400,14 @@ def generate_libero_project(libero, yaml_input_file, fpga_design_sources_path, b
     # Execute the Libero TCL script used to create the Libero design
     initial_directory = os.getcwd()
     os.chdir(fpga_design_sources_path)
-    project_location = os.path.join(build_dir_path, "work", "libero")
-    script = os.path.join(fpga_design_sources_path, "BUILD_BVF_GATEWARE.tcl")
+    project_location = os.path.join("..", "..", build_dir_path, "work", "libero")
+    script = "BUILD_BVF_GATEWARE.tcl"
 
     script_args = get_libero_script_args(yaml_input_file)
     design_version = get_design_version(yaml_input_file)
 
-    hss_image_location = os.path.join(build_dir_path, "work", "HSS", "hss-envm-wrapper-bm1-p0.hex")
-    prog_export_path = build_dir_path
+    hss_image_location = os.path.join("..", "..", "work", "HSS", "hss-envm-wrapper-bm1-p0.hex")
+    prog_export_path = os.path.join("..", "..", build_dir_path)
 
     top_level_name = get_top_level_name()
     print("top level name: ", top_level_name)
@@ -422,7 +422,7 @@ def build_gateware(yaml_input_file_path, build_dir, gateware_top_dir):
     global softconsole_headless
     global programming
 
-    log_file_path = os.path.join(build_dir, "build_log.txt")
+    log_file_path = os.path.join("build_log.txt")
     original_stdout = sys.stdout
     sys.stdout = Logger(log_file_path)
 
diff --git a/gateware_scripts/create_release.py b/gateware_scripts/create_release.py
index eb72163..8ca97e0 100644
--- a/gateware_scripts/create_release.py
+++ b/gateware_scripts/create_release.py
@@ -24,13 +24,12 @@ def build_bitstreams(build_option_files):
     build_dir = "builds"
     if not os.path.exists(build_dir):
         os.makedirs(build_dir)
-    os.chdir(build_dir)
 
     for build_option in build_option_files:
         option_build_dir_name = os.path.splitext(os.path.basename(build_option))[0]
         print("Build bistream configuration: ", option_build_dir_name)
         cwd = os.getcwd()
-        dst_dir = os.path.join(cwd, option_build_dir_name)
+        dst_dir = os.path.join(build_dir, option_build_dir_name)
 
         if not os.path.exists(dst_dir):
             os.makedirs(dst_dir)
@@ -39,9 +38,7 @@ def build_bitstreams(build_option_files):
         build_option_path = os.path.join(tester_top_dir, build_option)
 
         build_gateware(build_option_path, dst_dir, tester_top_dir)
-        os.chdir('..')
-
-    os.chdir('..')
+        os.chdir('../..')
 
 
 def make_chdir(dir_name):
-- 
GitLab


From a455aeab364a52cd54cd61869452b293e232ecb5 Mon Sep 17 00:00:00 2001
From: vauban353 <vauban353@gmail.com>
Date: Wed, 15 May 2024 20:24:31 +0100
Subject: [PATCH 2/2] Build scripts: Use WSL on Windows to generate dts
 overlays.

---
 gateware_scripts/build_gateware.py            | 26 +++++++++++++++++++
 .../generate_gateware_overlays.py             | 15 +++++++++--
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/gateware_scripts/build_gateware.py b/gateware_scripts/build_gateware.py
index c48682f..3ea3cb1 100644
--- a/gateware_scripts/build_gateware.py
+++ b/gateware_scripts/build_gateware.py
@@ -174,6 +174,32 @@ def check_tool_status():
             print("Error: dtc (device-tree-compiler) not found in path")
             exit()
 
+    if platform.system() == "Windows":
+        print("Running on Windows host")
+        wsl_distributions_resp = subprocess.run(['wsl', '-l'], stdout=subprocess.PIPE)
+        wsl_distributions = wsl_distributions_resp.stdout.decode('utf-16')
+        if "Windows Subsystem for Linux" not in wsl_distributions:
+            print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+            print("!!! Windows Subsystem for Linux not found !!!")
+            print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+            print("You need WSL to run the Linux device tree compiler on a Windows host to ")
+            print("generate device tree overlays describing the complete gateware.")
+            print("Without this, Linux will be unaware of the gateware's FPGA content.")
+            input("Press Enter to continue generating gateware without device tree overlays: ")
+        else:
+            print("Windows Subsystem for Linux installed")
+            resp = subprocess.run(['wsl', '-e', 'dtc', '-v'], stdout=subprocess.PIPE)
+            dtc_version = resp.stdout.decode('ascii')
+            if "Version: DTC" not in dtc_version:
+                print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                print("!!! Device tree compiler not found !!!")
+                print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                print("Please install the Linux device tree compiler in Windows Subsystem for Linux.")
+                print("In WSL, use command: sudo apt install device-tree-compiler")
+                input("Press Enter to continue generating gateware without device tree overlays: ")
+            else:
+                print("Found device tree compiler: ", dtc_version)
+
 
 # Creates required folders and removes artifacts before beginning
 def init_workspace():
diff --git a/gateware_scripts/generate_gateware_overlays.py b/gateware_scripts/generate_gateware_overlays.py
index 265989c..2f9d787 100644
--- a/gateware_scripts/generate_gateware_overlays.py
+++ b/gateware_scripts/generate_gateware_overlays.py
@@ -3,6 +3,7 @@ import struct
 import ctypes
 import sys
 import subprocess
+import platform
 
 from gateware_scripts.gather_dtso import gather_dtso
 
@@ -119,6 +120,16 @@ def inject_git_info_into_src_dtso(dtso_file, git_version):
             fout.write(dtso)
 
 
+def execute_dtc_cmd(dtc_cmd):
+    os_platform = platform.system()
+    if os_platform == "Windows":
+        wsl_cmd = "wsl -e " + dtc_cmd
+        wsl_cmd = wsl_cmd.replace("\\", "/")
+        os.system(wsl_cmd)
+    else:
+        os.system(dtc_cmd)
+
+
 def compile_dtso(work_dir):
     root_dir = os.path.join(work_dir, 'dtbo', 'context-0')
     git_version = get_gateware_git_version(work_dir)
@@ -129,14 +140,14 @@ def compile_dtso(work_dir):
                 inject_git_info_into_src_dtso(dtso_file, git_version)
                 dtbo_file = os.path.splitext(dtso_file)[0] + '.dtbo'
                 cmd = 'dtc -O dtb -I dts -o ' + dtbo_file + ' ' + dtso_file
-                os.system(cmd)
+                execute_dtc_cmd(cmd)
 
 
 def generate_device_tree_overlays(fpga_design_src_path, overlay_dir_path, build_options_list):
     print("================================================================================")
     print("                            Generate Device Tree Overlays")
     print("================================================================================\r\n", flush=True)
-    bitstream_builder_root = os.getcwd()
+    bitstream_builder_root = "."
     work_dir = os.path.join(bitstream_builder_root, 'work')
     gather_dtso(fpga_design_src_path, work_dir, build_options_list)
     compile_dtso(work_dir)
-- 
GitLab