在这里下载 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 的目标是支持未来的网络。