在這裡下載 SDK 套件。
該存儲庫本身不包含編譯器或庫代碼;它使用 git 子模組來拉入上游 Clang 和 LLVM 樹以及 wasi-libc 樹。
此 SDK 的 libc 部分在 wasi-libc 中維護。
上游 Clang 和 LLVM(從 9.0 起)可以開箱即用地針對 WASI 進行編譯,並且預設包含 WebAssembly 支援。因此,為了方便起見,這裡所做的只是提供配置為設定預設目標和 sysroot 的建置。
也可以使用標準 Clang 安裝,從上述來源建置 sysroot,並使用--target=wasm32-wasi --sysroot=/path/to/sysroot
進行編譯。在這種情況下,也需要在發行版下載中單獨提供libclang_rt.builtins-wasm32.a
對象,必須將其提取到$CLANG_INSTALL_DIR/$CLANG_VERSION/lib/wasi/
。
此儲存庫使用 git 子模組,要複製它,您需要使用以下命令:
git clone --recursive https://github.com/WebAssembly/wasi-sdk.git
Wasm-sdk 的建置過程需要一些套件:
cmake
clang
ninja
python3
請參閱您的作業系統文件來安裝這些軟體包。
建構wasi-sdk
使用 CMake 並分為兩半。首先,您可以建立工具鏈本身:
cmake -G Ninja -B build/toolchain -S . -DWASI_SDK_BUILD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=build/install
cmake --build build/toolchain --target install
當您在本地開發時,您可能還想傳遞-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
來協助重建。其他支援的 CMake 標誌有:
-DLLVM_CMAKE_FLAGS
- 建置 LLVM/Clang 時傳遞給cmake
額外標誌。-DRUST_TARGET
- 用於建立wasm-component-ld
特定 Rust 目標三元組,對於交叉編譯很有用。 clang
編譯器現在應該位於build/install/bin/clang
但它只是一個編譯器,sysroot 尚未建置。接下來建置的第二步是建置 sysroot:
cmake -G Ninja -B build/sysroot -S .
-DCMAKE_INSTALL_PREFIX=build/install
-DCMAKE_TOOLCHAIN_FILE=build/install/share/cmake/wasi-sdk.cmake
-DCMAKE_C_COMPILER_WORKS=ON
-DCMAKE_CXX_COMPILER_WORKS=ON
cmake --build build/sysroot --target install
現在應該在build/install
時提供完整的工具鏈,並準備好用於編譯 WebAssembly 程式碼。支援的 CMake 標誌有:
-DWASI_SDK_DEBUG_PREFIX_MAKE=OFF
- 在建置 C/C++ 程式碼以使用完整主機路徑時停用-fdebug-prefix-map
。-DWASI_SDK_INCLUDE_TESTS=ON
- 用於建置測試。-DWASI_SDK_TEST_HOST_TOOLCHAIN=ON
- 測試主機工具鏈的 wasi-libc 和 sysroot 函式庫,不要建置或使用新的函式庫進行測試。-DWASI_SDK_TARGETS=..
- 要建置的目標列表,預設會編譯所有 WASI 目標。-DWASI_SDK_INSTALL_TO_CLANG_RESOURCE_DIR=ON
- 將compiler-rt安裝到編譯器的資源目錄。如果您想就地使用工具鏈(例如./build/install/bin/clang
)可能會很方便。如果您想建立分發工件,您可以使用dist
目標,如下所示:
cmake --build build/toolchain --target dist
cmake --build build/sysroot --target dist
Tarball 將在build/toolchain/dist
和build/sysroot/dist
下建立。請注意,這些是工具鏈和 sysroot 的單獨 tarball。要為整個 SDK 建立單一 tarball,您首先需要將所有 tarball 複製到新資料夾中,然後執行./ci/merge-artifacts.sh
腳本:
mkdir dist-my-platform
cp build/toolchain/dist/ * build/sysroot/dist/ * dist-my-platform
./ci/merge-artifacts.sh
這將產生dist/wasi-sdk-*.tar.gz
,它與此儲存庫的發布工件相同。
最後,您也可以透過使用 CI 腳本執行工具鍊和 sysroot 建置來捆綁上述許多步驟,減去merge-artifact.sh
:
./ci/build.sh
建置的包可以在build/dist
目錄中找到。若要在 GitHub 上發布該套件的新版本,請參閱 RELEASING.md。
發布二進位檔案的典型安裝可能如下所示:
WASI_OS=linux
WASI_ARCH=x86_64
WASI_VERSION=24
WASI_VERSION_FULL= ${WASI_VERSION} .0
wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk- ${WASI_VERSION} /wasi-sdk- ${WASI_VERSION_FULL} - ${WASI_ARCH} - ${WASI_OS} .tar.gz
tar xvf wasi-sdk- ${WASI_VERSION_FULL} - ${WASI_ARCH} - ${WASI_OS} .tar.gz
使用wasi-sdk
目錄中安裝的clang:
WASI_SDK_PATH= ` pwd ` /wasi-sdk- ${WASI_VERSION_FULL} - ${WASI_ARCH} - ${WASI_OS}
CC= " ${WASI_SDK_PATH} /bin/clang --sysroot= ${WASI_SDK_PATH} /share/wasi-sysroot "
$CC foo.c -o foo.wasm
注意: ${WASI_SDK_PATH}/share/wasi-sysroot
包含 WASI 特定的 include/libraries/etc。如果WASI_SDK_PATH
是/opt/wasi-sdk
,則不需要--sysroot=...
選項。為了進行故障排除,可以將--sysroot
路徑替換為手動建置的 wasi-libc。
使用工具鏈檔案設定wasi-sdk平台。
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk.cmake ...
或wasi-sdk-thread平台
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk-pthread.cmake ...
Autoconf 2.70 現在可以辨識 WASI。
為了方便建置尚未更新的軟體包,更新的 config.sub 和 config.guess 檔案安裝在安裝目錄中的share/misc/config.*
中。
我們提供了一個包含 WASI SDK 的 docker 映像,可用於建置項目,而無需單獨安裝 SDK。此映像中包含 Autotools、CMake 和 Ninja,且標準環境變數設定為使用 WASI SDK 進行建置。
例如,此命令可以使用 Docker 映像建立基於 make 的專案。
docker run -v `pwd`:/src -w /src ghcr.io/webassembly/wasi-sdk make
建置專案時請注意以下顯著限制,例如,許多專案需要在使用 WASI SDK 建置之前在設定步驟中停用執行緒支援。
此存儲庫尚不支援C++ 異常。目前僅支援 -fno-exceptions 的 C++ 程式碼。語言層級的異常處理支援工作正在進行中,這將支援這些功能。
有關 setjmp/longjmp 支援的信息,請參閱 C setjmp/longjmp 支援。
該存儲庫實驗性地支援帶有--target=wasm32-wasi-threads
線程。它使用 WebAssembly 的線程原語(原子、 wait
/ notify
、共享記憶體)和 wasi 線程來產生線程。注意:這是實驗性的 - 不要指望長期穩定!
該存儲庫尚不支援動態庫。雖然在 wasm 中為動態庫設計系統做出了一些努力,但它仍在開發中,尚未普遍使用。
不支援網路。不過,WASI 的目標是支持未來的網路。