- vcpkg bootstrapped in every job (the Warp runners carry none): clone + bootstrap into .cache/vcpkg, VCPKG_ROOT exported. - vcpkg.json: ffmpeg pinned at 9.0.1#1 via overrides with builtin-baseline 771b0a2e pinning the port tree; feature fixes (gnutls -> openssl, ffnvcodec -> platform-qualified nvcodec, vaapi on Linux, librsvg windows-only). - Linux and macOS CI/CD jobs also take FFmpeg from the manifest (static triplets x64-linux / arm64-osx keep the packaging story); the build-ffmpeg.sh steps, FFmpeg caches and the codec dev packages leave the workflows — system package managers keep only the X11/audio/GL/Vulkan/tooling deps, now documented in docs/build.md. - New openKylin container job (openkylin/openkylin:latest) on x64 (warp-ubuntu-latest-x64-8x) and ARM64 (warp-ubuntu-latest-arm64-16x, arm64-linux triplet): openKylin package names surveyed against the live image's apt index (nasm/zip come from the kylinsoft anything3.0 PPA), clang for bindgen, xvfb + lavapipe headless tests with the watchdog and retry policy. Known follow-ups (declared in the commit chain): vcpkg has not run end-to-end yet, the pkg-config vs pkgconf executable name on Windows, TLS semantics moving gnutls -> openssl.
7.7 KiB
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.
2026 note: Oak is a pure Rust workspace.
cargo buildat 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 thecpp-legacybranch; nothing in this guide uses it.
Prerequisites (all platforms)
- git — clone with submodules (
gpui/is a submodule):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; 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-next9 and are deliberately not used:tooling/install-deps.sh # codec/filter libraries + build tools tooling/ffmpeg/build-ffmpeg.sh # clones release/8.1, installs into .cache/ffmpegFFMPEG_DIRdoes not need exporting: the committed.cargo/config.tomlsets it relative to the workspace root (ffmpeg-sys-nextcannot read.envat build-script time — the config entry is the only machine-agnostic way). Theoak-ffmpeg-linkbuild script panics without it; runbuild-ffmpeg.shonce before the firstcargo build. - CI/CD uses the vcpkg manifest instead of
build-ffmpeg.sh. Every desktop job runsvcpkg install --triplet <x64-windows | x64-linux | arm64-osx | arm64-linux>against the repo-rootvcpkg.json, which pins FFmpeg to 9.0.1#1 (overrides) and every other port throughbuiltin-baseline; the tree lands invcpkg_installed/<triplet>and jobs pointFFMPEG_DIR/PKG_CONFIG_PATHat it. The C/C++ libraries outside that set (OCIO is vendored, the rest come from the system package manager) are unchanged. The local-build path above remains valid and is what the docs below describe.
Quick start (macOS / Linux)
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. -
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 opencolorioneeded (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:(the PipeWire/JACK/ALSA/PulseAudio/sndfile dev packages are cpal's audio backends; GL/Vulkan/XKB are the wgpu windowing stack).# 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 - Headless tests: several gpui/UI tests open real windows through
wgpu on Mesa's software Vulkan. Under a display-less session run:
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)
CI/CD note: the GitHub Windows CI/CD no longer uses this path — it builds MSVC-ABI on
warp-windows-2025-vs2026-x64-16xwith vcpkg manifest mode (vcpkg.jsonat the repo root: FFmpeg 9.0.1 with every free codec + hwaccel, pkgconf, librsvg, all pinned byoverrides/builtin-baseline) and the vendored static OCIO. The MSYS2 flow below remains the documented local-build alternative.
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).
- Install MSYS2 and open the UCRT64 shell.
-
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 - Environment (put in your shell rc or export per session):
# 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 -
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 oak-render, 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):
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
oak-ffmpeg-linkpanics aboutFFMPEG_DIR— runtooling/ffmpeg/build-ffmpeg.shonce; it installs into.cache/ffmpeg, which.cargo/config.tomlpoints at.- IDE builds fail (RustRover etc.) — IDEs that cannot inject
environment variables into cargo can read a git-ignored
.envat the workspace root withFFMPEG_DIR=...(andPKG_CONFIG_PATH=...if your codec libraries live in a custom prefix). - pacman stalls with "Operation too slow" — MSYS2 mirrors hiccup;
install-deps.shretries three times, re-running it resumes via--needed. - Windows:
undefined reference to _fileno/_setmode/__imp___msvcrt_assert— setRUSTFLAGS="-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-runline from the Linux section.