使用 Emscripten 为 WebAssembly 进行交叉编译#

前提条件#

您需要按照正常的构建说明安装 CMake 和编译器等。在使用 Emscripten 构建之前,您还需要安装 Emscripten 并使用以下命令激活它(有关详细信息,请参阅 https://emscripten.webassembly.net.cn/docs/getting_started/downloads.html)。

git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
# replace <version> with the desired EMSDK version.
# e.g. for Pyodide 0.26, you need EMSDK version 3.1.58
# the versions can be found in the Makefile.envs file in the Pyodide repo:
# https://github.com/pyodide/pyodide/blob/10b484cfe427e076c929a55dc35cfff01ea8d3bc/Makefile.envs
./emsdk install <version>
./emsdk activate <version>
source ./emsdk_env.sh

如果要为 Pyodide 构建 PyArrow,您需要通过 pip 安装 pyodide-build,并使用与 Pyodide 构建的 Python 版本相同的版本以及相同版本的 emsdk 工具运行。

# install Pyodide build tools.
# e.g., for version 0.26 of Pyodide, pyodide-build 0.26 and later work
pip install "pyodide-build>=0.26"

然后使用 ninja-release-emscripten CMake 预设进行构建,如下所示

emcmake cmake --preset "ninja-release-emscripten"
ninja install

这会将构建的静态库版本 libarrow 安装到 Emscripten sysroot 缓存中,这意味着您可以构建依赖于它的东西,它们会找到 libarrow

例如,如果要为 Pyodide 构建,请运行上面的命令,然后转到 arrow/python 并运行

pyodide build

它应该创建一个针对 dist 子目录中当前启用的 Pyodide 版本的 wheel。

手动构建#

如果要手动为 Emscripten 构建,请查看 arrow/cpp 目录中的 CMakePresets.json 文件,以获取您需要覆盖的事项列表。特别是您将需要

  1. 构建依赖项设置为 BUNDLED,以便它使用正确交叉编译的构建依赖项。

  2. CMAKE_TOOLCHAIN_FILE 通过使用 emcmake cmake 而不是仅仅 cmake 来设置。

  3. 您需要将 ARROW_ENABLE_THREADING 设置为 OFF 以用于面向单线程 Emscripten 环境(例如 Pyodide)的构建。

  4. ARROW_FLIGHT 以及任何使用网络的其他内容可能无法正常工作。

  5. ARROW_JEMALLOCARROW_MIMALLOC 可能再次需要设置为 OFF

  6. 最有可能有效的是将 ARROW_BUILD_STATIC 设置为 ON 并将 ARROW_BUILD_SHARED 设置为 OFF