使用 Emscripten 為 WebAssembly 進行交叉編譯#

先決條件#

您需要依照正常的建置指示安裝 CMake 和編譯器等。在使用 Emscripten 建置之前,您還需要安裝 Emscripten 並使用以下命令啟用它(詳情請參閱 https://emscripten.dev.org.tw/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. 使用 emcmake cmake 而不是僅使用 cmake 來設定 CMAKE_TOOLCHAIN_FILE

  3. 對於目標為單執行緒 Emscripten 環境(例如 Pyodide)的建置,您需要將 ARROW_ENABLE_THREADING 設定為 OFF

  4. ARROW_FLIGHT 和任何其他使用網路的功能可能無法運作。

  5. ARROW_JEMALLOCARROW_MIMALLOC 可能也需要設定為 OFF

  6. 最有可能運作的方式是將 ARROW_BUILD_STATIC 設定為 ON,並將 ARROW_BUILD_SHARED 設定為 OFF