build.run: extract from build.plat.
This commit is contained in:
parent
c89c2ce941
commit
3194b5c90b
|
@ -1,11 +1,8 @@
|
|||
from collections import OrderedDict
|
||||
from abc import ABCMeta, abstractmethod, abstractproperty
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import textwrap
|
||||
import re
|
||||
import zipfile
|
||||
import jinja2
|
||||
|
||||
from .. import __version__
|
||||
|
@ -13,66 +10,13 @@ from ..hdl.ast import *
|
|||
from ..hdl.dsl import *
|
||||
from ..hdl.ir import *
|
||||
from ..back import rtlil, verilog
|
||||
from .res import ConstraintManager
|
||||
from .res import *
|
||||
from .run import *
|
||||
|
||||
|
||||
__all__ = ["Platform", "TemplatedPlatform"]
|
||||
|
||||
|
||||
class BuildPlan:
|
||||
def __init__(self, script):
|
||||
self.script = script
|
||||
self.files = OrderedDict()
|
||||
|
||||
def add_file(self, filename, content):
|
||||
assert isinstance(filename, str) and filename not in self.files
|
||||
# Just to make sure we don't accidentally overwrite anything.
|
||||
assert not os.path.normpath(filename).startswith("..")
|
||||
self.files[filename] = content
|
||||
|
||||
def execute(self, root="build", run_script=True):
|
||||
os.makedirs(root, exist_ok=True)
|
||||
cwd = os.getcwd()
|
||||
try:
|
||||
os.chdir(root)
|
||||
|
||||
for filename, content in self.files.items():
|
||||
dirname = os.path.dirname(filename)
|
||||
if dirname:
|
||||
os.makedirs(dirname, exist_ok=True)
|
||||
|
||||
mode = "wt" if isinstance(content, str) else "wb"
|
||||
with open(filename, mode) as f:
|
||||
f.write(content)
|
||||
|
||||
if run_script:
|
||||
if sys.platform.startswith("win32"):
|
||||
subprocess.run(["cmd", "/c", "{}.bat".format(self.script)], check=True)
|
||||
else:
|
||||
subprocess.run(["sh", "{}.sh".format(self.script)], check=True)
|
||||
|
||||
return BuildProducts(os.getcwd())
|
||||
|
||||
finally:
|
||||
os.chdir(cwd)
|
||||
|
||||
def archive(self, file):
|
||||
with zipfile.ZipFile(file, "w") as archive:
|
||||
# Write archive members in deterministic order and with deterministic timestamp.
|
||||
for filename in sorted(self.files):
|
||||
archive.writestr(zipfile.ZipInfo(filename), self.files[filename])
|
||||
|
||||
|
||||
class BuildProducts:
|
||||
def __init__(self, root):
|
||||
self._root = root
|
||||
|
||||
def get(self, filename, mode="b"):
|
||||
assert mode in "bt"
|
||||
with open(os.path.join(self._root, filename), "r" + mode) as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
class Platform(ConstraintManager, metaclass=ABCMeta):
|
||||
resources = abstractproperty()
|
||||
connectors = abstractproperty()
|
||||
|
|
62
nmigen/build/run.py
Normal file
62
nmigen/build/run.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
from collections import OrderedDict
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import zipfile
|
||||
|
||||
|
||||
__all__ = ["BuildPlan", "BuildProducts"]
|
||||
|
||||
|
||||
class BuildPlan:
|
||||
def __init__(self, script):
|
||||
self.script = script
|
||||
self.files = OrderedDict()
|
||||
|
||||
def add_file(self, filename, content):
|
||||
assert isinstance(filename, str) and filename not in self.files
|
||||
# Just to make sure we don't accidentally overwrite anything.
|
||||
assert not os.path.normpath(filename).startswith("..")
|
||||
self.files[filename] = content
|
||||
|
||||
def execute(self, root="build", run_script=True):
|
||||
os.makedirs(root, exist_ok=True)
|
||||
cwd = os.getcwd()
|
||||
try:
|
||||
os.chdir(root)
|
||||
|
||||
for filename, content in self.files.items():
|
||||
dirname = os.path.dirname(filename)
|
||||
if dirname:
|
||||
os.makedirs(dirname, exist_ok=True)
|
||||
|
||||
mode = "wt" if isinstance(content, str) else "wb"
|
||||
with open(filename, mode) as f:
|
||||
f.write(content)
|
||||
|
||||
if run_script:
|
||||
if sys.platform.startswith("win32"):
|
||||
subprocess.run(["cmd", "/c", "{}.bat".format(self.script)], check=True)
|
||||
else:
|
||||
subprocess.run(["sh", "{}.sh".format(self.script)], check=True)
|
||||
|
||||
return BuildProducts(os.getcwd())
|
||||
|
||||
finally:
|
||||
os.chdir(cwd)
|
||||
|
||||
def archive(self, file):
|
||||
with zipfile.ZipFile(file, "w") as archive:
|
||||
# Write archive members in deterministic order and with deterministic timestamp.
|
||||
for filename in sorted(self.files):
|
||||
archive.writestr(zipfile.ZipInfo(filename), self.files[filename])
|
||||
|
||||
|
||||
class BuildProducts:
|
||||
def __init__(self, root):
|
||||
self._root = root
|
||||
|
||||
def get(self, filename, mode="b"):
|
||||
assert mode in "bt"
|
||||
with open(os.path.join(self._root, filename), "r" + mode) as f:
|
||||
return f.read()
|
Loading…
Reference in a new issue