Today every ci.yml run rebuilds rive's 10 static libs + the shim from source (premake -> make -> clang), the dominant cost. build.rs already honours RIVE_PREBUILT_LIBS=<dir> to link pre-archived libs and skip premake/make/clang AND the submodule entirely (BUILD.md §8; produced by tools/archive_prebuilt.sh).
Goal: a build-once-then-cache flow.
- A scheduled (or submodule-SHA-triggered) job builds the libs from source and uploads the archive set per (OS, profile, triple) via
actions/cache or actions/upload-artifact.
- The regular
build-lint-doc job restores that archive and sets RIVE_PREBUILT_LIBS so it skips the C++ toolchain and only compiles Rust + the shim's consumers.
Constraints: the archive is ABI-specific (toolchain + Cargo profile debug/release link DIFFERENT rive libs + target triple) — one cached set per combination, keyed on the submodule commit + build.rs hash. Validate a cache-miss still falls back to a correct from-source build.
Today every
ci.ymlrun rebuilds rive's 10 static libs + the shim from source (premake -> make -> clang), the dominant cost.build.rsalready honoursRIVE_PREBUILT_LIBS=<dir>to link pre-archived libs and skip premake/make/clang AND the submodule entirely (BUILD.md §8; produced bytools/archive_prebuilt.sh).Goal: a
build-once-then-cacheflow.actions/cacheoractions/upload-artifact.build-lint-docjob restores that archive and setsRIVE_PREBUILT_LIBSso it skips the C++ toolchain and only compiles Rust + the shim's consumers.Constraints: the archive is ABI-specific (toolchain + Cargo profile debug/release link DIFFERENT rive libs + target triple) — one cached set per combination, keyed on the submodule commit + build.rs hash. Validate a cache-miss still falls back to a correct from-source build.