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