X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=litex_setup.py;h=85a6d5909cbbd0de48fac5742c8ceccea23100ae;hb=e853ad4b616efc4ee80f3913a2a316a7f0c94fd3;hp=609aa0f3ac815b61cf5c76dd6f34c42ca70da0a9;hpb=228f2867476a76508de8ecb8c15026df9b52ff4f;p=litex.git diff --git a/litex_setup.py b/litex_setup.py index 609aa0f3..85a6d590 100755 --- a/litex_setup.py +++ b/litex_setup.py @@ -2,58 +2,156 @@ import os import sys +import subprocess +import shutil from collections import OrderedDict +import urllib.request -current_path = os.path.dirname(os.path.realpath(__file__)) +current_path = os.path.abspath(os.curdir) -# name, (url, recursive clone, develop) + +# Repositories ------------------------------------------------------------------------------------- + +# name, (url, recursive clone, develop, sha1) repos = [ - ("migen", ("http://github.com/m-labs/", True, True)), - ("litex", ("http://github.com/enjoy-digital/", True, True)), - ("liteeth", ("http://github.com/enjoy-digital/", False, True)), - ("liteusb", ("http://github.com/enjoy-digital/", False, True)), - ("litedram", ("http://github.com/enjoy-digital/", False, True)), - ("litepcie", ("http://github.com/enjoy-digital/", False, True)), - ("litesata", ("http://github.com/enjoy-digital/", False, True)), - ("litesdcard", ("http://github.com/enjoy-digital/", False, True)), - ("liteiclink", ("http://github.com/enjoy-digital/", False, True)), - ("litevideo", ("http://github.com/enjoy-digital/", False, True)), - ("litescope", ("http://github.com/enjoy-digital/", False, True)), + # HDL + ("migen", ("https://github.com/m-labs/", True, True, None)), + ("nmigen", ("https://github.com/nmigen/", True, True, None)), + + # LiteX SoC builder + ("pythondata-software-compiler_rt", ("https://github.com/litex-hub/", False, True, None)), + ("litex", ("https://github.com/enjoy-digital/", False, True, None)), + + # LiteX cores ecosystem + ("liteeth", ("https://github.com/enjoy-digital/", False, True, None)), + ("litedram", ("https://github.com/enjoy-digital/", False, True, None)), + ("litepcie", ("https://github.com/enjoy-digital/", False, True, None)), + ("litesata", ("https://github.com/enjoy-digital/", False, True, None)), + ("litesdcard", ("https://github.com/enjoy-digital/", False, True, None)), + ("liteiclink", ("https://github.com/enjoy-digital/", False, True, None)), + ("litevideo", ("https://github.com/enjoy-digital/", False, True, None)), + ("litescope", ("https://github.com/enjoy-digital/", False, True, None)), + ("litejesd204b", ("https://github.com/enjoy-digital/", False, True, None)), + ("litespi", ("https://github.com/litex-hub/", False, True, None)), + ("litehyperbus", ("https://github.com/litex-hub/", False, True, None)), + + # LiteX boards support + ("litex-boards", ("https://github.com/litex-hub/", False, True, None)), + + # Optional LiteX data + ("pythondata-misc-tapcfg", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-lm32", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-mor1kx", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-picorv32", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-serv", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-vexriscv", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-rocket", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-minerva", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-cpu-microwatt", ("https://github.com/litex-hub/", False, True, 0xa7859fb)), + ("pythondata-cpu-blackparrot", ("https://github.com/litex-hub/", False, True, None)), ] + repos = OrderedDict(repos) +# RISC-V toolchain download ------------------------------------------------------------------------ + +def sifive_riscv_download(): + base_url = "https://static.dev.sifive.com/dev-tools/" + base_file = "riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-" + + # Windows + if (sys.platform.startswith("win") or sys.platform.startswith("cygwin")): + end_file = "w64-mingw32.zip" + # Linux + elif sys.platform.startswith("linux"): + end_file = "linux-ubuntu14.tar.gz" + # Mac OS + elif sys.platform.startswith("darwin"): + end_file = "apple-darwin.tar.gz" + else: + raise NotImplementedError(sys.platform) + fn = base_file + end_file + + if not os.path.exists(fn): + url = base_url + fn + print("Downloading", url, "to", fn) + urllib.request.urlretrieve(url, fn) + else: + print("Using existing file", fn) + + print("Extracting", fn) + shutil.unpack_archive(fn) + +# Setup -------------------------------------------------------------------------------------------- + +if os.environ.get("TRAVIS", "") == "true": + # Ignore `ssl.SSLCertVerificationError` on CI. + import ssl + ssl._create_default_https_context = ssl._create_unverified_context + if len(sys.argv) < 2: print("Available commands:") print("- init") - print("- install (add --user to install to user directory)") print("- update") + print("- install (add --user to install to user directory)") + print("- gcc") exit() +# Repositories cloning if "init" in sys.argv[1:]: for name in repos.keys(): - url, need_recursive, need_develop = repos[name] - # clone repo (recursive if needed) - print("[cloning " + name + "]...") - full_url = url + name - opts = "--recursive" if need_recursive else "" - os.system("git clone " + full_url + " " + opts) + os.chdir(os.path.join(current_path)) + if not os.path.exists(name): + url, need_recursive, need_develop, sha1 = repos[name] + # clone repo (recursive if needed) + print("[cloning " + name + "]...") + full_url = url + name + opts = "--recursive" if need_recursive else "" + subprocess.check_call("git clone " + full_url + " " + opts, shell=True) + if sha1 is not None: + os.chdir(os.path.join(current_path, name)) + os.system("git checkout {:7x}".format(sha1)) + +# Repositories update +if "update" in sys.argv[1:]: + for name in repos.keys(): + os.chdir(os.path.join(current_path)) + url, need_recursive, need_develop, sha1 = repos[name] + print(url) + if not os.path.exists(name): + raise Exception("{} not initialized, please (re)-run init and install first.".format(name)) + # update + print("[updating " + name + "]...") + os.chdir(os.path.join(current_path, name)) + subprocess.check_call("git pull --ff-only", shell=True) + if sha1 is not None: + os.chdir(os.path.join(current_path, name)) + os.system("git checkout {:7x}".format(sha1)) +# Repositories installation if "install" in sys.argv[1:]: for name in repos.keys(): - url, need_recursive, need_develop = repos[name] + os.chdir(os.path.join(current_path)) + url, need_recursive, need_develop, sha1 = repos[name] # develop if needed print("[installing " + name + "]...") if need_develop: os.chdir(os.path.join(current_path, name)) if "--user" in sys.argv[1:]: - os.system("python3 setup.py develop --user") + subprocess.check_call("python3 setup.py develop --user", shell=True) else: - os.system("python3 setup.py develop") + subprocess.check_call("python3 setup.py develop", shell=True) -if "update" in sys.argv[1:]: - for name in repos.keys(): - # update - print("[updating " + name + "]...") - os.chdir(os.path.join(current_path, name)) - os.system("git pull") + if "--user" in sys.argv[1:]: + if ".local/bin" not in os.environ.get("PATH", ""): + print("Make sure that ~/.local/bin is in your PATH") + print("export PATH=$PATH:~/.local/bin") + +# RISC-V GCC installation +if "gcc" in sys.argv[1:]: + os.chdir(os.path.join(current_path)) + sifive_riscv_download() + if "riscv64" not in os.environ.get("PATH", ""): + print("Make sure that the downloaded RISC-V compiler is in your $PATH.") + print("export PATH=$PATH:$(echo $PWD/riscv64-*/bin/)")