65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
import os
|
|
import re
|
|
import sys
|
|
|
|
if len(sys.argv) != 2:
|
|
print("Usage: python3 link_files.py <include_file_name>")
|
|
sys.exit(1)
|
|
|
|
input_file = os.path.join("Include", sys.argv[1])
|
|
workspace_dir = "WORKSPACE"
|
|
sym_links_dir = os.path.join(workspace_dir, "sym_links")
|
|
output_file = os.path.join(sym_links_dir, "sim_no_path.include")
|
|
|
|
print(f"looking in file {input_file}")
|
|
if not os.path.isfile(input_file):
|
|
print(f"Error: include list does not exist: {input_file}")
|
|
sys.exit(1)
|
|
|
|
os.makedirs(sym_links_dir, exist_ok=True)
|
|
|
|
had_error = False
|
|
seen_links = {}
|
|
with open(input_file, "r", encoding="utf-8") as input_fp:
|
|
with open(output_file, "w", encoding="utf-8") as output_fp:
|
|
for raw_line in input_fp:
|
|
line = raw_line.strip()
|
|
if not line or line.startswith("//"):
|
|
output_fp.write(line + "\n")
|
|
continue
|
|
|
|
match = re.match(r"^\s*(\S+)\s*$", line)
|
|
if not match:
|
|
print(f"Error: invalid file path in line: {line}")
|
|
had_error = True
|
|
continue
|
|
|
|
file_path = os.path.expandvars(match.group(1))
|
|
if not os.path.exists(file_path):
|
|
print(f"Error: file does not exist: {file_path}")
|
|
had_error = True
|
|
continue
|
|
|
|
basename = os.path.basename(file_path)
|
|
absolute_path = os.path.abspath(file_path)
|
|
if basename in seen_links and seen_links[basename] != absolute_path:
|
|
print(
|
|
f"Error: duplicate filename {basename} refers to both "
|
|
f"{seen_links[basename]} and {absolute_path}"
|
|
)
|
|
had_error = True
|
|
continue
|
|
seen_links[basename] = absolute_path
|
|
|
|
link_path = os.path.join(sym_links_dir, basename)
|
|
if os.path.lexists(link_path):
|
|
os.unlink(link_path)
|
|
os.symlink(absolute_path, link_path)
|
|
|
|
# Header files are included by cpu_tb_pkg rather than compiled alone.
|
|
if not file_path.endswith(".svh"):
|
|
output_fp.write(f"sym_links/{basename}\n")
|
|
|
|
if had_error:
|
|
sys.exit(1)
|