5.1 KiB
First Build Strategy
1. 目标与非目标
Phase 1 第一目标仅为:以 HarmonyOS API 24 arm64 工具链构建尽可能原始的 upstream MPV,产出 libmpv 及必需 Native libraries。不是播放视频、UI、硬解、HDR 或性能优化。
2. 已确认工具链
SDK root /Applications/DevEco-Studio.app/Contents/sdk/default/openharmony
version 6.1.1.125 / API 24
sysroot <SDK root>/native/sysroot
CC <SDK root>/native/llvm/bin/clang
CXX <SDK root>/native/llvm/bin/clang++
AR <SDK root>/native/llvm/bin/llvm-ar
RANLIB <SDK root>/native/llvm/bin/llvm-ranlib
STRIP <SDK root>/native/llvm/bin/llvm-strip
LD <SDK root>/native/llvm/bin/ld.lld
target aarch64-linux-ohos
compiler OHOS Clang 15.0.4
本机当前没有 meson、ninja、pkg-config 命令。Phase 1 必须先安装并记录版本;不能把 DevEco CMake 当作 MPV 的 Meson 替代品。
3. Meson cross file
建议新增仓库内 toolchains/ohos-api24-arm64.ini,路径允许通过环境生成而非硬编码提交个人目录。预计内容:
[binaries]
c = '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/llvm/bin/clang'
cpp = '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/llvm/bin/clang++'
ar = '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/llvm/bin/llvm-ar'
strip = '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/llvm/bin/llvm-strip'
pkg-config = 'pkg-config'
[built-in options]
c_args = ['--target=aarch64-linux-ohos', '--sysroot=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/sysroot', '-DOHOS_PLATFORM']
cpp_args = ['--target=aarch64-linux-ohos', '--sysroot=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/sysroot', '-DOHOS_PLATFORM']
c_link_args = ['--target=aarch64-linux-ohos', '--sysroot=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/sysroot']
cpp_link_args = ['--target=aarch64-linux-ohos', '--sysroot=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/sysroot']
[host_machine]
system = 'ohos'
cpu_family = 'aarch64'
cpu = 'armv8-a'
endian = 'little'
[properties]
needs_exe_wrapper = true
OHOS_PLATFORM 是本机 EGL header 选择 OHNativeWindow * 的条件;编译器只自动定义 __OHOS__。PKG_CONFIG_LIBDIR 必须只包含 OHOS staging prefix 的 pkgconfig 路径,禁止找到 macOS 宿主库。
4. 依赖顺序
- 建立独立 staging prefix,例如
build/ohos-arm64/prefix。 - zlib:优先使用 SDK
libz.so;验证 Meson/pkg-config 可见性。 - TLS:交叉构建锁版 OpenSSL,确认 CA 策略和许可证。
- FFmpeg:先 software decode/network 版本;再受控开启
--enable-ohcodec。 - FreeType → HarfBuzz/FriBidi → libass。
- libplacebo:首版只开启 MPV 所需最小能力;Vulkan 可暂关,保留 GLES/OpenGL 方向。
- MPV:只构建 libmpv,关闭不适用桌面平台 backend。
每个依赖必须安装 .pc 到 staging prefix;静态依赖需要 Libs.private 完整。
5. MPV 最小 Patch 前的预计配置
以下命令是 Phase 1 设计,不是编译成功声明:
PKG_CONFIG_LIBDIR="$OHOS_PREFIX/lib/pkgconfig:$OHOS_PREFIX/share/pkgconfig" \
meson setup build/ohos-arm64/mpv \
--cross-file toolchains/ohos-api24-arm64.ini \
--prefix "$OHOS_PREFIX" \
--default-library shared \
-Dcplayer=false \
-Dlibmpv=true \
-Dtests=false \
-Dfuzzers=false \
-Dplain-gl=enabled \
-Degl=enabled \
-Dvulkan=disabled \
-Dx11=disabled \
-Dwayland=disabled \
-Ddrm=disabled \
-Dgbm=disabled \
-Dalsa=disabled \
-Dpipewire=disabled \
-Dpulse=disabled \
-Djack=disabled \
-Doss-audio=disabled \
-Dsndio=disabled \
-Daaudio=disabled \
-Daudiotrack=disabled \
-Dopensles=disabled \
-Dcocoa=disabled \
-Dd3d11=disabled \
-Ddirect3d=disabled \
-Dwasapi=disabled \
-Dcuda-hwaccel=disabled \
-Dvaapi=disabled \
-Dvdpau=disabled \
-Dandroid-media-ndk=disabled \
-Dlibcurl=disabled \
-Djavascript=disabled \
-Dlua=disabled \
-Dmanpage-build=disabled
meson compile -C build/ohos-arm64/mpv -v
首次 configure 前需要先增加最小 ohos OS detection,否则 MPV 会把它归为泛 POSIX并选择 Linux timer;应一次修一个 blocker并记入 DOCS/BUILD_ISSUES.md。
6. 预计 Native 链接库
基础:libc/libm、pthread、dl、z。渲染集成阶段:EGL、GLESv3 或 GLESv2、native_window、ace_ndk。音频阶段:ohaudio。硬解阶段:native_media_vdec、native_media_codecbase、native_media_core、native_window。日志可选 hilog_ndk。
不得在 Phase 1 把尚未使用的全部 SDK 库一次性链接进去。
7. Blocker 处理与验收
- 创建
DOCS/BUILD_ISSUES.md,每个原始错误独立编号;一个 patch 对应一个根因。 - 禁止批量
#ifdef掉 core、fake success 或空 backend。 - 产物验收:架构为 AArch64;动态依赖无 macOS/Android 库;导出 libmpv public symbols;记录尺寸、warnings、耗时、enabled/disabled features。
- 完成后生成
DOCS/MPV_BUILD_REPORT.md;当前 Phase 0 不提前创建伪报告。