fester/backend/graph/build_graph.py

107 lines
2.5 KiB
Python

class BuildNode:
def __init__(self, name, cmd, deps=None, cache_key=None):
self.name = name
self.cmd = cmd
self.deps = deps or []
self.cache_key = cache_key
def __repr__(self):
return f"<BuildNode {self.name}>"
class BuildGraph:
def __init__(self, spec):
self.spec = spec
self.nodes = []
# -----------------------------
# ENTRY POINT
# -----------------------------
def generate(self):
self._fetch_source()
self._resolve_toolchain()
self._compile_units()
self._link_stage()
self._package()
self._cache()
return self.nodes
# -----------------------------
# STAGES
# -----------------------------
def _fetch_source(self):
self.nodes.append(
BuildNode(
name="fetch_source",
cmd="git clone repo",
cache_key="src"
)
)
def _resolve_toolchain(self):
cmd = f"setup-toolchain --arch {self.spec.arch} --target {self.spec.target}"
self.nodes.append(
BuildNode(
name="resolve_toolchain",
cmd=cmd,
deps=["fetch_source"],
cache_key="toolchain"
)
)
def _compile_units(self):
# simplified fan-out model (real version would parse AST / Makefile / Ninja)
for i in range(3):
self.nodes.append(
BuildNode(
name=f"compile_unit_{i}",
cmd=f"{self.spec.toolchain} -c file_{i}.c",
deps=["resolve_toolchain"],
cache_key=f"obj_{i}"
)
)
def _link_stage(self):
self.nodes.append(
BuildNode(
name="link",
cmd=f"{self.spec.toolchain} link *.o -o output.elf",
deps=["compile_unit_0", "compile_unit_1", "compile_unit_2"],
cache_key="binary"
)
)
def _package(self):
self.nodes.append(
BuildNode(
name="package",
cmd=f"package --format {self.spec.output_mode}",
deps=["link"],
cache_key="artifact"
)
)
def _cache(self):
self.nodes.append(
BuildNode(
name="cache_upload",
cmd="upload-cache",
deps=["package"],
cache_key="cache"
)
)