From 99a29cc6f6559f94dc11f84c85e2e1dc18a942ee Mon Sep 17 00:00:00 2001 From: papertager <2567587994@qq.com> Date: Tue, 9 Jun 2026 21:21:47 +0800 Subject: [PATCH 1/2] Add build plan JSON helper --- tools/build_plan.py | 69 ++++++++++++++++++++++++++++++++++++ unit_test/test_build_plan.py | 32 +++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 tools/build_plan.py create mode 100644 unit_test/test_build_plan.py diff --git a/tools/build_plan.py b/tools/build_plan.py new file mode 100644 index 0000000..7e294c8 --- /dev/null +++ b/tools/build_plan.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +"""Print a non-invasive mcoplib build plan as JSON.""" + +from __future__ import annotations + +import argparse +import json +import os +import shutil +from pathlib import Path + + +SUBMODULE_FLAGS = [ + "BUILD_LMDEPLOY_SUBMODULE", + "BUILD_DEFAULT_OP_SUBMODULE", + "BUILD_MOE_SUBMODULE", + "BUILD_SGL_KERNEL_SUBMODULE", + "BUILD_SGL_GROUPED_GEMM_SUBMODULE", + "BUILD_SGL_MOE_W4A16_SUBMODULE", +] + + +def read_maca_version(maca_path: str | None) -> str | None: + if not maca_path: + return None + version_file = Path(maca_path) / "Version.txt" + if not version_file.is_file(): + return None + return version_file.read_text(encoding="utf-8").splitlines()[0].split(":")[-1].strip() + + +def build_plan(root: Path) -> dict[str, object]: + maca_path = os.environ.get("MACA_PATH") + return { + "root": str(root), + "maca_path": maca_path, + "maca_version": read_maca_version(maca_path), + "tools": { + "cmake_maca": shutil.which("cmake_maca"), + "make_maca": shutil.which("make_maca"), + "mxcc": shutil.which("mxcc"), + "ninja": shutil.which("ninja"), + }, + "submodules": {flag: os.environ.get(flag, "ON") for flag in SUBMODULE_FLAGS}, + "cache": { + "FETCHCONTENT_BASE_DIR": os.environ.get( + "FETCHCONTENT_BASE_DIR", str(root / ".deps") + ) + }, + } + + +def main() -> int: + parser = argparse.ArgumentParser(description="Print mcoplib build plan JSON.") + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1]) + parser.add_argument("--output", type=Path) + args = parser.parse_args() + + text = json.dumps(build_plan(args.root.resolve()), indent=2, sort_keys=True) + if args.output: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(text + "\n", encoding="utf-8") + else: + print(text) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/unit_test/test_build_plan.py b/unit_test/test_build_plan.py new file mode 100644 index 0000000..72dc180 --- /dev/null +++ b/unit_test/test_build_plan.py @@ -0,0 +1,32 @@ +import os +import tempfile +import unittest +from pathlib import Path + +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from tools.build_plan import build_plan, read_maca_version + + +class BuildPlanTest(unittest.TestCase): + def test_read_maca_version(self): + with tempfile.TemporaryDirectory() as tmp: + Path(tmp, "Version.txt").write_text("Version:3.5.3.20\n", encoding="utf-8") + self.assertEqual(read_maca_version(tmp), "3.5.3.20") + + def test_build_plan_uses_default_submodule_flags(self): + root = Path.cwd() + old = os.environ.pop("BUILD_DEFAULT_OP_SUBMODULE", None) + try: + plan = build_plan(root) + finally: + if old is not None: + os.environ["BUILD_DEFAULT_OP_SUBMODULE"] = old + + self.assertEqual(plan["submodules"]["BUILD_DEFAULT_OP_SUBMODULE"], "ON") + + +if __name__ == "__main__": + unittest.main() From 8a7b80f9937d7da01269fe2d3d323fccbbd61e91 Mon Sep 17 00:00:00 2001 From: papertager <2567587994@qq.com> Date: Thu, 11 Jun 2026 00:41:25 +0800 Subject: [PATCH 2/2] Complete mcoplib build plan metadata --- tools/build_plan.py | 5 ++++- unit_test/test_build_plan.py | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/build_plan.py b/tools/build_plan.py index 7e294c8..1b37404 100644 --- a/tools/build_plan.py +++ b/tools/build_plan.py @@ -11,6 +11,8 @@ SUBMODULE_FLAGS = [ + "BUILD_VLLM_SUBMODULE", + "BUILD_SGLANG_SUBMODULE", "BUILD_LMDEPLOY_SUBMODULE", "BUILD_DEFAULT_OP_SUBMODULE", "BUILD_MOE_SUBMODULE", @@ -26,7 +28,8 @@ def read_maca_version(maca_path: str | None) -> str | None: version_file = Path(maca_path) / "Version.txt" if not version_file.is_file(): return None - return version_file.read_text(encoding="utf-8").splitlines()[0].split(":")[-1].strip() + lines = version_file.read_text(encoding="utf-8").splitlines() + return lines[0].split(":")[-1].strip() if lines else None def build_plan(root: Path) -> dict[str, object]: diff --git a/unit_test/test_build_plan.py b/unit_test/test_build_plan.py index 72dc180..4f364ae 100644 --- a/unit_test/test_build_plan.py +++ b/unit_test/test_build_plan.py @@ -16,6 +16,12 @@ def test_read_maca_version(self): Path(tmp, "Version.txt").write_text("Version:3.5.3.20\n", encoding="utf-8") self.assertEqual(read_maca_version(tmp), "3.5.3.20") + Path(tmp, "Version.txt").write_text("", encoding="utf-8") + self.assertIsNone(read_maca_version(tmp)) + + Path(tmp, "Version.txt").write_text("Version3.5.3.20\n", encoding="utf-8") + self.assertEqual(read_maca_version(tmp), "Version3.5.3.20") + def test_build_plan_uses_default_submodule_flags(self): root = Path.cwd() old = os.environ.pop("BUILD_DEFAULT_OP_SUBMODULE", None) @@ -26,6 +32,8 @@ def test_build_plan_uses_default_submodule_flags(self): os.environ["BUILD_DEFAULT_OP_SUBMODULE"] = old self.assertEqual(plan["submodules"]["BUILD_DEFAULT_OP_SUBMODULE"], "ON") + self.assertEqual(plan["submodules"]["BUILD_VLLM_SUBMODULE"], "ON") + self.assertEqual(plan["submodules"]["BUILD_SGLANG_SUBMODULE"], "ON") if __name__ == "__main__":