Files
ecoarkpywhl/experiments
root 553b83953c
Some checks failed
EcoArk Wheel Pipeline CI / build (push) Failing after 1m41s
feat: add manifest-driven batch rebuild, numpy cross-compilation, and CI pipeline updates
- Add pipeline/manifest.py for packages.txt parsing
- Implement real numpy cross-compilation (rebuild.py) with OHOS NDK + vendored meson
- Extend CLI with --manifest, --build-from-source, --stage-integration modes
- Add recipes/, experiments/, and scripts/ for integration staging and artifact upload
- Update CI workflow with manifest validation, artifact upload, and release publishing
- Update Makefile and README with new targets and documentation
2026-05-13 14:16:24 +08:00
..

NumPy 真实重编实验记录

实验目标

验证在 x86_64 主机上,使用 OHOS NDK 交叉编译器,为 aarch64-linux-ohos (HarmonyOS arm64-v8a) 目标编译 NumPy 1.26.4 完整 native 扩展的真实阻塞点。

实验环境

  • 主机: x86_64 Debian forky/sid, Python 3.12.13
  • OHOS NDK: /home/program/tools/command-line-tools/sdk/default/openharmony/native/llvm
    • clang 15.0.4, target aarch64-linux-ohos
    • sysroot 包含 musl libc + crt 启动文件
    • 链接器: ld.lld 15.0.4
  • Python 3.12 交叉编译产物 (来自 EcoArk): /home/program/EcoArk/sdk/pythonrunner/src/main/cpp/third_party/python/

实验方法

  1. pip 创建 venv安装 Cython 0.29.36 + meson-python 0.15.0 + ninja + setuptools
  2. 下载 numpy 1.26.4 sdist
  3. 使用 numpy 自带的 vendored-meson含自定义 features 模块)
  4. 编写 OHOS aarch64 meson cross-compilation file
  5. 执行 meson setupmeson compile

结果总结

流程进度

步骤 状态 备注
NDK 交叉编译器可用性 clang --target=aarch64-linux-ohos 可编译 C 程序
meson setup longdouble_format=IEEE_QUAD_LE 绕过目标不可执行的问题
meson compile 195 个 target 全部通过,产出 19 个 .so
产物的正确性 全部 19 个 .so 均为 ARM aarch64 ELF
so 动态链接 仅依赖 libc.so (musl)

第一个真实阻塞点

numpy/core/meson.build:376 — 无法在交叉编译环境中运行测试程序

  • 原因: numpy 编译时需要运行 C 程序检测 long double 的内存布局格式IEEE_DOUBLE_LE / INTEL_EXTENDED_16_BYTES_LE / IEEE_QUAD_LE / IBM_DOUBLE_DOUBLE_LE 等)
  • 交叉编译时跨架构二进制无法在 build machine 运行
  • 解决: 在 cross file 的 [properties] 中预声明 longdouble_format = 'IEEE_QUAD_LE'

次要阻塞点

阻塞点 位置 解决方式
Cython 0.29 依赖 distutils (Python 3.12 移除) Cython → distutils.extension pip install setuptools
meson 缺少 "features" 模块 meson_cpu/x86/meson.build:2 必须使用 numpy 自带的 vendored-meson
交叉编译时 sizeof 类检测跳过 多个 meson.build 位置 系统 meson 自动处理
OpenBLAS 未找到 numpy/core/meson.build -Dallow-noblas=true 降级

待解决(未阻塞编译,但影响最终产物)

  1. SOABI 标签修正: .so 文件名当前为 cpython-312-x86_64-linux-gnu(来自 build machine Python),需改为 cpython-312-aarch64-linux-ohos(对应目标平台的 SOABI
  2. Wheel 打包: 需将纯 Python 文件(来自 source tree与交叉编译 .so 组合为 wheel修改 tag 为 harmonyos_arm64
  3. OpenBLAS: numpy 当前使用内置 slow fallback BLASlapack_lite如需性能需交叉编译 OpenBLAS
  4. pyconfig.h 校准: 当前使用 x86_64 原生 configure 生成的 pyconfig.h需针对 aarch64-linux-ohos + musl 重新生成

最小前置依赖清单

pip install Cython>=0.29.34,<3.1 meson-python>=0.15.0,<0.16.0 ninja setuptools
# 使用 numpy vendored meson内置 features 模块)
# cross file: ohos-aarch64-cross.ini
# meson args: -Dallow-noblas=true -Ddisable-threading=true -Ddisable-optimization=true

参考命令

# 完整编译流程(已验证通过)
pip install Cython==0.29.36 meson-python==0.15.0 ninja setuptools
tar xzf numpy-1.26.4.tar.gz
cd numpy-1.26.4
# 必须用 vendored meson
python3 vendored-meson/meson/meson.py setup build \
  --cross-file ../ohos-aarch64-cross.ini \
  -Dallow-noblas=true -Ddisable-threading=true -Ddisable-optimization=true
python3 vendored-meson/meson/meson.py compile -C build -j4
# 产出在 build/numpy/ 下