144 lines
4.8 KiB
Python
144 lines
4.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Verify platform-build wrappers include the current headless target matrix."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import re
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
REQUIRED_COMPONENT_TARGETS = [
|
|
"pp_foundation",
|
|
"pp_assets",
|
|
"pp_paint",
|
|
"pp_document",
|
|
"pp_renderer_api",
|
|
"pp_renderer_gl",
|
|
"pp_paint_renderer",
|
|
"pp_ui_core",
|
|
"pp_platform_api",
|
|
"pp_app_core",
|
|
"pano_cli",
|
|
]
|
|
|
|
REQUIRED_ANDROID_PRESETS = [
|
|
"android-arm64",
|
|
"android-x64",
|
|
"android-quest-arm64",
|
|
"android-focus-arm64",
|
|
]
|
|
|
|
EXPECTED_CMAKE_PLATFORM_TARGETS = [
|
|
"panopainter_platform_build_headless",
|
|
"panopainter_platform_build_android_assets",
|
|
"panopainter_platform_build_vcpkg_ui_core",
|
|
"panopainter_platform_build_apple_remote",
|
|
]
|
|
|
|
|
|
def repo_root() -> Path:
|
|
return Path(__file__).resolve().parents[2]
|
|
|
|
|
|
def cmake_test_targets(root: Path) -> list[str]:
|
|
cmake_lists = root / "tests" / "CMakeLists.txt"
|
|
text = cmake_lists.read_text(encoding="utf-8")
|
|
return sorted(set(re.findall(r"^\s*add_executable\(([^\s\)]+)", text, re.MULTILINE)))
|
|
|
|
|
|
def powershell_default_targets(root: Path) -> list[str]:
|
|
script = root / "scripts" / "automation" / "platform-build.ps1"
|
|
targets: list[str] = []
|
|
in_targets = False
|
|
|
|
for line in script.read_text(encoding="utf-8").splitlines():
|
|
if "[string[]]$Targets" in line:
|
|
in_targets = True
|
|
if not in_targets:
|
|
continue
|
|
|
|
targets.extend(re.findall(r'"([^"]+)"', line))
|
|
if in_targets and line.strip() == ")":
|
|
break
|
|
|
|
return sorted(set(targets))
|
|
|
|
|
|
def powershell_default_presets(root: Path) -> list[str]:
|
|
script = (root / "scripts" / "automation" / "platform-build.ps1").read_text(encoding="utf-8")
|
|
match = re.search(r"\[string\[\]\]\$Presets\s*=\s*@\((.*?)\)", script, re.S)
|
|
if not match:
|
|
raise RuntimeError("Could not find default presets in platform-build.ps1")
|
|
return sorted(set(re.findall(r'"([^"]+)"', match.group(1))))
|
|
|
|
|
|
def shell_default_targets(root: Path) -> list[str]:
|
|
script = root / "scripts" / "automation" / "platform-build.sh"
|
|
text = script.read_text(encoding="utf-8")
|
|
match = re.search(r'targets="\$\{[^:]+:-(.*)\}"', text)
|
|
if not match:
|
|
raise RuntimeError("Could not find default targets in platform-build.sh")
|
|
return sorted(set(match.group(1).split()))
|
|
|
|
|
|
def shell_default_presets(root: Path) -> list[str]:
|
|
script = (root / "scripts" / "automation" / "platform-build.sh").read_text(encoding="utf-8")
|
|
match = re.search(r'presets="\$\{[^:]+:-(.*)\}"', script)
|
|
if not match:
|
|
raise RuntimeError("Could not find default presets in platform-build.sh")
|
|
return sorted(set(match.group(1).split()))
|
|
|
|
|
|
def missing(expected: list[str], actual: list[str]) -> list[str]:
|
|
actual_set = set(actual)
|
|
return [target for target in expected if target not in actual_set]
|
|
|
|
|
|
def main() -> int:
|
|
root = repo_root()
|
|
expected = sorted(set(REQUIRED_COMPONENT_TARGETS + cmake_test_targets(root)))
|
|
ps_targets = powershell_default_targets(root)
|
|
sh_targets = shell_default_targets(root)
|
|
ps_presets = powershell_default_presets(root)
|
|
sh_presets = shell_default_presets(root)
|
|
cmake_platform_module = (root / "cmake" / "PanoPainterPlatformTargets.cmake").read_text(encoding="utf-8")
|
|
root_cmake = (root / "CMakeLists.txt").read_text(encoding="utf-8")
|
|
cmake_platform_targets_present = {
|
|
target: target in cmake_platform_module for target in EXPECTED_CMAKE_PLATFORM_TARGETS
|
|
}
|
|
cmake_platform_module_included = "include(PanoPainterPlatformTargets)" in root_cmake
|
|
|
|
result = {
|
|
"ok": True,
|
|
"expectedTargetCount": len(expected),
|
|
"powershellTargetCount": len(ps_targets),
|
|
"shellTargetCount": len(sh_targets),
|
|
"expectedAndroidPresets": REQUIRED_ANDROID_PRESETS,
|
|
"defaultPresets": {
|
|
"platform-build.ps1": ps_presets,
|
|
"platform-build.sh": sh_presets,
|
|
},
|
|
"cmakePlatformTargetsPresent": cmake_platform_targets_present,
|
|
"cmakePlatformModuleIncluded": cmake_platform_module_included,
|
|
"missing": {
|
|
"platform-build.ps1.targets": missing(expected, ps_targets),
|
|
"platform-build.sh.targets": missing(expected, sh_targets),
|
|
"platform-build.ps1.presets": missing(REQUIRED_ANDROID_PRESETS, ps_presets),
|
|
"platform-build.sh.presets": missing(REQUIRED_ANDROID_PRESETS, sh_presets),
|
|
},
|
|
}
|
|
result["ok"] = (
|
|
all(not values for values in result["missing"].values())
|
|
and all(cmake_platform_targets_present.values())
|
|
and cmake_platform_module_included
|
|
)
|
|
|
|
print(json.dumps(result, separators=(",", ":")))
|
|
return 0 if result["ok"] else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|