build.run: extract from build.plat.

This commit is contained in:
whitequark 2019-06-04 07:53:34 +00:00
parent c89c2ce941
commit 3194b5c90b
2 changed files with 64 additions and 58 deletions

View file

@ -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
View 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()