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).
165 lines
6.7 KiB
Markdown
165 lines
6.7 KiB
Markdown
# 构建指南
|
||
|
||
本文档介绍如何在 macOS、Linux 和 Windows 上从源码构建 Oak 视频编辑器。
|
||
英文版见 [`../build.md`](../build.md)。
|
||
|
||
> **2026 年说明:** Oak 现在是纯 Rust workspace。在仓库根目录执行
|
||
> `cargo build` 会产出应用(`oak-editor`)、命令行工具(`oak-cli`)
|
||
> 和渲染进程(`oak-worker`)。旧的 C++/CMake 代码保留在
|
||
> `cpp-legacy` 分支,本指南不涉及它。
|
||
|
||
---
|
||
|
||
## 通用前置条件
|
||
|
||
- **git** —— 克隆时必须带子模块(`gpui/` 是子模块):
|
||
```sh
|
||
git clone --recursive https://github.com/OakVideoEditorCommunity/oak.git
|
||
cd oak
|
||
# 已有克隆则:git submodule update --init --recursive
|
||
```
|
||
- **Rust stable**(通过 [rustup](https://rustup.rs/) 安装;Windows
|
||
请改用 MSYS2 自带 Rust——见 Windows 章节)。
|
||
- **C 工具链 + cmake + pkg-config + nasm** —— cmake 和 C++ 编译器
|
||
用于 vendored OpenColorIO 构建(Linux/macOS),nasm 用于 FFmpeg
|
||
汇编。
|
||
- **FFmpeg 8.1,由项目脚本构建。** 发行版自带版本对 `ffmpeg-next` 9
|
||
来说太旧,刻意不使用:
|
||
```sh
|
||
tooling/install-deps.sh # 编解码/滤镜库 + 构建工具
|
||
tooling/ffmpeg/build-ffmpeg.sh # 克隆 release/8.1,安装到 .cache/ffmpeg
|
||
```
|
||
`FFMPEG_DIR` 无需手动导出:仓库内提交的 `.cargo/config.toml` 已按
|
||
workspace 根的相对路径设置(`ffmpeg-sys-next` 的构建脚本读不了
|
||
`.env`,这是唯一与机器无关的方式)。缺少它时 `oakffmpeg-link` 的
|
||
构建脚本会直接 panic:首次 `cargo build` 前请先跑一次
|
||
`build-ffmpeg.sh`。
|
||
|
||
## 快速开始(macOS / Linux)
|
||
|
||
```sh
|
||
tooling/install-deps.sh # Homebrew / apt / dnf / pacman
|
||
tooling/ffmpeg/build-ffmpeg.sh # 约 10–20 分钟,只需一次
|
||
cargo build --workspace
|
||
cargo test --workspace # Linux:见下文"无头测试"
|
||
```
|
||
|
||
---
|
||
|
||
## 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 由 vendored 2.5.2 源码编译并静态链接——不需要
|
||
`brew install opencolorio`(但需要 cmake)。
|
||
- GPU 相关测试(OFX GL 叠加层、硬件解码)仅在设置 `OAK_GPU_TESTS=1`
|
||
时运行。
|
||
|
||
## Linux
|
||
|
||
- `tooling/install-deps.sh` 支持 Debian/Ubuntu、Fedora、Arch。
|
||
另外需要安装:
|
||
```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
|
||
```
|
||
(PipeWire/JACK/ALSA/PulseAudio/sndfile 开发包是 cpal 的音频后端;
|
||
GL/Vulkan/XKB 是 wgpu 窗口栈。)
|
||
- **无头测试:** 部分 gpui/UI 测试会通过 wgpu 在 Mesa 软件 Vulkan
|
||
(lavapipe)上打开真实窗口。无显示环境下请运行:
|
||
```sh
|
||
sudo apt-get install -y xvfb mesa-vulkan-drivers
|
||
xvfb-run -a -s "-screen 0 1920x1080x24" cargo test --workspace
|
||
```
|
||
- OpenColorIO 与 macOS 相同,使用 vendored 静态构建。
|
||
|
||
## Windows(MSYS2 UCRT64)
|
||
|
||
Windows 构建目标是 **x86_64-pc-windows-gnu**,使用 MSYS2 自带 Rust;
|
||
不支持 MSVC 工具链(构建脚本会发出 MSVC 链接器不接受的 Unix 风格
|
||
链接参数)。
|
||
|
||
1. 安装 [MSYS2](https://www.msys2.org/),打开 **UCRT64** 终端。
|
||
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 # 必须在 UCRT64 终端内运行
|
||
tooling/ffmpeg/build-ffmpeg.sh
|
||
```
|
||
3. 环境变量(写入 shell rc 或每次会话导出):
|
||
```sh
|
||
# vendored OCIO 源码含有仅 MSVC 可编译的构造,Windows 改为动态链接
|
||
# MSYS2 的 OpenColorIO 2.5.2:
|
||
export OCIO_RS_ENABLE_REAL=1 OCIO_INSTALL_DIR=/ucrt64 OCIO_RS_LINK=dynamic
|
||
# mingw-w64(2025 年 11 月后)把 _assert 转发到 libmingwex.a 里的
|
||
# __msvcrt_assert,而 rustc 的链接顺序把 -lmingwex 放在最后;末尾
|
||
# 追加 -lmsvcrt 让链接器再扫一遍 CRT 导入库
|
||
# (否则报 undefined _fileno/_setmode/__imp___msvcrt_assert)。
|
||
export RUSTFLAGS="-C link-args=-lmsvcrt"
|
||
# 如果 shell 继承了 MSVC 的 INCLUDE/LIB(某些 CI runner 会向每个
|
||
# 步骤注入),务必清除——它们会污染 MinGW 编译:
|
||
unset INCLUDE LIB
|
||
```
|
||
4. ```sh
|
||
cargo build --workspace
|
||
cargo test --workspace
|
||
```
|
||
|
||
---
|
||
|
||
## OpenColorIO 一览
|
||
|
||
| 平台 | 来源 | 链接方式 | 备注 |
|
||
|------|------|----------|------|
|
||
| Linux / macOS | vendored 2.5.2(`ocio-sys` 的 `bundled` 特性,默认开启) | 静态 | 需要 cmake + C++ 编译器 |
|
||
| Windows | MSYS2 `mingw-w64-ucrt-x86_64-opencolorio` | 动态 | 设置 `OCIO_INSTALL_DIR=/ucrt64`、`OCIO_RS_LINK=dynamic` |
|
||
|
||
既没有 `bundled` 特性也没有 `OCIO_RS_ENABLE_REAL=1` 时,`ocio-sys`
|
||
构建为 stub,所有色彩测试直接跳过。`oakrender` 无条件启用 bundled
|
||
特性,因此在 Linux/macOS 上直接 `cargo build` 就会得到真实 OCIO。
|
||
|
||
## 打包
|
||
|
||
发行版包在容器中构建(宿主机只需要 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
|
||
```
|
||
|
||
所有运行时依赖都声明在各自的打包元数据中(`packaging/`、
|
||
`tooling/package/oak.spec`、`tooling/package/PKGBUILD`)——除文档
|
||
列明的系统库外包是自包含的;文件安装位置见
|
||
`docs/project-storage.md`。
|
||
|
||
## 故障排查
|
||
|
||
- **`oakffmpeg-link` 报 `FFMPEG_DIR` panic** —— 先跑一次
|
||
`tooling/ffmpeg/build-ffmpeg.sh`;它安装到 `.cache/ffmpeg`,
|
||
`.cargo/config.toml` 已指向该目录。
|
||
- **IDE 构建失败(RustRover 等)** —— 无法向 cargo 注入环境变量的
|
||
IDE 可以在 workspace 根放一个 git 忽略的 `.env`,写入
|
||
`FFMPEG_DIR=...`(编解码库在自定义前缀时再加
|
||
`PKG_CONFIG_PATH=...`)。
|
||
- **pacman 报 "Operation too slow"** —— MSYS2 镜像偶尔卡顿;
|
||
`install-deps.sh` 会自动重试三次,手动重跑也会借助 `--needed`
|
||
断点续装。
|
||
- **Windows:`undefined reference to _fileno/_setmode/__imp___msvcrt_assert`**
|
||
—— 设置 `RUSTFLAGS="-C link-args=-lmsvcrt"`(见 Windows 章节)。
|
||
- **Windows:出现 MSVC 风格的链接错误** —— 你用的是 MSVC 版 Rust;
|
||
请改用 MSYS2 自带 Rust(`x86_64-pc-windows-gnu`)。
|
||
- **`gpui/` 目录为空** —— `git submodule update --init --recursive`。
|
||
- **Linux 测试开窗口卡死/失败** —— 使用 Linux 章节的 `xvfb-run`
|
||
命令。
|