#!/usr/bin/python # !WARNING! When run, this script will create prepare.lock file, which will indicate that the script has been run before. # This is used for automation with CMake, which will run this script if and only if this file does not exists. # If you want to run this script again, remove this file manually first. # Script used for preparing build envirionment. I cannot use submodules, because I cannot specify commit/tag # in submodule config. What's more, preparing vulkan SDK is complicated, so a custom scrip is needed for that. import io import re import git import os import requests import subprocess REPO_DIR = os.path.join(os.getcwd(), "third_party") class Dependency: def __init__(self, name, file: io.TextIOWrapper): self.name = name while 1: line = file.readline().split("=", 1) if len(line) > 1: match line[0].strip(): case "git_url": self.git_url = line[1].strip() case "dl_url": self.dl_url = line[1].strip() case "tag": self.tag = line[1].strip() case "custom_commands": self.custom_commands = line[1].strip() else: break def download(self): dl_counter = 0 # Git repository if hasattr(self, "git_url") and self.git_url: repo = git.Repo.clone_from(self.git_url, os.path.join(REPO_DIR, self.name)) repo.git.checkout(self.tag) elif hasattr(self, "dl_url") and self.dl_url: while dl_counter < 10: response = requests.get(self.dl_url) if response.status_code == 200: # everything went fine open(os.path.join(REPO_DIR, self.name), "wb").write(response.content) break dl_counter += 1 print("Failed to download {}. Retrying {}th time...", self.name, dl_counter) time.sleep(5.0) if hasattr(self, "custom_commands") and self.custom_commands: p = subprocess.run(self.custom_commands, shell=True) p.chek_returncode() def main(): if not os.path.isdir(REPO_DIR): os.mkdir(REPO_DIR) f = open("dependencies.dep", "r") os.chdir(REPO_DIR) while True: line = f.readline() if not line: break stripped = line.strip() # Remove comments if stripped.startswith("#"): return uncommented = stripped.split("#", 1)[0] if len(uncommented) == 0: return if uncommented.startswith("["): dep_name = re.search('\[(.*)\]', uncommented).group(1) dep = Dependency(dep_name, f) print("Downloading dependency " + dep_name + "...") dep.download() f.close() if __name__ == "__main__": main()