From 75ed9dd2f4fc758932e8e5fcffb5f38ab0280e48 Mon Sep 17 00:00:00 2001 From: BoatingCloud <1759888028@qq.com> Date: Fri, 28 Aug 2026 19:08:53 +0800 Subject: [PATCH] build: complete HarmonyOS arm64 libmpv phase 1 --- .gitignore | 2 + DOCS/BUILD_ISSUES.md | 97 +++++++++++++++++ DOCS/BUILD_STRATEGY.md | 160 +++++++++------------------- DOCS/MPV_BUILD_REPORT.md | 60 +++++++++++ DOCS/PHASE1_DEPENDENCY_MATRIX.md | 40 +++++++ LICENSES/README.md | 2 +- LICENSE_AUDIT.md | 53 +++++---- MEMORY.md | 5 +- THIRD_PARTY_NOTICES.md | 19 +++- UPSTREAM.md | 22 +++- memory/2026-08-28.md | 6 ++ memory/infra.md | 3 + memory/lessons.md | 3 + memory/projects.md | 8 +- meson.build | 2 + scripts/bootstrap-host-tools.sh | 29 +++++ scripts/build-all-ohos.sh | 16 +++ scripts/build-ffmpeg-ohos.sh | 82 ++++++++++++++ scripts/build-font-stack-ohos.sh | 61 +++++++++++ scripts/build-libplacebo-ohos.sh | 36 +++++++ scripts/build-mpv-ohos.sh | 40 +++++++ scripts/build-openssl-ohos.sh | 32 ++++++ scripts/fetch-phase1-sources.sh | 33 ++++++ scripts/pkg-config-ohos.sh | 15 +++ scripts/prepare-sdk-dependencies.sh | 22 ++++ scripts/probes/hello.c | 7 ++ scripts/probes/hello.cpp | 7 ++ scripts/setup-ohos-env.sh | 47 ++++++++ scripts/verify-libmpv-symbols.sh | 25 +++++ scripts/verify-ohos-binary.sh | 16 +++ scripts/verify-ohos-prefix.sh | 46 ++++++++ scripts/verify-static-archive.sh | 23 ++++ scripts/verify-toolchain.sh | 14 +++ toolchains/ohos-api24-arm64.ini | 31 ++++++ 34 files changed, 913 insertions(+), 151 deletions(-) create mode 100644 DOCS/BUILD_ISSUES.md create mode 100644 DOCS/MPV_BUILD_REPORT.md create mode 100644 DOCS/PHASE1_DEPENDENCY_MATRIX.md create mode 100755 scripts/bootstrap-host-tools.sh create mode 100755 scripts/build-all-ohos.sh create mode 100755 scripts/build-ffmpeg-ohos.sh create mode 100755 scripts/build-font-stack-ohos.sh create mode 100755 scripts/build-libplacebo-ohos.sh create mode 100755 scripts/build-mpv-ohos.sh create mode 100755 scripts/build-openssl-ohos.sh create mode 100755 scripts/fetch-phase1-sources.sh create mode 100755 scripts/pkg-config-ohos.sh create mode 100755 scripts/prepare-sdk-dependencies.sh create mode 100644 scripts/probes/hello.c create mode 100644 scripts/probes/hello.cpp create mode 100755 scripts/setup-ohos-env.sh create mode 100755 scripts/verify-libmpv-symbols.sh create mode 100755 scripts/verify-ohos-binary.sh create mode 100755 scripts/verify-ohos-prefix.sh create mode 100755 scripts/verify-static-archive.sh create mode 100755 scripts/verify-toolchain.sh create mode 100644 toolchains/ohos-api24-arm64.ini diff --git a/.gitignore b/.gitignore index b8051922a0..aab3498028 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /subprojects/* !/subprojects/packagefiles !/subprojects/*.wrap +/build/ +.DS_Store diff --git a/DOCS/BUILD_ISSUES.md b/DOCS/BUILD_ISSUES.md new file mode 100644 index 0000000000..4e8289ee04 --- /dev/null +++ b/DOCS/BUILD_ISSUES.md @@ -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 diff --git a/DOCS/BUILD_STRATEGY.md b/DOCS/BUILD_STRATEGY.md index dbb53f9339..3d147cefc3 100644 --- a/DOCS/BUILD_STRATEGY.md +++ b/DOCS/BUILD_STRATEGY.md @@ -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 /native/sysroot -CC /native/llvm/bin/clang -CXX /native/llvm/bin/clang++ -AR /native/llvm/bin/llvm-ar -RANLIB /native/llvm/bin/llvm-ranlib -STRIP /native/llvm/bin/llvm-strip -LD /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 | `/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 语义留到后续阶段验证。 diff --git a/DOCS/MPV_BUILD_REPORT.md b/DOCS/MPV_BUILD_REPORT.md new file mode 100644 index 0000000000..2c7bc3b1d5 --- /dev/null +++ b/DOCS/MPV_BUILD_REPORT.md @@ -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 后验证。 diff --git a/DOCS/PHASE1_DEPENDENCY_MATRIX.md b/DOCS/PHASE1_DEPENDENCY_MATRIX.md new file mode 100644 index 0000000000..f7727c9d44 --- /dev/null +++ b/DOCS/PHASE1_DEPENDENCY_MATRIX.md @@ -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 输入。 diff --git a/LICENSES/README.md b/LICENSES/README.md index de30002c40..ac1ebeb000 100644 --- a/LICENSES/README.md +++ b/LICENSES/README.md @@ -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 使用。 diff --git a/LICENSE_AUDIT.md b/LICENSE_AUDIT.md index d2c7cbade1..23a1e557fa 100644 --- a/LICENSE_AUDIT.md +++ b/LICENSE_AUDIT.md @@ -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。 diff --git a/MEMORY.md b/MEMORY.md index 0889c17eb3..2818b6db4e 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -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`。 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 8244e88206..0ec6a62b4b 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -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 静态链接所需的重新链接材料。 diff --git a/UPSTREAM.md b/UPSTREAM.md index 35c2a30a57..19ffcf3910 100644 --- a/UPSTREAM.md +++ b/UPSTREAM.md @@ -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 ..harmony-port upstream/master.. ``` -基线更新必须先 `git fetch upstream`,评估后再合并或变基到 `harmony-port`,并同步更新本文件。 +基线更新必须先检查 `git log`、`git diff` 和适用的 `git range-diff`,再评估使用 merge 或 rebase,并同步更新本文件。禁止直接强制覆盖 `harmony-port`。 diff --git a/memory/2026-08-28.md b/memory/2026-08-28.md index 3fb4d176b3..440986b5fc 100644 --- a/memory/2026-08-28.md +++ b/memory/2026-08-28.md @@ -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 diff --git a/memory/infra.md b/memory/infra.md index 732920ee16..bdb9cc2f83 100644 --- a/memory/infra.md +++ b/memory/infra.md @@ -7,5 +7,8 @@ - Toolchain:`/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` diff --git a/memory/lessons.md b/memory/lessons.md index 98fefd1944..c3320195d4 100644 --- a/memory/lessons.md +++ b/memory/lessons.md @@ -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。 diff --git a/memory/projects.md b/memory/projects.md index 56a2454839..9ec68d44bb 100644 --- a/memory/projects.md +++ b/memory/projects.md @@ -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 真机首帧。 diff --git a/meson.build b/meson.build index 5a34384e42..942b3141e4 100644 --- a/meson.build +++ b/meson.build @@ -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} diff --git a/scripts/bootstrap-host-tools.sh b/scripts/bootstrap-host-tools.sh new file mode 100755 index 0000000000..3695db12b3 --- /dev/null +++ b/scripts/bootstrap-host-tools.sh @@ -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 diff --git a/scripts/build-all-ohos.sh b/scripts/build-all-ohos.sh new file mode 100755 index 0000000000..aa67c1a97e --- /dev/null +++ b/scripts/build-all-ohos.sh @@ -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" diff --git a/scripts/build-ffmpeg-ohos.sh b/scripts/build-ffmpeg-ohos.sh new file mode 100755 index 0000000000..75231a4b35 --- /dev/null +++ b/scripts/build-ffmpeg-ohos.sh @@ -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" diff --git a/scripts/build-font-stack-ohos.sh b/scripts/build-font-stack-ohos.sh new file mode 100755 index 0000000000..648671db2b --- /dev/null +++ b/scripts/build-font-stack-ohos.sh @@ -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 diff --git a/scripts/build-libplacebo-ohos.sh b/scripts/build-libplacebo-ohos.sh new file mode 100755 index 0000000000..f63ef48b82 --- /dev/null +++ b/scripts/build-libplacebo-ohos.sh @@ -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 diff --git a/scripts/build-mpv-ohos.sh b/scripts/build-mpv-ohos.sh new file mode 100755 index 0000000000..747393a3f6 --- /dev/null +++ b/scripts/build-mpv-ohos.sh @@ -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" diff --git a/scripts/build-openssl-ohos.sh b/scripts/build-openssl-ohos.sh new file mode 100755 index 0000000000..10a5fca492 --- /dev/null +++ b/scripts/build-openssl-ohos.sh @@ -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 diff --git a/scripts/fetch-phase1-sources.sh b/scripts/fetch-phase1-sources.sh new file mode 100755 index 0000000000..fc23011f54 --- /dev/null +++ b/scripts/fetch-phase1-sources.sh @@ -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 diff --git a/scripts/pkg-config-ohos.sh b/scripts/pkg-config-ohos.sh new file mode 100755 index 0000000000..95dd119ce4 --- /dev/null +++ b/scripts/pkg-config-ohos.sh @@ -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" "$@" diff --git a/scripts/prepare-sdk-dependencies.sh b/scripts/prepare-sdk-dependencies.sh new file mode 100755 index 0000000000..6a434458b7 --- /dev/null +++ b/scripts/prepare-sdk-dependencies.sh @@ -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 diff --git a/scripts/probes/hello.c b/scripts/probes/hello.c new file mode 100644 index 0000000000..ed3fa85f35 --- /dev/null +++ b/scripts/probes/hello.c @@ -0,0 +1,7 @@ +#include + +int main(void) +{ + puts("HarmonyOS C probe"); + return 0; +} diff --git a/scripts/probes/hello.cpp b/scripts/probes/hello.cpp new file mode 100644 index 0000000000..213741e21f --- /dev/null +++ b/scripts/probes/hello.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + std::puts("HarmonyOS C++ probe"); + return 0; +} diff --git a/scripts/setup-ohos-env.sh b/scripts/setup-ohos-env.sh new file mode 100755 index 0000000000..345619acff --- /dev/null +++ b/scripts/setup-ohos-env.sh @@ -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 diff --git a/scripts/verify-libmpv-symbols.sh b/scripts/verify-libmpv-symbols.sh new file mode 100755 index 0000000000..06e238405b --- /dev/null +++ b/scripts/verify-libmpv-symbols.sh @@ -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 diff --git a/scripts/verify-ohos-binary.sh b/scripts/verify-ohos-binary.sh new file mode 100755 index 0000000000..7f482d75f9 --- /dev/null +++ b/scripts/verify-ohos-binary.sh @@ -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 diff --git a/scripts/verify-ohos-prefix.sh b/scripts/verify-ohos-prefix.sh new file mode 100755 index 0000000000..4cf0c54210 --- /dev/null +++ b/scripts/verify-ohos-prefix.sh @@ -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' ',')" diff --git a/scripts/verify-static-archive.sh b/scripts/verify-static-archive.sh new file mode 100755 index 0000000000..2e3216747c --- /dev/null +++ b/scripts/verify-static-archive.sh @@ -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 diff --git a/scripts/verify-toolchain.sh b/scripts/verify-toolchain.sh new file mode 100755 index 0000000000..20d947c50d --- /dev/null +++ b/scripts/verify-toolchain.sh @@ -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" diff --git a/toolchains/ohos-api24-arm64.ini b/toolchains/ohos-api24-arm64.ini new file mode 100644 index 0000000000..bbebb00245 --- /dev/null +++ b/toolchains/ohos-api24-arm64.ini @@ -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'