build: complete HarmonyOS arm64 libmpv phase 1

This commit is contained in:
BoatingCloud committed 2026-08-28 19:08:53 +08:00
1 parent f178d38ce6
commit 75ed9dd2f4
34 files changed
+913 -151

No files matched your search

+2
View File
@@ -1,3 +1,5 @@
/subprojects/*
!/subprojects/packagefiles
!/subprojects/*.wrap
/build/
.DS_Store
+97
View File
@@ -0,0 +1,97 @@
# Phase 1 Build Issues
## BUILD-001
Component: FFmpeg configure
Command: `scripts/build-ffmpeg-ohos.sh`
Original Error: `Unknown option "--disable-postproc".`
File: `scripts/build-ffmpeg-ohos.sh`
Root Cause: 当前 FFmpeg 已移除独立 postproc 配置项,Phase 0 示例参数过期。
Platform Difference: 无;属于当前 upstream 配置接口变化。
Fix: 删除不存在的 `--disable-postproc`,以当前 `configure --help` 为准。
Files Changed: `scripts/build-ffmpeg-ohos.sh`
Patch Required: Build script only
Result: configure 继续执行。
Regression Risk: Low
## BUILD-002
Component: FFmpeg compiler/linker probe
Command: `scripts/build-ffmpeg-ohos.sh`
Original Error: `ld: library 'System' not found`,随后 `C compiler test failed`。
File: `scripts/build-ffmpeg-ohos.sh`、`ffbuild/config.log`
Root Cause: `--sysroot` 不会自动改变 Clang target;链接探针仍按 macOS 目标寻找 `libSystem`。
Platform Difference: macOS arm64 与 OHOS arm64 架构相同,但 ABI、对象格式和系统库不同。
Fix: 同时向 CFLAGS 和 LDFLAGS 显式传入 `--target=aarch64-linux-ohos`。
Files Changed: `scripts/build-ffmpeg-ohos.sh`
Patch Required: Build script only
Result: FFmpeg configure、build、install 成功,产物为 AArch64 ELF。
Regression Risk: Low
## BUILD-003
Component: FreeType zlib resolution
Command: `scripts/build-font-stack-ohos.sh`
Original Error: `ERROR: Subproject zlib is buildable: NO`,Meson 尝试下载 WrapDB zlib。
File: `scripts/build-font-stack-ohos.sh`
Root Cause: FreeType 的 `zlib=external` 表示构建 fallback subproject,不表示使用外部系统库。
Platform Difference: SDK 已提供 target `libz.so`,不应另行下载 target zlib。
Fix: 使用当前 FreeType 定义的 `zlib=system`,通过隔离 `.pc` 指向 SDK AArch64 zlib。
Files Changed: `scripts/build-font-stack-ohos.sh`
Patch Required: Build script only
Result: FreeType 2.14.3 静态库构建成功。
Regression Risk: Low
## BUILD-004
Component: Meson cross-file pkg-config resolution
Command: `scripts/build-font-stack-ohos.sh`
Original Error: HarfBuzz 报 `Dependency 'freetype2' is required but not found`,包装器被解析到 HarfBuzz 源码目录。
File: `toolchains/ohos-api24-arm64.ini`
Root Cause: `@GLOBAL_SOURCE_ROOT@` 指向当前被配置项目的 source root,不固定指向 Velix-MPV-Core。
Platform Difference: 多个独立 Meson 源码树共享一个 target prefix。
Fix: 使用以 Cross File 自身为基准的 `@DIRNAME@/../` 定位包装器与 prefix。
Files Changed: `toolchains/ohos-api24-arm64.ini`
Patch Required: Cross File only
Result: FreeType、HarfBuzz、libass 和 MPV 均只从 OHOS prefix 解析依赖。
Regression Risk: Low
+49 -111
View File
@@ -1,126 +1,64 @@
# First Build Strategy
# HarmonyOS Native Build Strategy
## 1. 目标与非目标
## Scope
Phase 1 第一目标仅为:以 HarmonyOS API 24 arm64 工具链构建尽可能原始的 upstream MPV,产出 `libmpv` 及必需 Native libraries。不是播放视频、UI、硬解、HDR 或性能优化。
Phase 1 只构建 HarmonyOS API 24 arm64 `libmpv`。不包含播放器 UI、XComponent 集成、`ao_harmony`、MPV OHCodec backend、性能优化、HDR 或真机运行声明。
## 2. 已确认工具链
## Toolchain
```text
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
```
| Item | Value |
|---|---|
| SDK | `/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony` |
| Version | 6.1.1.125 / API 24 |
| Target | `aarch64-linux-ohos` |
| Sysroot | `<SDK>/native/sysroot` |
| Compiler | OHOS Clang 15.0.4 |
| Meson | 1.9.0,仓库隔离 venv |
| Ninja | SDK 1.12.0 |
| pkgconf | 3.0.6,仓库隔离 host tool |
| Cross File | `toolchains/ohos-api24-arm64.ini` |
| Prefix | `build/ohos-arm64/prefix` |
本机当前没有 `meson`、`ninja`、`pkg-config` 命令。Phase 1 必须先安装并记录版本;不能把 DevEco CMake 当作 MPV 的 Meson 替代品。
`scripts/setup-ohos-env.sh` 清空 `CPATH`、`C_INCLUDE_PATH`、`CPLUS_INCLUDE_PATH`、`LIBRARY_PATH`、`CMAKE_PREFIX_PATH`,并将 pkg-config 限制到 OHOS prefix。target 编译和链接必须同时带 `--target` 与 `--sysroot`。
## 3. Meson cross file
建议新增仓库内 `toolchains/ohos-api24-arm64.ini`,路径允许通过环境生成而非硬编码提交个人目录。预计内容:
```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. 依赖顺序
1. 建立独立 staging prefix,例如 `build/ohos-arm64/prefix`。
2. zlib:优先使用 SDK `libz.so`;验证 Meson/pkg-config 可见性。
3. TLS:交叉构建锁版 OpenSSL,确认 CA 策略和许可证。
4. FFmpeg:先 software decode/network 版本;再受控开启 `--enable-ohcodec`。
5. FreeType → HarfBuzz/FriBidi → libass。
6. libplacebo:首版只开启 MPV 所需最小能力;Vulkan 可暂关,保留 GLES/OpenGL 方向。
7. MPV:只构建 libmpv,关闭不适用桌面平台 backend。
每个依赖必须安装 `.pc` 到 staging prefix;静态依赖需要 `Libs.private` 完整。
## 5. MPV 最小 Patch 前的预计配置
以下命令是 Phase 1 设计,不是编译成功声明:
## Reproducible Build
```sh
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
scripts/build-all-ohos.sh
```
首次 configure 前需要先增加最小 `ohos` OS detection,否则 MPV 会把它归为泛 POSIX并选择 Linux timer;应一次修一个 blocker并记入 `DOCS/BUILD_ISSUES.md`。
顺序固定为:host tools → pinned sources → C/C++ probes → SDK zlib metadata → OpenSSL → FFmpeg → FreeType/FriBidi/HarfBuzz/libass → libplacebo → MPV → 全量 ABI/污染/符号校验。
## 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。
```sh
scripts/verify-toolchain.sh
scripts/build-openssl-ohos.sh
scripts/build-ffmpeg-ohos.sh
scripts/build-font-stack-ohos.sh
scripts/build-libplacebo-ohos.sh
scripts/build-mpv-ohos.sh
scripts/verify-ohos-prefix.sh
```
不得在 Phase 1 把尚未使用的全部 SDK 库一次性链接进去。
所有下载源码按 `scripts/fetch-phase1-sources.sh` 的 tag/commit 固定。构建目录可删除后重建,禁止从 Homebrew 或 macOS prefix 提供 target library。
## 7. Blocker 处理与验收
## MPV Configuration
- 创建 `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 不提前创建伪报告。
MPV 使用 `-Dauto_features=disabled`,再显式启用 `libmpv`、GPL、`plain-gl`、OpenGL、vector、zlib。CLI、测试、脚本语言、桌面后端、平台硬件加速 backend 和 Vulkan 均关闭。实际 feature 列表以 `DOCS/MPV_BUILD_REPORT.md` 和 `build/ohos-arm64/logs/mpv.log` 为准。
MPV 源码仅增加明确的 `host_machine.system() == 'ohos'` 检测与 `ohos` feature。POSIX 路径继续复用现有 threads、timer、path、poll、IPC、subprocess 实现;这些能力当前只能标记 compile verified。
## Output and Gates
主产物:`build/ohos-arm64/prefix/lib/libmpv.so.2.5.0`。
`scripts/verify-ohos-prefix.sh` 必须同时证明:
- 所有 prefix 静态库成员为 AArch64 ELF;
- `libmpv` 为 AArch64 ELF shared object;
- 动态依赖仅来自 HarmonyOS SDK allowlist;
- `.pc`/CMake/Ninja target metadata 无 Homebrew、`/usr/local`、`.dylib` 或 Apple framework;
- Client API 与 OpenGL Render API 必需符号存在。
真机行为、CA store、XComponent/EGL 生命周期及 OHCodec buffer 语义留到后续阶段验证。
+60
View File
@@ -0,0 +1,60 @@
# HarmonyOS First Native Build Report
## Result
Phase 1 已在 DevEco Studio OpenHarmony SDK 6.1.1.125 / API 24 下生成真实 arm64 `libmpv`。本报告只证明编译、链接和静态检查,不声明真机运行语义已验证。
| 项目 | 结果 |
|---|---|
| Origin | `https://git.leee.xin/leeexin/Velix-MPV-Core.git` |
| origin/harmony-port | 以本次 Phase 1 提交推送后的 commit 为准 |
| MPV | `182fa6ca49f455cadb884858f386e2f00540aeb7` / 0.41.0-UNKNOWN |
| FFmpeg | `3acec0a1af2dda0a0838689b8b8649e7deb080a0` |
| libmpv | `build/ohos-arm64/prefix/lib/libmpv.so.2.5.0` |
| Size | 34,297,376 bytes |
| SHA-256 | `e70c5c4e81cb40f03f5334b9d9deae9afa836b7e420a950a7111099bb87e3a87` |
| Architecture / ABI | ELF64, little-endian, AArch64, System V ABI, shared object, SONAME `libmpv.so.2` |
| Toolchain | OHOS Clang/LLD 15.0.4, target `aarch64-linux-ohos`, musl sysroot |
| Source patches | 1:MPV Meson 增加明确 `ohos` platform feature;依赖源码修改 0 |
| Build issues | 4,全部关闭 |
## Features
MPV enabled:`clone`、`ffmpeg`、`gl`、`glibc-thread-name`、`glob`、`glob-posix`、`gpl`、`libass`、`libdl`、`libplacebo`、`linux-fstatfs`、`memrchr`、`ohos`、`posix`、`posix-shm`、`ppoll`、`pthread-condattr-setclock`、`vector`、`vt.h`、`zlib`、`libmpv shared`、`plain-gl`。
FFmpeg enabled:软件解码、demux、network、HTTP/HTTPS/TCP/TLS、OpenSSL 3.6.4、SDK zlib、OHCodec H.264/HEVC decoder/encoder。FFmpeg GPL/version3/nonfree 均为 0。
Disabled:mpv CLI、tests、fuzzers、Lua/JavaScript、libcurl、桌面音视频后端、X11、Wayland、DRM/GBM、Cocoa、Windows backend、Android-specific backend、Vulkan、VAAPI、VDPAU、CUDA。libplacebo 的 Vulkan/OpenGL 自有 backend 关闭;MPV 自身 OpenGL Render API 保留。
## Verification
- 最小 C/C++ 探针均为 OHOS AArch64 ELF;C++ 探针依赖 SDK `libc++_shared.so`。
- prefix 内 13 个静态库的全部可见 archive object 均通过 AArch64 ELF 检查。
- `libmpv.so.2.5.0` 动态依赖仅为 `libc.so`、`libz.so`、`libnative_media_vdec.so`、`libnative_media_venc.so`、`libnative_media_codecbase.so`、`libnative_media_core.so`、`libnative_window.so`。
- target metadata 未发现 Homebrew、`/usr/local`、`.dylib`、Apple framework 或 Mach-O 污染。
- 已验证 `mpv_create`、`mpv_initialize`、`mpv_command`、`mpv_set_property`、`mpv_get_property`、`mpv_render_context_create`、`mpv_render_context_render`、`mpv_render_context_set_update_callback`、`mpv_render_context_free`。
- `scripts/build-all-ohos.sh` 已连续完成第二次全链路构建与最终校验。
## Warnings
剩余 18 条构建 warning:FFmpeg 5 条 upstream fallthrough/unused-function;FriBidi 5 条 enum-conversion;HarfBuzz 1 条仅开发者需要 Ragel;libass/MPV 4 条非阻塞 CMake compiler-state 探测;libplacebo 3 条无 graphics backend/name-prefix 提示。均不影响当前 target 产物,未通过关闭警告掩盖问题。
## Dependency Graph
实际依赖图见 `DOCS/PHASE1_DEPENDENCY_MATRIX.md`。所有第三方库均静态进入 `libmpv`,SDK zlib、OHCodec 与 libc 保持系统动态依赖。
## License
仓库与 `libmpv` 当前按 MPV GPL-2.0-or-later 路线管理。FFmpeg 为 LGPL 配置且未启用 GPL/nonfree;OpenSSL 为 Apache-2.0;静态 LGPL 组件仍需在正式发布时履行可重新链接、源码与 notices 义务。本文件不是最终发行 notice。
## Phase 2 Risks
1. POSIX、DNS、HTTP/HTTPS 与动态库加载目前仅 compile/link verified,尚未真机 runtime verified。
2. XComponent / OHNativeWindow 生命周期、线程归属、窗口销毁与 EGL context loss 尚未验证。
3. MPV plain-gl 与 HarmonyOS EGL/GLES 的实际格式、扩展、同步和首帧路径尚未联调。
4. FFmpeg OHCodec 已编译,但 MPV hwdec 选择、surface/output buffer 生命周期及零拷贝均未验证。
5. OpenSSL CA 路径与 HAP 内依赖打包、SDK系统库版本兼容仍需真机验证。
## Phase 2 Entry Condition
已具备 XComponent + OHNativeWindow + EGL + libmpv OpenGL Render API 真机首帧测试的编译侧条件:SDK API 可用、libmpv 可链接、OpenGL Render API symbols 齐全。尚不代表首帧已经成功;Phase 2 必须在真机建立窗口和 EGL context 后验证。
+40
View File
@@ -0,0 +1,40 @@
# Phase 1 Dependency Matrix
基线:MPV `182fa6ca49f455cadb884858f386e2f00540aeb7`。状态来自当前 `meson.build`、实际 Meson 配置与最终产物,不沿用 Phase 0 假设。
| Dependency | Version / Commit | Required / Optional | Build System | License | Link | OHOS Status | pkg-config | Blocking libmpv |
|---|---|---|---|---|---|---|---|---|
| libavcodec | 63.8.101 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libavcodec` | Yes |
| libavfilter | 12.3.101 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libavfilter` | Yes |
| libavformat | 63.6.100 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libavformat` | Yes |
| libavutil | 61.6.100 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libavutil` | Yes |
| libswresample | 7.2.100 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libswresample` | Yes |
| libswscale | 10.2.100 / FFmpeg `3acec0a1` | Required | configure + Make | LGPL-2.1+ | Static | Built AArch64 | `libswscale` | Yes |
| libplacebo | 7.360.1 / `cee9b076` | Required | Meson | LGPL-2.1+ | Static | Built AArch64; graphics backends off | `libplacebo` | Yes |
| libass | 0.17.5 / `4a05d812` | Required | Meson | ISC | Static | Built AArch64 | `libass` | Yes |
| FreeType | 2.14.3 / `0a0221a1` | libass transitive | Meson | FTL/GPL-2.0 dual | Static | Built AArch64 | `freetype2` | Yes via libass |
| HarfBuzz | 14.4.0 / `36cb489c` | libass transitive | Meson | MIT | Static | Built AArch64 | `harfbuzz` | Yes via libass |
| FriBidi | 1.0.16 / `68162bab` | libass transitive | Meson | LGPL-2.1+ | Static | Built AArch64 | `fribidi` | Yes via libass |
| OpenSSL | 3.6.4 / `d3c1b116` | HTTPS transitive | Configure + Make | Apache-2.0 | Static | Built AArch64 | `openssl` | Yes for HTTPS |
| zlib | SDK 1.2.13 | MPV optional; enabled | SDK | Zlib | Dynamic | SDK AArch64 `libz.so` | generated `zlib` | No |
| threads / dl / m / rt | SDK API 24 | Platform required | SDK | SDK system | Dynamic/system | Compile verified | Meson compiler/system | Yes |
| EGL / GLES | SDK API 24 | Phase 2 integration | SDK | SDK system | Not linked | Headers/libs available | No target `.pc` used | No |
| libcurl, libarchive, libbluray, libavdevice | Optional | Disabled | Various | Various | None | Not built | Not queried or skipped | No |
| CD/DVD, Lua, MuJS, uchardet, VapourSynth, zimg, rubberband | Optional | Disabled | Various | Various | None | Not built | Skipped | No |
| ALSA, AudioUnit, CoreAudio, JACK, OpenAL, AAudio, OpenSLES, OSS, PipeWire, Pulse, sndio, WASAPI | Optional AO | Disabled | Various | Various | None | Not applicable | Skipped | No |
| X11, Wayland, DRM/GBM, Cocoa, D3D11, Vulkan, VAAPI, VDPAU, CUDA, Android Media NDK | Optional VO/hwaccel | Disabled | Various | Various | None | Not applicable | Skipped | No |
实际依赖图:
```text
OpenSSL ───────────────┐
SDK zlib ──────────────┼─> FFmpeg ───────────────┐
└─> FreeType ─> HarfBuzz ─┤
FriBidi ──────────────────────────────┐ │
FreeType + HarfBuzz + FriBidi ───────> libass ───┤
libplacebo ──────────────────────────────────────┼─> libmpv.so
SDK libc/pthread/dl/m/rt/z ──────────────────────┘
SDK native_media_* + native_window <─ FFmpeg OHCodec
```
所有 `.pc` 仅由 `scripts/pkg-config-ohos.sh` 从 OHOS prefix 解析。最终校验未发现 `/opt/homebrew`、`/usr/local`、Mach-O 或 `.dylib` target 输入。
+1 -1
View File
@@ -3,4 +3,4 @@
- `GPL-2.0-or-later.txt`:MPV 默认构建所适用的 GPL v2 文本。
- `LGPL-2.1-or-later.txt`:MPV 合规 LGPL-only 构建及 FFmpeg 默认构建所涉及的 LGPL v2.1 文本。
第三方源码未 vendoring 到本仓库,因此其许可证正文不在未锁版前复制。Phase 1 锁定每个依赖 commit 后,必须复制对应仓库的原始许可证正文并更新 `LICENSE_AUDIT.md`。
Phase 1 已锁定第三方源码,实际版本、原始许可证文件位置和源码仓库见 `LICENSE_AUDIT.md`。正式发行包必须从对应锁定 commit 收集原始许可证与版权声明;本目录当前只保存 MPV/FFmpeg 核心 GPL/LGPL 正文,不得作为完整 Release notices 使用。
+24 -29
View File
@@ -1,39 +1,34 @@
# License Audit
审计基线:MPV `182fa6ca49f455cadb884858f386e2f00540aeb7`。本文件是工程审计记录,不构成法律意见。
审计基线:MPV `182fa6ca49f455cadb884858f386e2f00540aeb7`,Phase 1 实际构建。本文是工程记录,不构成法律意见。
## 当前结论
## Conclusion
仓库分离不改变链接后二进制的许可证。第一版按 MPV 默认 GPLv2+ 口径管理,除非后续对 MPV、FFmpeg 及全部链接依赖完成 LGPL-only 的逐文件、逐选项和链接方式审计。MPV 自身 `Copyright` 明确说明 `-Dgpl=false` 只是排除已知 GPL-only 文件的辅助开关,并不自动产生 LGPL 授权结论。
Velix-MPV-Core 与最终 `libmpv` 按 MPV 默认 GPL-2.0-or-later 路线管理。独立仓库及私有 Gitea 不改变 upstream 义务,也不使许可证自动隔离。当前不得宣称 LGPL-only。
Phase 0 尚未生成二进制,因此“最终实际链接库”尚不存在。下表区分计划必需与候选依赖;Phase 1 必须以 link map、`readelf -d` 和构建配置替换“预计”字段。
FFmpeg 实际配置为 `CONFIG_GPL=0`、`CONFIG_VERSION3=0`、`CONFIG_NONFREE=0`。所有第三方库静态进入 `libmpv`,因此正式发布仍需满足 LGPL 组件的源码、版权、修改说明与可重新链接要求。
| 组件 | 许可证 | 计划链接 | 必需 | GPL-only / 风险 | 依据与状态 |
|---|---|---:|---:|---|---|
| MPV | 默认 GPL-2.0-or-later;满足完整条件时可 LGPL-2.1-or-later | 动态 `libmpv` 优先 | 是 | 默认构建含 GPL-only 文件 | 本仓库 `Copyright`、`LICENSE.GPL`、`LICENSE.LGPL` |
| FFmpeg | 默认 LGPL-2.1-or-later;`--enable-gpl` 后 GPL;`--enable-nonfree` 不可再分发 | 动态优先 | 是 | 外部库和 configure 选项可改变整体许可证 | FFmpeg `LICENSE.md`;Phase 1 锁 commit |
| libplacebo | LGPL-2.1-or-later(待锁定版本复核原文) | 静态或动态待定 | 是(当前 MPV Meson 强依赖) | 静态链接影响 LGPL 重新链接义务 | MPV `meson.build` 要求 `>=7.360.1` |
| libass | ISC(待锁定版本复核原文) | 动态优先 | 是 | 还会引入 FreeType、HarfBuzz、FriBidi | MPV `meson.build` 要求 `>=0.12.2` |
| zlib | Zlib | SDK 动态 `libz.so` 优先 | 可选但建议启用 | 低 | 本机 API 24 SDK 提供头文件和库 |
| TLS 实现 | OpenSSL 3.x 为首选候选,Apache-2.0 | 动态优先 | HTTPS 必需 | FFmpeg GPLv2 模式与 OpenSSL 组合需单独复核;不得同时启用 nonfree 后分发 | 尚未锁版;Harmony `libnet_ssl.so` 不能直接当作 FFmpeg TLS backend |
| FreeType | FTL 或 GPL 双许可证 | 由 libass 引入 | 字幕必需 | 选择 FTL 口径并保存原文 | NEED VERIFY at pin |
| HarfBuzz | MIT | 由 libass 引入 | 复杂文本必需 | 低 | NEED VERIFY at pin |
| FriBidi | LGPL-2.1-or-later | 由 libass 引入 | 双向文本必需 | 动态链接优先 | NEED VERIFY at pin |
| iconv | 系统 libc 或独立实现许可证 | 系统符号优先 | 字符集处理 | 若引入 GNU libiconv,需审核 LGPL | Phase 1 探测 |
| libcurl | curl license | 默认关闭;网络交给 FFmpeg | 否 | 增加 TLS/HTTP 依赖面 | MPV `-Dlibcurl=disabled` |
| uchardet | MPL-1.1 / GPL-2.0-or-later / LGPL-2.1-or-later 多许可证 | 默认关闭 | 否 | 需选择许可口径 | NEED VERIFY at pin |
| MuJS | ISC | 默认关闭 | 否 | 低 | JS 功能首版不需要 |
| HarmonyOS Native SDK stubs | SDK/EULA 与各头文件声明并存 | 系统动态库 | 是 | 发行许可由 HarmonyOS SDK 条款约束 | 需在发版前由法务核查 SDK redistributable 边界 |
| Component | Version / Commit | License | Feature | Link | Modified | Source Location |
|---|---|---|---|---|---|---|
| MPV | 0.41.0-UNKNOWN / `182fa6ca49` | GPL-2.0-or-later default | libmpv, plain-gl, subtitles, network | Shared output | Yes, OHOS Meson detection | `upstream` remote / current repository |
| FFmpeg | `3acec0a1` | LGPL-2.1-or-later configuration | decode, demux, filter, network, HTTPS, OHCodec | Static | No | `https://git.ffmpeg.org/ffmpeg.git` |
| libplacebo | 7.360.1 / `cee9b076` | LGPL-2.1-or-later | core/shader generation | Static | No | `https://code.videolan.org/videolan/libplacebo.git` |
| libass | 0.17.5 / `4a05d812` | ISC | subtitle rendering | Static | No | `https://github.com/libass/libass.git` |
| FreeType | 2.14.3 / `0a0221a1` | FreeType License or GPL-2.0 | font rasterization | Static | No | `https://github.com/freetype/freetype.git` |
| HarfBuzz | 14.4.0 / `36cb489c` | MIT | text shaping | Static | No | `https://github.com/harfbuzz/harfbuzz.git` |
| FriBidi | 1.0.16 / `68162bab` | LGPL-2.1-or-later | bidirectional text | Static | No | `https://github.com/fribidi/fribidi.git` |
| OpenSSL | 3.6.4 / `d3c1b116` | Apache-2.0 | FFmpeg TLS/HTTPS | Static | No | `https://github.com/openssl/openssl.git` |
| zlib | SDK 1.2.13 | Zlib | FFmpeg/FreeType/MPV compression | System dynamic | No | HarmonyOS Native SDK |
| HarmonyOS Native SDK stubs | 6.1.1.125 / API 24 | SDK terms and header notices | libc, zlib, OHCodec, native window | System dynamic | No | DevEco Studio SDK |
## MPV GPL-only 范围
## Actual Link State
MPV `Copyright` 当前列出 JACK、OSS、DVB、CDDA、DVD、CACA、legacy Direct3D、VAAPI VO、VDPAU、X11/Xv 等 GPL-only 文件。HarmonyOS 首版均不需要,但这不等于整个产物自动成为 LGPL。
`libmpv.so.2.5.0` 的 `DT_NEEDED` 仅包含 `libc.so`、`libz.so`、`libnative_media_vdec.so`、`libnative_media_venc.so`、`libnative_media_codecbase.so`、`libnative_media_core.so`、`libnative_window.so`。其余依赖为静态链接。未发现 FFmpeg nonfree、Homebrew 或 macOS target library。
## 发版门禁
## Release Gates
1. 固定全部源码 commit、构建选项、静态/动态链接方式。
2. 保存 FFmpeg `configure` 输出与 `config.h`,确认未启用 `nonfree`,并列出 GPL/version3 状态。
3. 保存 MPV `meson configure` 输出,逐项确认 GPL-only 文件是否进入产物。
4. 用 `llvm-readelf -d`、link map 和 archive 成员清单核对所有实际链接库。
5. 补齐许可证正文、版权声明、源码获取方式、修改说明及 LGPL 重新链接材料。
6. 商业发布前完成法务复核;未完成前不得宣称“LGPL-only”或“闭源可安全链接”。
1. 保存锁定 commit、构建选项、`config.h`、link state 与 archive 清单。
2. 随发行物提供对应许可证正文、版权声明、源码获取方式和修改说明。
3. 为静态 LGPL 组件提供满足许可证要求的重新链接材料。
4. 复核 OpenSSL、FFmpeg、MPV GPLv2+ 组合以及 HarmonyOS SDK redistributable 边界。
5. 商业发布前完成法务审核;`THIRD_PARTY_NOTICES.md` 当前仍不是最终 Release notice。
+3 -2
View File
@@ -1,10 +1,11 @@
# Velix-MPV-Core Memory
- 项目:独立 HarmonyOS MPV 播放内核,禁止混入 Velix 主应用源码。
- 当前阶段:Phase 0 研究已完成,等待确认后才能进入 Phase 1。
- 当前阶段:Phase 1 已完成并验证;等待用户确认后才能进入 Phase 2。
- 基线:MPV `182fa6ca49f455cadb884858f386e2f00540aeb7`,分支 `harmony-port`。
- SDK:OpenHarmony API 24 / 6.1.1.125 / `aarch64-linux-ohos` / Clang 15.0.4。
- 关键结论:首版 GLES+EGL+libmpv Render API;OHAudio AO;官方 FFmpeg OHCodec 路线。
- Phase 1 产物:`build/ohos-arm64/prefix/lib/libmpv.so.2.5.0`,AArch64 ELF,OpenGL Render API symbols 完整。
- 远程:`origin` 为私有 Gitea 仓库,默认分支 `harmony-port`;`upstream` 为 MPV 官方仓库。
- 待办:安装 Meson/Ninja/pkg-config;用户确认后进入 Phase 1 首编译。
- 待办:用户确认后进入 Phase 2 XComponent + EGL 真机首帧验证。
- 索引:`memory/projects.md`、`memory/infra.md`、`memory/lessons.md`、`memory/2026-08-28.md`。
+16 -3
View File
@@ -1,7 +1,20 @@
# Third-Party Notices
Velix-MPV-Core 基于 MPV,当前上游基线见 `UPSTREAM.md`。MPV 默认按 GNU GPL v2 or later 管理;其完整版权与许可证说明保留在 `Copyright`、`LICENSE.GPL`、`LICENSE.LGPL` 及 `LICENSES/`。
Velix-MPV-Core 基于 MPV upstream Git 历史维护,当前默认按 GNU GPL v2 or later 管理。MPV 完整版权与许可证说明保留在 `Copyright`、`LICENSE.GPL`、`LICENSE.LGPL` 与 `LICENSES/`。
计划构建将使用 FFmpeg、libplacebo、libass,并可能使用 zlib、OpenSSL、FreeType、HarfBuzz、FriBidi 等依赖。Phase 0 未产生可分发二进制,依赖版本与最终链接集合尚未锁定,因此本文件不是最终发行 notices。
Phase 1 实际构建包含:
每次发布必须由构建产物自动生成第三方清单,至少包含:组件名称、版本/commit、主页、版权方、许可证、修改状态、静态/动态链接方式、许可证正文位置和源码获取方式。完整审计门禁见 `LICENSE_AUDIT.md`。
| Component | Version / Commit | License | Link | Modified |
|---|---|---|---|---|
| FFmpeg | `3acec0a1` | LGPL-2.1-or-later configuration | Static | No |
| libplacebo | 7.360.1 | LGPL-2.1-or-later | Static | No |
| libass | 0.17.5 | ISC | Static | No |
| FreeType | 2.14.3 | FreeType License / GPL-2.0 dual | Static | No |
| HarfBuzz | 14.4.0 | MIT | Static | No |
| FriBidi | 1.0.16 | LGPL-2.1-or-later | Static | No |
| OpenSSL | 3.6.4 | Apache-2.0 | Static | No |
| zlib | HarmonyOS SDK 1.2.13 | Zlib | System dynamic | No |
源码仓库、完整 commit、启用功能与实际链接状态见 `UPSTREAM.md`、`LICENSE_AUDIT.md`、`DOCS/PHASE1_DEPENDENCY_MATRIX.md`。依赖源码由 `scripts/fetch-phase1-sources.sh` 获取,构建过程不修改其源码。
本文是 Phase 1 工程清单,不是最终发行 notice。正式发布必须补齐各组件原始版权声明、许可证正文、源码交付/获取方式、修改说明及 LGPL 静态链接所需的重新链接材料。
+21 -1
View File
@@ -14,6 +14,23 @@
| Compiler | OHOS Clang `15.0.4` (`99548401bd80576251755b185ab95945e5fe7884`) |
| Build System | MPV Meson `>=1.3.0` + Ninja;依赖使用各自原生构建系统 |
Velix-MPV-Core 是基于 MPV upstream Git 历史维护的独立派生仓库,不是 GitHub Fork。仓库完整保留 upstream history、基线 commit、MPV 版权与许可证文件,并持续保留 `upstream` remote。
## FFmpeg 基线
| 项目 | 值 |
|---|---|
| Repository | `https://git.ffmpeg.org/ffmpeg.git` |
| Commit | `3acec0a1af2dda0a0838689b8b8649e7deb080a0` |
| Commit Date | 2026-08-28 |
| git describe | `3acec0a`(该 commit 无可达 tag) |
| License Mode | LGPL-2.1-or-later;`CONFIG_GPL=0`、`CONFIG_VERSION3=0`、`CONFIG_NONFREE=0` |
| Build | 静态 PIC;禁用 programs、docs、debug、avdevice 与 autodetect |
| Enabled | network、OpenSSL、zlib、OHCodec |
| OHCodec | `AV_HWDEVICE_TYPE_OHCODEC`、`AV_PIX_FMT_OHCODEC`、H.264/HEVC OH decoder/encoder 已编译 |
FFmpeg configure 参数由 `scripts/build-ffmpeg-ohos.sh` 固定。当前不创建 Velix FFmpeg fork;只有 upstream 出现需要长期维护的真实 blocker 时才重新评估。
## 远程状态
- `upstream` 已指向 MPV 官方仓库。
@@ -23,6 +40,9 @@
```sh
git fetch upstream
git fetch origin
git log --oneline --decorate harmony-port..upstream/master
git diff harmony-port...upstream/master
git range-diff <old-upstream>..harmony-port upstream/master..<rebased-candidate>
```
基线更新必须先 `git fetch upstream`,评估后再合并或变基到 `harmony-port`,并同步更新本文件。
基线更新必须先检查 `git log`、`git diff` 和适用的 `git range-diff`,再评估使用 merge 或 rebase,并同步更新本文件。禁止直接强制覆盖 `harmony-port`。
+6
View File
@@ -9,3 +9,9 @@
文件变更: UPSTREAM.md, MEMORY.md, memory/projects.md, memory/infra.md, memory/lessons.md, memory/2026-08-28.md
教训: 单次 HTTPS pack 受限时可分历史基线和增量推送,保持完整历史不变。
标签: #git #gitea #remote #history
[PROJECT:Velix-MPV-Core] 完成 Phase 1 HarmonyOS Native Build
结论: API 24 arm64 libmpv 已真实生成并重复构建通过,13 个静态库与最终 ELF、动态依赖、Client/OpenGL Render API symbols、宿主污染均完成核验。
文件变更: meson.build, scripts/, toolchains/, UPSTREAM.md, LICENSE_AUDIT.md, THIRD_PARTY_NOTICES.md, DOCS/BUILD_STRATEGY.md, DOCS/PHASE1_DEPENDENCY_MATRIX.md, DOCS/BUILD_ISSUES.md, DOCS/MPV_BUILD_REPORT.md, memory/*
教训: Clang target 必须显式用于编译与链接;Meson 共享 Cross File 使用 @DIRNAME@;FreeType SDK zlib 使用 system 模式。
标签: #phase1 #libmpv #ohos #aarch64 #cross-compile
+3
View File
@@ -7,5 +7,8 @@
- Toolchain:`<SDK>/native/llvm/bin`
- Target:`aarch64-linux-ohos`
- Compiler:OHOS Clang 15.0.4
- Build tools:Meson 1.9.0、Ninja 1.12.0、pkgconf 3.0.6,均由仓库脚本隔离管理
- OHOS prefix:`build/ohos-arm64/prefix`
- libmpv:`build/ohos-arm64/prefix/lib/libmpv.so.2.5.0`
- Git origin:`https://git.leee.xin/leeexin/Velix-MPV-Core.git`,默认分支 `harmony-port`
- MPV upstream:`https://github.com/mpv-player/mpv.git`
+3
View File
@@ -5,8 +5,11 @@
- OHOS 同时定义 `__OHOS__` 和 `__linux__`;必须显式平台检测,不能把全部 Linux API视为可用。
- 最新 FFmpeg upstream 已有 OHCodec H.264/HEVC;研究当前源码后再决定 fork,避免重复维护。
- `libnet_ssl.so` 主要提供证书验证接口,不是 FFmpeg TLS transport backend。
- Clang 仅设置 sysroot 不会切换 target;macOS arm64 交叉编译必须在编译和链接两侧显式传 `--target=aarch64-linux-ohos`。
## Medium
- MPV upstream 使用 `DOCS/`;大小写不敏感文件系统不能可靠并存 `docs/`,沿用 upstream 目录。
- 私有 Gitea 反向代理限制单次 HTTPS pack 时,可先推送历史基线 commit,再推增量分支;不得以浅克隆或裁剪历史规避限制。
- Meson Cross File 的 `@GLOBAL_SOURCE_ROOT@` 随被构建项目变化;共享工具路径应以 `@DIRNAME@` 相对 Cross File 定位。
- FreeType `zlib=external` 表示 fallback subproject;使用 SDK zlib 必须选择 `zlib=system` 并隔离 pkg-config。
+4 -4
View File
@@ -2,7 +2,7 @@
## Velix-MPV-Core
- 状态:Phase 0 研究文档已完成并核验;尚未进入首次编译。
- 已完成:完整 MPV 历史、独立 `origin`、官方 `upstream`、`harmony-port`、89 个官方标签,以及 SDK/API/源码/依赖/许可证/渲染/音频/硬解研究。
- 待办:用户确认后进入 Phase 1。
- Phase 1 前置:安装 Meson、Ninja、pkg-config,锁定 FFmpeg与依赖 commit。
- 状态:Phase 1 HarmonyOS arm64 首次 Native Build 已完成并核验;未进入 Phase 2。
- 已完成:远程闭环、固定依赖、隔离工具链、C/C++ 探针、FFmpeg/OpenSSL/字体栈/libplacebo、AArch64 `libmpv.so.2.5.0`、ABI/符号/污染/许可证审计。
- 产物:`build/ohos-arm64/prefix/lib/libmpv.so.2.5.0`,34,297,376 bytes。
- 待办:用户确认后进入 Phase 2 XComponent + OHNativeWindow + EGL 真机首帧。
+2
View File
@@ -324,10 +324,12 @@ if cc.get_id() == 'gcc'
endif
darwin = host_machine.system() == 'darwin'
ohos = host_machine.system() == 'ohos'
win32 = host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
posix = not win32
features += {'darwin': darwin}
features += {'ohos': ohos}
features += {'posix': posix}
features += {'dos-paths': win32, 'win32': win32}
+29
View File
@@ -0,0 +1,29 @@
#!/bin/sh
set -eu
PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
HOST_ROOT=$PROJECT_ROOT/build/host-tools
VENV=$HOST_ROOT/venv
PKGCONF_SOURCE=$HOST_ROOT/pkgconf-source
PKGCONF_BUILD=$HOST_ROOT/pkgconf-build
PKGCONF_PREFIX=$HOST_ROOT/pkgconf
NINJA_DIR=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/build-tools/cmake/bin
mkdir -p "$HOST_ROOT"
test -x "$VENV/bin/python" || python3 -m venv "$VENV"
"$VENV/bin/python" -m pip install --disable-pip-version-check --quiet 'meson==1.9.0'
if test ! -d "$PKGCONF_SOURCE/.git"; then
git clone --branch pkgconf-3.0.6 --depth 1 https://github.com/pkgconf/pkgconf.git "$PKGCONF_SOURCE"
fi
PATH="$VENV/bin:$NINJA_DIR:$PATH"
export PATH
meson setup "$PKGCONF_BUILD" "$PKGCONF_SOURCE" --prefix "$PKGCONF_PREFIX" --buildtype release --wipe
meson compile -C "$PKGCONF_BUILD"
meson install -C "$PKGCONF_BUILD"
meson --version
"$PKGCONF_PREFIX/bin/pkgconf" --version
ninja --version
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
set -eu
PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
"$PROJECT_ROOT/scripts/bootstrap-host-tools.sh"
"$PROJECT_ROOT/scripts/fetch-phase1-sources.sh"
"$PROJECT_ROOT/scripts/verify-toolchain.sh"
"$PROJECT_ROOT/scripts/prepare-sdk-dependencies.sh"
"$PROJECT_ROOT/scripts/build-openssl-ohos.sh"
"$PROJECT_ROOT/scripts/build-ffmpeg-ohos.sh"
"$PROJECT_ROOT/scripts/build-font-stack-ohos.sh"
"$PROJECT_ROOT/scripts/build-libplacebo-ohos.sh"
"$PROJECT_ROOT/scripts/build-mpv-ohos.sh"
"$PROJECT_ROOT/scripts/verify-ohos-prefix.sh"
+82
View File
@@ -0,0 +1,82 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
SOURCE=$OHOS_BUILD_ROOT/sources/ffmpeg
BUILD=$OHOS_BUILD_ROOT/build/ffmpeg
LOG_DIR=$OHOS_BUILD_ROOT/logs
JOBS=$(sysctl -n hw.ncpu)
test -f "$SOURCE/configure" || "$PROJECT_ROOT/scripts/fetch-phase1-sources.sh"
test -f "$PREFIX/lib/libssl.a" || "$PROJECT_ROOT/scripts/build-openssl-ohos.sh"
mkdir -p "$BUILD" "$LOG_DIR"
cd "$BUILD"
if ! "$SOURCE/configure" \
--prefix="$PREFIX" \
--enable-cross-compile \
--target-os=linux \
--arch=aarch64 \
--cc="$CC" \
--cxx="$CXX" \
--ar="$AR" \
--ranlib="$RANLIB" \
--strip="$STRIP" \
--nm="$NM" \
--sysroot="$OHOS_SYSROOT" \
--pkg-config="$PKG_CONFIG" \
--extra-cflags="--target=$TARGET -D__MUSL__ -fPIC" \
--extra-ldflags="--target=$TARGET -L$PREFIX/lib" \
--enable-pic \
--enable-static \
--disable-shared \
--disable-programs \
--disable-doc \
--disable-debug \
--disable-avdevice \
--disable-autodetect \
--enable-network \
--enable-openssl \
--enable-zlib \
--enable-ohcodec > "$LOG_DIR/ffmpeg-configure.log" 2>&1; then
tail -n 120 "$LOG_DIR/ffmpeg-configure.log" >&2
exit 1
fi
if ! make -j"$JOBS" > "$LOG_DIR/ffmpeg-build.log" 2>&1; then
tail -n 160 "$LOG_DIR/ffmpeg-build.log" >&2
exit 1
fi
make install > "$LOG_DIR/ffmpeg-install.log" 2>&1
"$PROJECT_ROOT/scripts/verify-static-archive.sh" \
"$PREFIX/lib/libavcodec.a" \
"$PREFIX/lib/libavfilter.a" \
"$PREFIX/lib/libavformat.a" \
"$PREFIX/lib/libavutil.a" \
"$PREFIX/lib/libswresample.a" \
"$PREFIX/lib/libswscale.a"
for library in libavcodec libavfilter libavformat libavutil libswresample libswscale; do
"$PKG_CONFIG" --modversion "$library"
done
for definition in \
CONFIG_H264_DECODER \
CONFIG_HEVC_DECODER \
CONFIG_H264_OH_DECODER \
CONFIG_HEVC_OH_DECODER \
CONFIG_MATROSKA_DEMUXER \
CONFIG_MOV_DEMUXER \
CONFIG_HTTP_PROTOCOL \
CONFIG_HTTPS_PROTOCOL \
CONFIG_TCP_PROTOCOL \
CONFIG_TLS_PROTOCOL; do
grep -q "^#define $definition 1$" "$BUILD/config_components.h" || {
printf 'Missing FFmpeg feature: %s\n' "$definition" >&2
exit 1
}
done
grep -q '^#define CONFIG_NETWORK 1$' "$BUILD/config.h"
grep -q '^#define CONFIG_OHCODEC 1$' "$BUILD/config.h"
+61
View File
@@ -0,0 +1,61 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
SOURCE_ROOT=$OHOS_BUILD_ROOT/sources
BUILD_ROOT=$OHOS_BUILD_ROOT/build
LOG_DIR=$OHOS_BUILD_ROOT/logs
test -f "$SOURCE_ROOT/freetype/meson.build" || "$PROJECT_ROOT/scripts/fetch-phase1-sources.sh"
mkdir -p "$BUILD_ROOT" "$LOG_DIR"
setup_build()
{
name=$1
shift
source_dir=$SOURCE_ROOT/$name
build_dir=$BUILD_ROOT/$name
if test -f "$build_dir/meson-private/coredata.dat"; then
meson setup "$build_dir" "$source_dir" --wipe "$@"
else
meson setup "$build_dir" "$source_dir" "$@"
fi
meson compile -C "$build_dir"
meson install -C "$build_dir"
}
setup_build freetype \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Dzlib=system -Dharfbuzz=disabled -Dpng=disabled -Dbrotli=disabled \
-Dbzip2=disabled -Dtests=disabled > "$LOG_DIR/freetype.log" 2>&1
setup_build fribidi \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Ddocs=false -Dbin=false -Dtests=false > "$LOG_DIR/fribidi.log" 2>&1
setup_build harfbuzz \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Dglib=disabled -Dgobject=disabled -Dcairo=disabled -Dchafa=disabled \
-Dpng=disabled -Dzlib=disabled -Dicu=disabled -Dfreetype=enabled \
-Draster=disabled -Dvector=disabled -Dgpu=disabled -Dgpu_demo=disabled \
-Dsubset=disabled -Dtests=disabled -Dintrospection=disabled -Ddocs=disabled \
-Dutilities=disabled > "$LOG_DIR/harfbuzz.log" 2>&1
setup_build libass \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Dfontconfig=disabled -Ddirectwrite=disabled -Dcoretext=disabled \
-Dasm=disabled -Dlibunibreak=disabled -Drequire-system-font-provider=false \
-Dtest=disabled -Dcompare=disabled -Dprofile=disabled -Dfuzz=disabled \
-Dcheckasm=disabled > "$LOG_DIR/libass.log" 2>&1
"$PROJECT_ROOT/scripts/verify-static-archive.sh" \
"$PREFIX/lib/libfreetype.a" \
"$PREFIX/lib/libfribidi.a" \
"$PREFIX/lib/libharfbuzz.a" \
"$PREFIX/lib/libass.a"
for library in freetype2 fribidi harfbuzz libass; do
printf '%s=' "$library"
"$PKG_CONFIG" --modversion "$library"
done
+36
View File
@@ -0,0 +1,36 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
SOURCE=$OHOS_BUILD_ROOT/sources/libplacebo
BUILD=$OHOS_BUILD_ROOT/build/libplacebo
LOG=$OHOS_BUILD_ROOT/logs/libplacebo.log
test -f "$SOURCE/meson.build" || "$PROJECT_ROOT/scripts/fetch-phase1-sources.sh"
mkdir -p "$OHOS_BUILD_ROOT/logs"
if test -f "$BUILD/meson-private/coredata.dat"; then
setup_mode=--wipe
else
setup_mode=
fi
if ! meson setup "$BUILD" "$SOURCE" $setup_mode \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Dvulkan=disabled -Dopengl=disabled -Dd3d11=disabled \
-Dglslang=disabled -Dshaderc=disabled -Dlcms=disabled \
-Ddovi=disabled -Dlibdovi=disabled -Dunwind=disabled -Dxxhash=disabled \
-Ddemos=false -Dtests=false -Dbench=false -Dfuzz=false > "$LOG" 2>&1; then
tail -n 140 "$LOG" >&2
exit 1
fi
if ! meson compile -C "$BUILD" >> "$LOG" 2>&1; then
tail -n 180 "$LOG" >&2
exit 1
fi
meson install -C "$BUILD" >> "$LOG" 2>&1
"$PROJECT_ROOT/scripts/verify-static-archive.sh" "$PREFIX/lib/libplacebo.a"
"$PKG_CONFIG" --modversion libplacebo
"$PKG_CONFIG" --variable=pl_has_vulkan libplacebo
+40
View File
@@ -0,0 +1,40 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
BUILD=$OHOS_BUILD_ROOT/build/mpv
LOG=$OHOS_BUILD_ROOT/logs/mpv.log
mkdir -p "$OHOS_BUILD_ROOT/logs"
test -f "$PREFIX/lib/libavcodec.a" || "$PROJECT_ROOT/scripts/build-ffmpeg-ohos.sh"
test -f "$PREFIX/lib/libass.a" || "$PROJECT_ROOT/scripts/build-font-stack-ohos.sh"
test -f "$PREFIX/lib/libplacebo.a" || "$PROJECT_ROOT/scripts/build-libplacebo-ohos.sh"
if test -f "$BUILD/meson-private/coredata.dat"; then
setup_mode=--wipe
else
setup_mode=
fi
if ! meson setup "$BUILD" "$PROJECT_ROOT" $setup_mode \
--cross-file "$CROSS_FILE" --prefix "$PREFIX" --buildtype release \
-Ddefault_library=shared -Dauto_features=disabled \
-Dcplayer=false -Dlibmpv=true -Dtests=false -Dfuzzers=false \
-Dgpl=true -Dbuild-date=false -Dplain-gl=enabled -Dgl=enabled \
-Dzlib=enabled -Dvector=enabled -Dlua=disabled > "$LOG" 2>&1; then
tail -n 180 "$LOG" >&2
exit 1
fi
if ! meson compile -C "$BUILD" >> "$LOG" 2>&1; then
tail -n 220 "$LOG" >&2
exit 1
fi
meson install -C "$BUILD" >> "$LOG" 2>&1
LIBMPV=$BUILD/libmpv.so
test -f "$LIBMPV" || LIBMPV=$PREFIX/lib/libmpv.so
"$PROJECT_ROOT/scripts/verify-ohos-binary.sh" "$LIBMPV"
"$PROJECT_ROOT/scripts/verify-libmpv-symbols.sh" "$LIBMPV"
printf 'libmpv=%s\n' "$LIBMPV"
+32
View File
@@ -0,0 +1,32 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
SOURCE=$OHOS_BUILD_ROOT/sources/openssl
BUILD=$OHOS_BUILD_ROOT/build/openssl
LOG=$OHOS_BUILD_ROOT/logs/openssl.log
JOBS=$(sysctl -n hw.ncpu)
test -f "$SOURCE/Configure" || "$PROJECT_ROOT/scripts/fetch-phase1-sources.sh"
mkdir -p "$BUILD" "$PREFIX" "$OHOS_BUILD_ROOT/logs"
cd "$BUILD"
if ! CC="$CC --target=$TARGET --sysroot=$OHOS_SYSROOT -D__MUSL__ -fPIC" \
CXX="$CXX --target=$TARGET --sysroot=$OHOS_SYSROOT -D__MUSL__ -fPIC" \
AR="$AR" RANLIB="$RANLIB" \
perl "$SOURCE/Configure" linux-aarch64 \
no-shared no-tests no-apps no-docs no-module \
--prefix="$PREFIX" --openssldir=/etc/ssl --libdir=lib > "$LOG" 2>&1; then
tail -n 140 "$LOG" >&2
exit 1
fi
if ! make -j"$JOBS" >> "$LOG" 2>&1; then
tail -n 180 "$LOG" >&2
exit 1
fi
make install_sw >> "$LOG" 2>&1
"$PROJECT_ROOT/scripts/verify-static-archive.sh" "$PREFIX/lib/libcrypto.a" "$PREFIX/lib/libssl.a"
"$PKG_CONFIG" --modversion openssl
+33
View File
@@ -0,0 +1,33 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
SOURCE_ROOT=$OHOS_BUILD_ROOT/sources
mkdir -p "$SOURCE_ROOT"
fetch_ref()
{
name=$1
repository=$2
reference=$3
destination=$SOURCE_ROOT/$name
if test ! -d "$destination/.git"; then
mkdir -p "$destination"
git -C "$destination" init
git -C "$destination" remote add origin "$repository"
fi
git -C "$destination" fetch --depth 1 origin "$reference"
git -C "$destination" checkout --detach FETCH_HEAD
printf '%-12s %s %s\n' "$name" "$(git -C "$destination" rev-parse HEAD)" "$(git -C "$destination" describe --tags --always)"
}
fetch_ref openssl https://github.com/openssl/openssl.git openssl-3.6.4
fetch_ref ffmpeg https://git.ffmpeg.org/ffmpeg.git 3acec0a1af2dda0a0838689b8b8649e7deb080a0
fetch_ref freetype https://github.com/freetype/freetype.git VER-2-14-3
fetch_ref fribidi https://github.com/fribidi/fribidi.git v1.0.16
fetch_ref harfbuzz https://github.com/harfbuzz/harfbuzz.git 14.4.0
fetch_ref libass https://github.com/libass/libass.git 0.17.5
fetch_ref libplacebo https://code.videolan.org/videolan/libplacebo.git v7.360.1
git -C "$SOURCE_ROOT/libplacebo" submodule update --init --depth 1
+15
View File
@@ -0,0 +1,15 @@
#!/bin/sh
set -eu
PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
PREFIX=${PREFIX:-$PROJECT_ROOT/build/ohos-arm64/prefix}
PKGCONF=$PROJECT_ROOT/build/host-tools/pkgconf/bin/pkgconf
test -x "$PKGCONF" || { printf 'pkgconf is not bootstrapped: %s\n' "$PKGCONF" >&2; exit 1; }
PKG_CONFIG_DIR= \
PKG_CONFIG_PATH= \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig:$PREFIX/share/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR= \
exec "$PKGCONF" "$@"
+22
View File
@@ -0,0 +1,22 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
PC_DIR=$PREFIX/lib/pkgconfig
mkdir -p "$PC_DIR"
printf '%s\n' \
"prefix=$OHOS_SYSROOT/usr" \
'exec_prefix=${prefix}' \
'libdir=${prefix}/lib/aarch64-linux-ohos' \
'includedir=${prefix}/include' \
'' \
'Name: zlib' \
'Description: OpenHarmony SDK zlib' \
'Version: 1.2.13' \
'Libs: -L${libdir} -lz' \
'Cflags: -I${includedir}' > "$PC_DIR/zlib.pc"
"$PKG_CONFIG" --modversion zlib
"$PKG_CONFIG" --libs --cflags zlib
+7
View File
@@ -0,0 +1,7 @@
#include <stdio.h>
int main(void)
{
puts("HarmonyOS C probe");
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
#include <cstdio>
int main()
{
std::puts("HarmonyOS C++ probe");
return 0;
}
+47
View File
@@ -0,0 +1,47 @@
#!/bin/sh
set -eu
if test -f "$(pwd)/meson.build"; then
PROJECT_ROOT=$(pwd)
else
PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
fi
DEFAULT_OHOS_SDK=/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony
OHOS_SDK=${OHOS_SDK:-$DEFAULT_OHOS_SDK}
OHOS_NATIVE=$OHOS_SDK/native
OHOS_SYSROOT=$OHOS_NATIVE/sysroot
OHOS_TOOLCHAIN=$OHOS_NATIVE/llvm/bin
OHOS_BUILD_ROOT=${OHOS_BUILD_ROOT:-$PROJECT_ROOT/build/ohos-arm64}
PREFIX=${PREFIX:-$OHOS_BUILD_ROOT/prefix}
TARGET=aarch64-linux-ohos
for path in "$OHOS_SYSROOT" "$OHOS_TOOLCHAIN/clang" "$OHOS_TOOLCHAIN/clang++" \
"$OHOS_TOOLCHAIN/llvm-ar" "$OHOS_TOOLCHAIN/llvm-ranlib" \
"$OHOS_TOOLCHAIN/llvm-strip" "$OHOS_TOOLCHAIN/llvm-readelf"; do
test -e "$path" || { printf 'Missing OHOS toolchain path: %s\n' "$path" >&2; return 1 2>/dev/null || exit 1; }
done
CC=$OHOS_TOOLCHAIN/clang
CXX=$OHOS_TOOLCHAIN/clang++
AR=$OHOS_TOOLCHAIN/llvm-ar
RANLIB=$OHOS_TOOLCHAIN/llvm-ranlib
STRIP=$OHOS_TOOLCHAIN/llvm-strip
READELF=$OHOS_TOOLCHAIN/llvm-readelf
NM=$OHOS_TOOLCHAIN/llvm-nm
PKG_CONFIG=$PROJECT_ROOT/scripts/pkg-config-ohos.sh
CROSS_FILE=$PROJECT_ROOT/toolchains/ohos-api24-arm64.ini
OHOS_COMMON_FLAGS="--target=$TARGET --sysroot=$OHOS_SYSROOT -D__MUSL__"
PATH=$PROJECT_ROOT/build/host-tools/venv/bin:$OHOS_NATIVE/build-tools/cmake/bin:$PATH
PKG_CONFIG_DIR=
PKG_CONFIG_PATH=
PKG_CONFIG_LIBDIR=$PREFIX/lib/pkgconfig:$PREFIX/share/pkgconfig
PKG_CONFIG_SYSROOT_DIR=
unset CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH LIBRARY_PATH CMAKE_PREFIX_PATH
export PROJECT_ROOT OHOS_SDK OHOS_NATIVE OHOS_SYSROOT OHOS_TOOLCHAIN
export OHOS_BUILD_ROOT PREFIX TARGET CC CXX AR RANLIB STRIP READELF NM
export PKG_CONFIG CROSS_FILE OHOS_COMMON_FLAGS PATH
export PKG_CONFIG_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR
+25
View File
@@ -0,0 +1,25 @@
#!/bin/sh
set -eu
test "$#" -eq 1 || { printf 'Usage: %s LIBMPV\n' "$0" >&2; exit 2; }
. "$(dirname -- "$0")/setup-ohos-env.sh"
LIBMPV=$1
SYMBOLS=$($NM -D --defined-only "$LIBMPV")
for symbol in \
mpv_create \
mpv_initialize \
mpv_command \
mpv_set_property \
mpv_get_property \
mpv_render_context_create \
mpv_render_context_render \
mpv_render_context_set_update_callback \
mpv_render_context_free; do
printf '%s\n' "$SYMBOLS" | grep -Eq "[[:space:]]${symbol}$" || {
printf 'Missing libmpv symbol: %s\n' "$symbol" >&2
exit 1
}
printf '%s\n' "$symbol"
done
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
set -eu
test "$#" -gt 0 || { printf 'Usage: %s FILE...\n' "$0" >&2; exit 2; }
. "$(dirname -- "$0")/setup-ohos-env.sh"
for artifact in "$@"; do
test -f "$artifact" || { printf 'Missing artifact: %s\n' "$artifact" >&2; exit 1; }
description=$(file "$artifact")
header=$($READELF -h "$artifact")
printf '%s\n%s\n' "$description" "$header"
printf '%s\n' "$description" | grep -q 'ELF 64-bit LSB'
printf '%s\n' "$header" | grep -q 'Machine:.*AArch64'
$READELF -d "$artifact" 2>/dev/null || true
done
+46
View File
@@ -0,0 +1,46 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
LIBMPV=$PREFIX/lib/libmpv.so.2.5.0
test -f "$LIBMPV" || { printf 'Missing libmpv: %s\n' "$LIBMPV" >&2; exit 1; }
archive_count=0
for archive in "$PREFIX"/lib/*.a; do
test -f "$archive" || continue
archive_count=$((archive_count + 1))
temp_dir=$(mktemp -d)
(
cd "$temp_dir"
"$AR" x "$archive"
object_count=$(find . -type f | wc -l | tr -d ' ')
machine_count=$(find . -type f -exec "$READELF" -h {} + 2>/dev/null | grep -c 'Machine:.*AArch64')
test "$object_count" -gt 0
test "$object_count" -eq "$machine_count" || {
printf 'Non-AArch64 archive member: %s (%s/%s)\n' "$archive" "$machine_count" "$object_count" >&2
exit 1
}
)
rm -r "$temp_dir"
done
test "$archive_count" -gt 0
if find "$PREFIX" -type f \( -name '*.pc' -o -name '*.cmake' -o -name '*.ninja' \) \
-exec grep -El '(^|[[:space:]])-[IL]/(opt/homebrew|usr/local)|\.dylib|[[:space:]]-framework[[:space:]]' {} + | grep -q .; then
printf 'Host library path found in target metadata\n' >&2
exit 1
fi
needed=$($READELF -d "$LIBMPV" | sed -n 's/.*Shared library: \[\([^]]*\)\].*/\1/p')
for library in $needed; do
case "$library" in
libc.so|libz.so|libnative_media_vdec.so|libnative_media_venc.so|libnative_media_codecbase.so|libnative_media_core.so|libnative_window.so) ;;
*) printf 'Unexpected dynamic dependency: %s\n' "$library" >&2; exit 1 ;;
esac
done
"$PROJECT_ROOT/scripts/verify-ohos-binary.sh" "$LIBMPV"
"$PROJECT_ROOT/scripts/verify-libmpv-symbols.sh" "$LIBMPV"
printf 'verified_archives=%s\n' "$archive_count"
printf 'dynamic_dependencies=%s\n' "$(printf '%s' "$needed" | tr '\n' ',')"
+23
View File
@@ -0,0 +1,23 @@
#!/bin/sh
set -eu
test "$#" -gt 0 || { printf 'Usage: %s ARCHIVE...\n' "$0" >&2; exit 2; }
. "$(dirname -- "$0")/setup-ohos-env.sh"
for archive in "$@"; do
test -f "$archive" || { printf 'Missing archive: %s\n' "$archive" >&2; exit 1; }
members=$($AR t "$archive")
member=$(printf '%s\n' "$members" | sed -n '1p')
test -n "$member" || { printf 'Empty archive: %s\n' "$archive" >&2; exit 1; }
temp_dir=$(mktemp -d)
(
cd "$temp_dir"
"$AR" x "$archive" "$member"
header=$($READELF -h "$member")
printf '%s: %s\n' "$archive" "$member"
printf '%s\n' "$header"
printf '%s\n' "$header" | grep -q 'Machine:.*AArch64'
)
rm -r "$temp_dir"
done
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
set -eu
. "$(dirname -- "$0")/setup-ohos-env.sh"
PROBE_DIR=$OHOS_BUILD_ROOT/probes
mkdir -p "$PROBE_DIR"
"$CC" --target="$TARGET" --sysroot="$OHOS_SYSROOT" -D__MUSL__ \
"$PROJECT_ROOT/scripts/probes/hello.c" -o "$PROBE_DIR/hello-c"
"$CXX" --target="$TARGET" --sysroot="$OHOS_SYSROOT" -D__MUSL__ \
"$PROJECT_ROOT/scripts/probes/hello.cpp" -o "$PROBE_DIR/hello-cpp"
"$PROJECT_ROOT/scripts/verify-ohos-binary.sh" "$PROBE_DIR/hello-c" "$PROBE_DIR/hello-cpp"
+31
View File
@@ -0,0 +1,31 @@
[constants]
sdk = '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native'
toolchain = sdk / 'llvm/bin'
sysroot = sdk / 'sysroot'
target_flags = ['--target=aarch64-linux-ohos', '--sysroot=' + sysroot, '-D__MUSL__']
[binaries]
c = toolchain / 'clang'
cpp = toolchain / 'clang++'
ar = toolchain / 'llvm-ar'
strip = toolchain / 'llvm-strip'
pkg-config = '@DIRNAME@/../scripts/pkg-config-ohos.sh'
cmake = sdk / 'build-tools/cmake/bin/cmake'
[built-in options]
c_args = target_flags
cpp_args = target_flags
c_link_args = target_flags
cpp_link_args = target_flags
default_library = 'static'
[properties]
needs_exe_wrapper = true
sys_root = sysroot
pkg_config_libdir = ['@DIRNAME@/../build/ohos-arm64/prefix/lib/pkgconfig', '@DIRNAME@/../build/ohos-arm64/prefix/share/pkgconfig']
[host_machine]
system = 'ohos'
cpu_family = 'aarch64'
cpu = 'armv8-a'
endian = 'little'