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