Real Arrow C++ 15.0.2 cross-compiled static for iOS arm64 with the Python
bindings (lib, _compute, _csv, _json, _fs, _feather, _hdfsio,
_parquet, _dataset, _dataset_parquet + libarrow_python.so).
Build tree: /Volumes/D/python-ios-lib/pyarrow_ios/ (Arrow checkout +
cpp/build-ios-pq + python/build-ios-pq, BUNDLED deps, static).
2026-07: originally shipped as a minimal build without the Parquet C++ component (
pyarrow.parquetwas an error-raising import shim). Rebuilt with-DARROW_PARQUET=ON -DARROW_DATASET=ON+ snappy/zstd/lz4, closing the lastdatasetsgap —.parquetread/write and partitionedpyarrow.datasetnow work on-device.
- Core
pyarrow—pa.array,pa.Table,pa.RecordBatch, schemas, chunked arrays, slicing/casts pyarrow.compute— kernels (aggregations, arithmetic, string ops)pyarrow.csv/pyarrow.json— fast readers- Arrow IPC / Feather —
pa.ipc,feather.read_table/write_feather; this is the on-disk formatdatasetsuses for its cache pyarrow.parquet—write_table/read_table/read_metadata, compression: snappy, zstd, lz4, nonepyarrow.dataset— partitioned datasets,write_dataset/dataset()(parquet + IPC formats)pandasinterop —pa.Table.from_pandas()/.to_pandas(),pd.read_parquet/to_parquetpyarrow.fs— local filesystem
| Feature | Status | Workaround |
|---|---|---|
flight / orc / cuda / gandiva |
Not built (server/GPU features) | N/A on device |
| Brotli parquet compression | Codec not built | snappy / zstd / lz4 / none |
pa.json_()-era APIs (pyarrow ≥ 21) |
This is 15.0.2 | Pin consumers accordingly (datasets 4.0.0, not 5.x) |
- Pass
-DCMAKE_SYSTEM_PROCESSOR=arm64— Arrow's SetupCxxFlags errors "Unknown system processor" underCMAKE_SYSTEM_NAME=iOSwithout it. - Thrift (parquet dep):
BOOST_ROOTis ignored byfind_pathin an iOS cross-compile (sysroot-only search) — with-DBOOST_SOURCE=BUNDLED, also append-DBoost_INCLUDE_DIR=${BOOST_ROOT}toTHRIFT_CMAKE_ARGSincmake_modules/ThirdpartyToolchain.cmake. - Static builds:
python/CMakeLists.txthardcodesarrow_{acero,dataset}_sharedforACERO_LINK_LIBS/DATASET_LINK_LIBS(upstream bug — parquet handles static correctly); patch to select_staticwhenNOT ARROW_BUILD_SHARED. - Python-side configure additionally needs
-DPython3_NumPy_INCLUDE_DIR=<venv numpy>and, forfind_dependency(ArrowAcero),-DCMAKE_FIND_ROOT_PATH= <install>(same sysroot-only-search issue as thrift). - The Cython exts come out suffixed
.cpython-314-darwin.so(host venv naming) — genuinely iOS binaries (LC_VERSION_MIN_IPHONEOS); rename to-iphoneos.sowhen copying into the bundle. All exts +libarrow_pythonmust swap together (same-build ABI). - The wheel is assembled by
pyarrow-ios-build(see dist-info WHEEL Generator).
- datasets.md — the main consumer + the shim behavior
- pandas.md