From d240180943972997516403aa3a05e894a14f795a Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Sun, 4 Oct 2026 10:41:15 -0700 Subject: [PATCH] Revert #487: recomp-net header block and update_cmake tool #479 guards the host_relay.h include, so offline title builds no longer need recomp-net's include dir; the tool had no other managed block. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../project_studio/bulkops.py | 60 ------------- .../new_project_layout/project_studio/cli.py | 40 --------- .../new_project_layout/project_studio/gui.py | 37 -------- .../templates/CMakeLists.txt.in | 10 --- tools/update_cmake.ps1 | 14 --- tools/update_cmake.py | 89 ------------------- tools/update_cmake.sh | 12 --- 7 files changed, 262 deletions(-) delete mode 100644 tools/update_cmake.ps1 delete mode 100755 tools/update_cmake.py delete mode 100755 tools/update_cmake.sh diff --git a/tools/new_project_layout/project_studio/bulkops.py b/tools/new_project_layout/project_studio/bulkops.py index f69889e4..7a395c53 100644 --- a/tools/new_project_layout/project_studio/bulkops.py +++ b/tools/new_project_layout/project_studio/bulkops.py @@ -21,7 +21,6 @@ from .gitops import ( push, push_modules, push_psxrecomp, - _git, repo_status, run_release_workflow, switch_branch, @@ -239,65 +238,6 @@ def bulk_migrate_bundled( return map_repos(repos, one, jobs=jobs, on_repo=on_repo) -def _load_update_cmake(): - """Import tools/update_cmake.py from the framework running this tool, so - projects pinned to an older psxrecomp still get the current blocks.""" - import importlib.util - - path = Path(__file__).resolve().parents[2] / "update_cmake.py" - spec = importlib.util.spec_from_file_location("psx_update_cmake", path) - if spec is None or spec.loader is None or not path.is_file(): - raise FileNotFoundError(f"update_cmake.py not found at {path}") - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -def bulk_update_cmake( - repos: list[tuple[str, Path]], - *, - commit: bool = True, - push_remote: bool = False, - dry_run: bool = False, - jobs: int = 1, - on_repo: OnRepoResults | None = None, -) -> list[CmdResult]: - """Sync each repo's CMakeLists.txt with the scaffold template's managed - blocks (tools/update_cmake.py), committing only CMakeLists.txt.""" - um = _load_update_cmake() - - def one(label: str, root: Path) -> list[CmdResult]: - path = root / "CMakeLists.txt" - if not path.is_file(): - return [CmdResult(False, f"{label}: no CMakeLists.txt")] - try: - old = path.read_text(encoding="utf-8") - new = um.sync(old) - except (OSError, SystemExit) as exc: - return [CmdResult(False, f"{label}: {exc}")] - if new == old: - return [CmdResult(True, f"{label}: CMakeLists.txt up to date")] - if dry_run: - return [CmdResult(True, f"{label}: would update CMakeLists.txt")] - path.write_text(new, encoding="utf-8", newline="") - if not commit: - return [CmdResult(True, f"{label}: updated CMakeLists.txt (uncommitted)")] - msg = "CMake: sync managed blocks (update_cmake)" - code, out, err = _git(root, "add", "--", "CMakeLists.txt") - if code == 0: - code, out, err = _git(root, "commit", "-m", msg, "--", "CMakeLists.txt") - if code != 0: - return [CmdResult(False, f"{label}: updated but commit failed", err or out)] - if push_remote: - r = push(root) - if not r.ok: - return [CmdResult(False, f"{label}: committed, push failed", r.detail)] - return [CmdResult(True, f"{label}: updated, committed, pushed")] - return [CmdResult(True, f"{label}: updated + committed")] - - return map_repos(repos, one, jobs=jobs, on_repo=on_repo) - - def bulk_pull( repos: list[tuple[str, Path]], *, diff --git a/tools/new_project_layout/project_studio/cli.py b/tools/new_project_layout/project_studio/cli.py index e680ad9b..3d449bf8 100644 --- a/tools/new_project_layout/project_studio/cli.py +++ b/tools/new_project_layout/project_studio/cli.py @@ -1337,35 +1337,6 @@ def cmd_git_bulk_migrate_bundled(args: argparse.Namespace) -> int: return 1 if failed else 0 -def cmd_git_bulk_update_cmake(args: argparse.Namespace) -> int: - from project_studio.bulkops import bulk_update_cmake - from project_studio.repo_index import load_index - - repos = _bulk_repos_or_die(args) - if repos is None: - return 2 - jobs = int(getattr(args, "jobs", 0) or 0) or int(getattr(load_index(), "bulk_jobs", 1) or 1) - - def on_repo(label: str, results: list) -> None: - for r in results: - print(f" [{'OK' if r.ok else 'FAIL'}] {r.message}", flush=True) - if r.detail: - for ln in r.detail.splitlines(): - print(f" {ln}", flush=True) - - results = bulk_update_cmake( - repos, - commit=not bool(getattr(args, "no_commit", False)), - push_remote=bool(getattr(args, "push", False)), - dry_run=bool(getattr(args, "dry_run", False)), - jobs=jobs, - on_repo=on_repo, - ) - failed = sum(1 for r in results if not r.ok) - print(f"bulk update-cmake: {len(results) - failed} ok, {failed} failed", flush=True) - return 1 if failed else 0 - - def cmd_git_migrate_bundled(args: argparse.Namespace) -> int: from project_studio.migrate_bundled import BundledMigrateOptions, migrate_to_bundled_release @@ -2329,17 +2300,6 @@ def build_parser() -> argparse.ArgumentParser: p_gbmb.add_argument("--jobs", type=int, default=0, help="Parallel repos (default: index setting)") p_gbmb.set_defaults(func=cmd_git_bulk_migrate_bundled) - p_gbuc = git_sub.add_parser( - "bulk-update-cmake", - help="Sync selected repos' CMakeLists.txt with the scaffold template " - "(tools/update_cmake.py); commits CMakeLists.txt only", - ) - add_bulk_select(p_gbuc) - p_gbuc.add_argument("--no-commit", action="store_true", help="Edit CMakeLists.txt but do not commit") - p_gbuc.add_argument("--push", action="store_true", help="Push after committing") - p_gbuc.add_argument("--jobs", type=int, default=0, help="Parallel repos (default: index setting)") - p_gbuc.set_defaults(func=cmd_git_bulk_update_cmake) - p_gmb = git_sub.add_parser( "migrate-bundled", help="Move one game repo onto bundled releases", diff --git a/tools/new_project_layout/project_studio/gui.py b/tools/new_project_layout/project_studio/gui.py index a2bfd28a..67d412a3 100644 --- a/tools/new_project_layout/project_studio/gui.py +++ b/tools/new_project_layout/project_studio/gui.py @@ -2241,13 +2241,6 @@ class ProjectStudioApp: height=34, command=self._bulk_install_ci, ).pack(side="left", padx=8) - ctk.CTkButton( - relb, - text="Update CMake", - width=120, - height=34, - command=self._bulk_update_cmake, - ).pack(side="left") ctk.CTkLabel( relb, text="Dispatches release.yml per selected game repo (gh). " @@ -4547,36 +4540,6 @@ class ProjectStudioApp: done_warn_prefix="Release dispatch finished with failures.", ) - def _bulk_update_cmake(self) -> None: - from .bulkops import bulk_update_cmake - - repos = self._bulk_require_selection() - if repos is None: - return - dry = self._git_dry() - if not dry: - names = "\n".join(f"* {lab}" for lab, _ in repos) - if not messagebox.askyesno( - "Project Studio", - f"Sync CMakeLists.txt with the psxrecomp template and commit it " - f"(CMakeLists.txt only, not pushed) for {len(repos)} repo(s)?\n\n{names}", - parent=self.root, - ): - return - - def run(*, jobs: int, on_repo) -> list: - return bulk_update_cmake( - repos, commit=True, push_remote=False, dry_run=dry, jobs=jobs, on_repo=on_repo - ) - - self._bulk_run_bg( - f"Bulk update CMake ({len(repos)} repos)", - run, - refresh_git=True, - done_info="Update CMake finished — see activity log.", - done_warn_prefix="Update CMake finished with failures.", - ) - def _bulk_install_ci(self) -> None: from .bulkops import bulk_install_ci diff --git a/tools/new_project_layout/templates/CMakeLists.txt.in b/tools/new_project_layout/templates/CMakeLists.txt.in index a412c646..f984ea95 100644 --- a/tools/new_project_layout/templates/CMakeLists.txt.in +++ b/tools/new_project_layout/templates/CMakeLists.txt.in @@ -49,16 +49,6 @@ psxrecomp_add_game_runtime(psx-runtime @CODEGEN_SETUP_ARG@ ) -# >>> psxrecomp:recomp-net-headers (managed by tools/update_cmake.{sh,ps1}) -# runtime/src/main.cpp includes recomp_net/host_relay.h unconditionally (a -# plain-C types header). With PSX_NETPLAY off nothing adds recomp-net's include -# dir, so expose it whenever the submodule is checked out. -if(EXISTS "${PSXRECOMP_ROOT}/lib/recomp-net/include/recomp_net/host_relay.h") - target_include_directories(psx-runtime PRIVATE - "${PSXRECOMP_ROOT}/lib/recomp-net/include") -endif() -# <<< psxrecomp:recomp-net-headers - # Stage runtime configs next to the exe for direct build/ launches. Only copy # files that exist — never fail POST_BUILD when game_options.toml is absent. foreach(_PSX_RUNTIME_CONFIG game.toml game_options.toml) diff --git a/tools/update_cmake.ps1 b/tools/update_cmake.ps1 deleted file mode 100644 index e1167d72..00000000 --- a/tools/update_cmake.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -# update_cmake.ps1 — sync a game project's CMakeLists.txt with the scaffold -# template's managed blocks (implementation: tools/update_cmake.py). -# Usage: update_cmake.ps1 [--project DIR] [--check] [--dry-run] -$ErrorActionPreference = 'Stop' -$Root = Split-Path -Parent $PSScriptRoot -$Py = $env:PYTHON -if (-not $Py) { - foreach ($c in 'python3', 'python', 'py') { - if (Get-Command $c -ErrorAction SilentlyContinue) { $Py = $c; break } - } -} -if (-not $Py) { Write-Error 'update_cmake: python not found on PATH'; exit 1 } -& $Py (Join-Path $Root 'tools/update_cmake.py') @args -exit $LASTEXITCODE diff --git a/tools/update_cmake.py b/tools/update_cmake.py deleted file mode 100755 index 6ca1cf10..00000000 --- a/tools/update_cmake.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -"""Idempotently sync a game project's CMakeLists.txt with the scaffold template. - -The managed block lives in tools/new_project_layout/templates/CMakeLists.txt.in -between `# >>> psxrecomp:` / `# <<< psxrecomp:` markers (single -source of truth). For each block this inserts it after the project's -psxrecomp_add_game_runtime(...) call, or replaces it in place if the markers are -already present. Run via tools/update_cmake.sh or tools/update_cmake.ps1. - - update_cmake.py [--project DIR] [--check] [--dry-run] - --check exit 1 if the project is out of date (writes nothing; for CI) - --dry-run print the unified diff, write nothing -""" -import argparse, difflib, re, sys -from pathlib import Path - -ROOT = Path(__file__).resolve().parent.parent -TEMPLATE = ROOT / "tools/new_project_layout/templates/CMakeLists.txt.in" -BLOCK_RE = re.compile( - r"^# >>> psxrecomp:(?P[\w-]+).*?\n.*?^# <<< psxrecomp:(?P=n)[ \t]*\n", - re.M | re.S) - - -def template_blocks(): - return {m["n"]: m.group(0) for m in BLOCK_RE.finditer(TEMPLATE.read_text(encoding="utf-8"))} - - -def add_runtime_end(text): - """Index just past the closing ')' of psxrecomp_add_game_runtime(...).""" - m = re.search(r"^\s*psxrecomp_add_game_runtime\s*\(", text, re.M) - if not m: - return None - depth, i, in_str = 0, m.end() - 1, False - while i < len(text): - c = text[i] - if c == '"' and text[i - 1] != "\\": - in_str = not in_str - elif not in_str: - if c == "#": - i = text.find("\n", i) - if i < 0: - return None - continue - depth += c == "(" - depth -= c == ")" - if depth == 0: - nl = text.find("\n", i) - return len(text) if nl < 0 else nl + 1 - i += 1 - return None - - -def sync(text): - for name, block in template_blocks().items(): - m = re.search(r"^# >>> psxrecomp:%s.*?\n.*?^# <<< psxrecomp:%s[ \t]*\n" % (re.escape(name), re.escape(name)), text, re.M | re.S) - if m: - text = text[:m.start()] + block + text[m.end():] - continue - end = add_runtime_end(text) - if end is None: - sys.exit("update_cmake: no psxrecomp_add_game_runtime(...) call found") - text = text[:end] + "\n" + block + text[end:] - return text - - -def main(): - ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) - ap.add_argument("--project", default=".", help="game project dir (default: cwd)") - ap.add_argument("--check", action="store_true") - ap.add_argument("--dry-run", action="store_true") - a = ap.parse_args() - path = Path(a.project).resolve() / "CMakeLists.txt" - if not path.is_file(): - sys.exit(f"update_cmake: {path} not found") - old = path.read_text(encoding="utf-8") - new = sync(old) - if new == old: - print("update_cmake: up to date") - return 0 - if a.check or a.dry_run: - sys.stdout.writelines(difflib.unified_diff(old.splitlines(True), new.splitlines(True), "CMakeLists.txt", "CMakeLists.txt (updated)")) - return 1 if a.check else 0 - path.write_text(new, encoding="utf-8", newline="") - print(f"update_cmake: updated {path}") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tools/update_cmake.sh b/tools/update_cmake.sh deleted file mode 100755 index 2dc38f32..00000000 --- a/tools/update_cmake.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -# update_cmake.sh — sync a game project's CMakeLists.txt with the scaffold -# template's managed blocks (implementation: tools/update_cmake.py). -# Usage: update_cmake.sh [--project DIR] [--check] [--dry-run] -set -eu -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PY="${PYTHON:-}" -if [ -z "$PY" ]; then - for c in python3 python; do command -v "$c" >/dev/null 2>&1 && { PY="$c"; break; }; done -fi -[ -n "$PY" ] || { echo "update_cmake: python not found on PATH" >&2; exit 1; } -exec "$PY" "$ROOT/tools/update_cmake.py" "$@"