build.run: extract from build.plat.
This commit is contained in:
parent
c89c2ce941
commit
3194b5c90b
|
@ -1,11 +1,8 @@
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from abc import ABCMeta, abstractmethod, abstractproperty
|
from abc import ABCMeta, abstractmethod, abstractproperty
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
import textwrap
|
import textwrap
|
||||||
import re
|
import re
|
||||||
import zipfile
|
|
||||||
import jinja2
|
import jinja2
|
||||||
|
|
||||||
from .. import __version__
|
from .. import __version__
|
||||||
|
@ -13,66 +10,13 @@ from ..hdl.ast import *
|
||||||
from ..hdl.dsl import *
|
from ..hdl.dsl import *
|
||||||
from ..hdl.ir import *
|
from ..hdl.ir import *
|
||||||
from ..back import rtlil, verilog
|
from ..back import rtlil, verilog
|
||||||
from .res import ConstraintManager
|
from .res import *
|
||||||
|
from .run import *
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["Platform", "TemplatedPlatform"]
|
__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):
|
class Platform(ConstraintManager, metaclass=ABCMeta):
|
||||||
resources = abstractproperty()
|
resources = abstractproperty()
|
||||||
connectors = 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