|  | |
|  | |
|  | |
| # rive-runtime | |
|  | |
| Rive's C++ runtime — the lowest-level Rive runtime. Loads `.riv` files, | |
| advances state machines and animations, and draws via the abstract | |
| `Renderer` interface. The built-in GPU renderer (`RiveRenderer`) has | |
| `RenderContextImpl` backends for Metal, Vulkan, D3D11, D3D12, and OpenGL/WebGL. | |
| Rive's Apple, Android, Flutter, Unity, Unreal, and web runtimes all wrap this | |
| library. | |
| Features: | |
| - Loading artboards and their contents from `.riv` files. | |
| - Querying state machines from artboards. | |
| - Mutating the artboard hierarchy (the same mechanism used by state machines) and | |
| efficiently solving those changes via `Artboard::advance`. | |
| - A state-of-the-art vector renderer for Metal, Vulkan, D3D12, D3D11, and | |
| OpenGL/WebGL. | |
| - An abstract `Renderer` interface for hooking up an external vector renderer. | |
| ## Prerequisites | |
| - A C++17 toolchain: | |
| - **macOS**: clang from Xcode Command Line Tools (`xcode-select --install`). | |
| - **Linux**: clang from your distro (e.g. `apt install clang`). | |
| - **Windows**: Visual Studio 2022 with the **C++ Clang Compiler for Windows** | |
| and **MSBuild support for LLVM (clang-cl) toolset** individual components. | |
| - **git** — the build script clones a pinned `premake5` on first run. | |
| On Windows, install **Git for Windows** and during setup pick | |
| *"Use Git and optional Unix tools from the Command Prompt"* so that | |
| `sh.exe` ends up on PATH. | |
| - Platform SDK for the renderer you're targeting: | |
| - macOS / iOS: Xcode. | |
| - Windows: Windows SDK (for D3D). | |
| - Linux: a Vulkan or OpenGL development environment. | |
| - Vulkan: the Vulkan SDK. | |
| ## Build | |
| The build is driven by [premake5](https://premake.github.io/) wrapped by a | |
| helper script: | |
| - `build/build_rive.sh` — macOS / Linux (bash) / Windows (MinGW). | |
| - `build/build_rive.ps1` — a PowerShell convenience wrapper for Windows; it | |
| shells out to the bash script, so a bash environment (Git for Windows / | |
| MinGW, see Prerequisites) must still be on PATH. | |
| The helper self-installs the pinned premake version on first run and dispatches | |
| to the right build system for your platform (gmake2 on macOS/Linux, MSBuild on | |
| Windows). It must be run from a directory that contains a `premake5.lua` — | |
| typically `tests/`, which builds the core library, the GPU renderer, and the | |
| `player` sample app. | |
| ### macOS / Linux | |
| ```bash | |
| git clone https://github.com/rive-app/rive-runtime.git | |
| cd rive-runtime/tests | |
| ../build/build_rive.sh release | |
| ``` | |
| ### Windows | |
| ```powershell | |
| git clone https://github.com/rive-app/rive-runtime.git | |
| cd rive-runtime\tests | |
| ..\build\build_rive.ps1 release | |
| ``` | |
| ### Common variants | |
| *(On Windows, substitute `build_rive.ps1` for `build_rive.sh`.)* | |
| - `build_rive.sh` *(no args)* — debug build for the host. | |
| - `build_rive.sh release clean` — clean then build release. | |
| - `build_rive.sh ninja release` — use Ninja instead of make/MSBuild. | |
| - `build_rive.sh ios release` — cross-compile for iOS. | |
| - `build_rive.sh android release` — cross-compile for Android (defaults to arm64). | |
| - `build_rive.sh ninja release wasm` — cross-compile for WebAssembly. | |
| - `build_rive.sh --toolset=msc release` *(Windows)* — build with MSVC's cl.exe | |
| instead of clang-cl. The build supports both toolchains; the lua warning | |
| suppressions cover MSVC too. | |
| See the comment header at the top of | |
| [`build/build_rive.sh`](https://github.com/rive-app/rive-runtime/blob/main/build/build_rive.sh) | |
| for the complete flag reference. | |
| ### Build outputs | |
| Artifacts land in `out/<config>/` relative to the directory you built | |
| from (typically `tests/`). The config directory encodes any OS/arch flags | |
| you passed: | |
| - `out/release`, `out/debug` — host build. | |
| - `out/ios_release`, `out/android_arm64_release`, `out/wasm_release` — | |
| cross-compile builds. | |
| | Artifact | Description | | |
| | --- | --- | | |
| | `librive.a` / `rive.lib` | Core runtime library. | | |
| | `librive_pls_renderer.a` / `rive_pls_renderer.lib` | GPU renderer. | | |
| | `player` / `player.exe` | Sample app — loads and renders a `.riv` file. | | |
| | `out/<config>/goldens`, `out/<config>/gms`, `out/<config>/bench` | Test harness binaries (regression, golden-image, benchmarking). | | |
| | `librive_decoders.a`, `librive_harfbuzz.a`, … | Supporting libraries. | | |
| ## Testing | |
| The runtime's primary form of testing is **golden testing** — rendering | |
| known scenes and diffing the output against checked-in reference images | |
| via the `goldens` and `gms` test harness binaries (built into | |
| `out/<config>/goldens` and `out/<config>/gms`). | |
| See [`tests/`](https://github.com/rive-app/rive-runtime/tree/main/tests) | |
| for how to run and rebaseline goldens. | |
| Unit tests are secondary and use the | |
| [Catch2](https://github.com/catchorg/Catch2) framework. From the repo root: | |
| ```bash | |
| cd tests/unit_tests | |
| ./test.sh | |
| ``` | |
| Unit tests live in `tests/unit_tests/runtime/` (core runtime) and | |
| `tests/unit_tests/renderer/` (renderer). To add a test, create an | |
| `xxx_test.cpp` file in the appropriate directory — the harness picks it up | |
| automatically. | |
| ## Code formatting | |
| rive-runtime uses clang-format. | |
| - **macOS**: `brew install clang-format`. | |
| - **Windows**: already installed if you have the prerequisites — VS 2022's | |
| C++ Clang Compiler component ships `clang-format.exe` alongside | |
| `clang-cl.exe` at | |
| `C:\Program Files\Microsoft Visual Studio\2022\<edition>\VC\Tools\Llvm\x64\bin\`. | |
| You can also install LLVM standalone from | |
| [llvm.org](https://releases.llvm.org/) or via `winget install LLVM.LLVM`. | |
| - **Linux**: install via your distro's package manager (e.g. | |
| `apt install clang-format`). | |
| ## Memory checks (macOS only) | |
| To run the tests under macOS's built-in `leaks` tool: | |
| ```bash | |
| cd tests/unit_tests | |
| ./test.sh memory | |
| ``` | |
| This wraps the test binary with `leaks --atExit`, which ships with macOS — | |
| no install required. The `memory` flag is ignored on Linux and Windows. | |
| ## Disassembly explorer (macOS / Linux) | |
| To inspect generated assembly per cpp file, install the | |
| [Disassembly Explorer](https://marketplace.visualstudio.com/items?itemName=dseight.disasexpl) | |
| VSCode extension. A `disassemble` task is provided in `.vscode/tasks.json`. | |
| The underlying `gen assembly` task invokes `clang++` directly, so it needs | |
| `clang++` on PATH — works out of the box on macOS (Xcode CLI tools) and most | |
| Linux distros, but not on a default Windows + VS install (which provides | |
| `clang-cl.exe`, not `clang++.exe`). | |
| Reach the task from **Tasks: Run Task**, or bind a key in `keybindings.json`: | |
| ```json | |
| [ | |
| { | |
| "key": "cmd+d", | |
| "command": "workbench.action.tasks.runTask", | |
| "args": "disassemble" | |
| } | |
| ] | |
| ``` |