Some checks failed
EcoArk Wheel Pipeline CI / build (push) Failing after 1m41s
- 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
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/
实验方法
- pip 创建 venv,安装 Cython 0.29.36 + meson-python 0.15.0 + ninja + setuptools
- 下载 numpy 1.26.4 sdist
- 使用 numpy 自带的 vendored-meson(含自定义 features 模块)
- 编写 OHOS aarch64 meson cross-compilation file
- 执行
meson setup→meson 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 降级 |
待解决(未阻塞编译,但影响最终产物)
- SOABI 标签修正: .so 文件名当前为
cpython-312-x86_64-linux-gnu(来自 build machine Python),需改为cpython-312-aarch64-linux-ohos(对应目标平台的 SOABI) - Wheel 打包: 需将纯 Python 文件(来自 source tree)与交叉编译 .so 组合为 wheel,修改 tag 为
harmonyos_arm64 - OpenBLAS: numpy 当前使用内置 slow fallback BLAS(lapack_lite),如需性能需交叉编译 OpenBLAS
- 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/ 下