docs/build.md + docs/zh/build.md rewritten for the Rust workspace: project-built FFmpeg 8.1 (.cargo/config.toml presets FFMPEG_DIR), vendored static OCIO on Linux/macOS vs MSYS2 dynamic OCIO on Windows (with the OCIO_INSTALL_DIR/OCIO_RS_LINK env), the Windows GNU toolchain requirements (MSYS2 Rust, RUSTFLAGS=-C link-args=-lmsvcrt for the mingw-w64 _assert forwarding, unset INCLUDE/LIB), Linux audio dev packages and xvfb headless testing, container packaging, and a troubleshooting section. The macOS-only guides gain a deprecation pointer. Also correct two stale comments in tooling/install-deps.sh (FFmpeg is built by tooling/ffmpeg/build-ffmpeg.sh, not by cargo).
170 lines
6.7 KiB
Markdown
170 lines
6.7 KiB
Markdown
# Build Guide
|
||
|
||
This document describes how to build the Oak Video Editor from source on
|
||
macOS, Linux, and Windows. For the Chinese version see
|
||
[`zh/build.md`](zh/build.md).
|
||
|
||
> **2026 note:** Oak is a pure Rust workspace. `cargo build` at the
|
||
> repository root produces the app (`oak-editor`), the CLI (`oak-cli`)
|
||
> and the render worker (`oak-worker`). The old C++/CMake tree lives on
|
||
> the `cpp-legacy` branch; nothing in this guide uses it.
|
||
|
||
---
|
||
|
||
## Prerequisites (all platforms)
|
||
|
||
- **git** — clone with submodules (`gpui/` is a submodule):
|
||
```sh
|
||
git clone --recursive https://github.com/OakVideoEditorCommunity/oak.git
|
||
cd oak
|
||
# or, on an existing clone: git submodule update --init --recursive
|
||
```
|
||
- **Rust stable** (via [rustup](https://rustup.rs/); on Windows use the
|
||
MSYS2 toolchain instead — see the Windows section).
|
||
- **C toolchain + cmake + pkg-config + nasm** — cmake and a C++ compiler
|
||
are needed by the vendored OpenColorIO build (Linux/macOS), nasm by
|
||
the FFmpeg assembly.
|
||
- **FFmpeg 8.1, built by the project script.** Distro packages are too
|
||
old for `ffmpeg-next` 9 and are deliberately not used:
|
||
```sh
|
||
tooling/install-deps.sh # codec/filter libraries + build tools
|
||
tooling/ffmpeg/build-ffmpeg.sh # clones release/8.1, installs into .cache/ffmpeg
|
||
```
|
||
`FFMPEG_DIR` does not need exporting: the committed
|
||
`.cargo/config.toml` sets it relative to the workspace root
|
||
(`ffmpeg-sys-next` cannot read `.env` at build-script time — the
|
||
config entry is the only machine-agnostic way). The `oakffmpeg-link`
|
||
build script panics without it; run `build-ffmpeg.sh` once before the
|
||
first `cargo build`.
|
||
|
||
## Quick start (macOS / Linux)
|
||
|
||
```sh
|
||
tooling/install-deps.sh # Homebrew / apt / dnf / pacman
|
||
tooling/ffmpeg/build-ffmpeg.sh # ~10–20 min, once
|
||
cargo build --workspace
|
||
cargo test --workspace # Linux: see "headless tests" below
|
||
```
|
||
|
||
---
|
||
|
||
## macOS
|
||
|
||
- macOS 12+, Xcode Command Line Tools (`xcode-select --install`), Homebrew.
|
||
- ```sh
|
||
brew install cmake pkg-config
|
||
tooling/install-deps.sh
|
||
tooling/ffmpeg/build-ffmpeg.sh
|
||
cargo build --workspace
|
||
cargo test --workspace
|
||
```
|
||
- OpenColorIO is compiled from the vendored 2.5.2 sources and linked
|
||
statically — no `brew install opencolorio` needed (cmake is required).
|
||
- The GPU-gated tests (OFX GL overlay, hardware decode) run only with
|
||
`OAK_GPU_TESTS=1`.
|
||
|
||
## Linux
|
||
|
||
- Debian/Ubuntu, Fedora and Arch are supported by
|
||
`tooling/install-deps.sh`. Additionally install:
|
||
```sh
|
||
# Debian/Ubuntu
|
||
sudo apt-get install -y cmake \
|
||
libpipewire-0.3-dev libspa-0.2-dev libjack-jackd2-dev \
|
||
libasound2-dev libpulse-dev libsndfile1-dev \
|
||
libgl1-mesa-dev libvulkan-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||
```
|
||
(the PipeWire/JACK/ALSA/PulseAudio/sndfile dev packages are cpal's
|
||
audio backends; GL/Vulkan/XKB are the wgpu windowing stack).
|
||
- **Headless tests:** several gpui/UI tests open real windows through
|
||
wgpu on Mesa's software Vulkan. Under a display-less session run:
|
||
```sh
|
||
sudo apt-get install -y xvfb mesa-vulkan-drivers
|
||
xvfb-run -a -s "-screen 0 1920x1080x24" cargo test --workspace
|
||
```
|
||
- OpenColorIO is the vendored static build, as on macOS.
|
||
|
||
## Windows (MSYS2 UCRT64)
|
||
|
||
The Windows build targets **x86_64-pc-windows-gnu** with MSYS2's own
|
||
Rust; the MSVC toolchain is not supported (the build scripts emit
|
||
Unix-style link args the MSVC linker rejects).
|
||
|
||
1. Install [MSYS2](https://www.msys2.org/) and open the **UCRT64** shell.
|
||
2. ```sh
|
||
pacman -Syu
|
||
pacman -S --needed mingw-w64-ucrt-x86_64-rust \
|
||
mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-opencolorio
|
||
tooling/install-deps.sh # must run inside the UCRT64 shell
|
||
tooling/ffmpeg/build-ffmpeg.sh
|
||
```
|
||
3. Environment (put in your shell rc or export per session):
|
||
```sh
|
||
# The vendored OCIO sources contain MSVC-only constructs, so Windows
|
||
# links MSYS2's OpenColorIO 2.5.2 dynamically instead:
|
||
export OCIO_RS_ENABLE_REAL=1 OCIO_INSTALL_DIR=/ucrt64 OCIO_RS_LINK=dynamic
|
||
# mingw-w64 (Nov 2025+) forwards _assert to __msvcrt_assert inside
|
||
# libmingwex.a while rustc's link order leaves -lmingwex last; the
|
||
# trailing -lmsvcrt re-scans the CRT import library afterwards
|
||
# (otherwise: undefined _fileno/_setmode/__imp___msvcrt_assert).
|
||
export RUSTFLAGS="-C link-args=-lmsvcrt"
|
||
# If your shell inherits the MSVC INCLUDE/LIB (some CI runners inject
|
||
# them into every step), clear them — they poison the MinGW compiles:
|
||
unset INCLUDE LIB
|
||
```
|
||
4. ```sh
|
||
cargo build --workspace
|
||
cargo test --workspace
|
||
```
|
||
|
||
---
|
||
|
||
## OpenColorIO summary
|
||
|
||
| Platform | Source | Linkage | Notes |
|
||
|----------|--------|---------|-------|
|
||
| Linux / macOS | vendored 2.5.2 (`ocio-sys` `bundled` feature, on by default) | static | needs cmake + C++ compiler |
|
||
| Windows | MSYS2 `mingw-w64-ucrt-x86_64-opencolorio` | dynamic | set `OCIO_INSTALL_DIR=/ucrt64`, `OCIO_RS_LINK=dynamic` |
|
||
|
||
Without the `bundled` feature and without `OCIO_RS_ENABLE_REAL=1`,
|
||
`ocio-sys` builds a stub and every colour test early-returns. The
|
||
bundled feature is enabled unconditionally by `oakrender`, so a plain
|
||
`cargo build` always gets the real thing on Linux/macOS.
|
||
|
||
## Packaging
|
||
|
||
Distribution packages are built in containers (no host dependencies
|
||
beyond Docker/Podman):
|
||
|
||
```sh
|
||
tooling/package/build-deb.sh # Debian 12 → .deb
|
||
tooling/package/build-rpm.sh # Fedora 41 → .rpm
|
||
tooling/package/build-pkg.sh # Arch Linux → .pkg.tar.zst
|
||
```
|
||
|
||
All runtime dependencies are declared in the respective package metadata
|
||
(`packaging/`, `tooling/package/oak.spec`, `tooling/package/PKGBUILD`) —
|
||
the packages are self-contained except for the documented system
|
||
libraries; see `docs/project-storage.md` for what lands where.
|
||
|
||
## Troubleshooting
|
||
|
||
- **`oakffmpeg-link` panics about `FFMPEG_DIR`** — run
|
||
`tooling/ffmpeg/build-ffmpeg.sh` once; it installs into
|
||
`.cache/ffmpeg`, which `.cargo/config.toml` points at.
|
||
- **IDE builds fail (RustRover etc.)** — IDEs that cannot inject
|
||
environment variables into cargo can read a git-ignored `.env` at the
|
||
workspace root with `FFMPEG_DIR=...` (and `PKG_CONFIG_PATH=...` if
|
||
your codec libraries live in a custom prefix).
|
||
- **pacman stalls with "Operation too slow"** — MSYS2 mirrors hiccup;
|
||
`install-deps.sh` retries three times, re-running it resumes via
|
||
`--needed`.
|
||
- **Windows: `undefined reference to _fileno/_setmode/__imp___msvcrt_assert`**
|
||
— set `RUSTFLAGS="-C link-args=-lmsvcrt"` (see the Windows section).
|
||
- **Windows: `AddInstanceForFactory: No factory registered` / MSVC-flavoured
|
||
errors** — you are on the MSVC Rust toolchain; switch to MSYS2's Rust
|
||
(`x86_64-pc-windows-gnu`).
|
||
- **Empty `gpui/` directory** — `git submodule update --init --recursive`.
|
||
- **Linux tests open windows and hang/fail** — use the `xvfb-run` line
|
||
from the Linux section.
|