#!/usr/bin/env python3 """Build a catalogued CLAP plugin without modifying a DAW installation.""" import argparse import json import os from pathlib import Path import shutil import subprocess root = Path(__file__).resolve().parents[1] catalog = json.loads((root / "plugins/catalog.json").read_text()) parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--plugin", choices=catalog, default="rivet", help="Plugin to package") parser.add_argument("--target", help="Rust target triple; defaults to rustc's host") parser.add_argument("--standalone", action="store_true", help="Also build Rivet's standalone preview") args = parser.parse_args() product = catalog[args.plugin] target = args.target if target is None: info = subprocess.check_output(["rustc", "-vV"], text=True) target = next(line.removeprefix("host: ") for line in info.splitlines() if line.startswith("host: ")) if "windows" not in target and "linux" not in target: parser.error("Packaging supports Windows releases and native Linux development builds.") if args.standalone and "standalone" not in product: parser.error(f"{product['name']} has no standalone application.") manifest = root / product["manifest"] cmd = ["cargo", "build", "--manifest-path", str(manifest), "--release", "--locked", "--target", target, "--lib"] if args.standalone: cmd += ["--features", "standalone", "--bin", product["standalone"]] subprocess.run(cmd, cwd=root, check=True) target_root = Path(os.environ.get("CARGO_TARGET_DIR", manifest.parent / "target")) if not target_root.is_absolute(): target_root = root / target_root build = target_root / target / "release" destination = root / "dist" / target destination.mkdir(parents=True, exist_ok=True) stem = product["library"] library = build / (f"{stem}.dll" if "windows" in target else f"lib{stem}.so") plugin = destination / f"{product['name']}.clap" shutil.copy2(library, plugin) for name in ["LICENSE", "README.md", "docs/development.md", "docs/releases.md"]: output = destination / name output.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(root / name, output) shutil.copytree(root / product["documentation"], destination / product["documentation"], dirs_exist_ok=True) for source, name in product.get("licenses", {}).items(): output = destination / name output.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(root / source, output) if args.standalone: exe = product["standalone"] + (".exe" if "windows" in target else "") shutil.copy2(build / exe, destination) print(f"Packaged {plugin}")