Baixe os pacotes SDK aqui.
Este repositório não contém nenhum compilador ou código de biblioteca; ele usa submódulos git para extrair a árvore Clang e LLVM upstream, bem como a árvore wasi-libc.
A parte libc deste SDK é mantida em wasi-libc.
Upstream Clang e LLVM (a partir de 9.0) podem ser compilados para WASI prontos para uso, e o suporte WebAssembly está incluído neles por padrão. Portanto, tudo o que é feito aqui é fornecer compilações configuradas para definir o destino padrão e o sysroot por conveniência.
Também é possível usar uma instalação padrão do Clang, construir um sysroot a partir das fontes mencionadas acima e compilar com --target=wasm32-wasi --sysroot=/path/to/sysroot
. Nesse cenário, também seriam necessários os objetos libclang_rt.builtins-wasm32.a
disponíveis separadamente nos downloads da versão que devem ser extraídos em $CLANG_INSTALL_DIR/$CLANG_VERSION/lib/wasi/
.
Este repositório usa o submódulo git, para cloná-lo você precisa usar o comando abaixo:
git clone --recursive https://github.com/WebAssembly/wasi-sdk.git
O processo de construção do Wasm-sdk precisa de alguns pacotes:
cmake
clang
ninja
python3
Consulte a documentação do seu sistema operacional para instalar esses pacotes.
A construção wasi-sdk
usa CMake e é dividida em duas metades. Primeiro você pode construir o próprio conjunto de ferramentas:
cmake -G Ninja -B build/toolchain -S . -DWASI_SDK_BUILD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=build/install
cmake --build build/toolchain --target install
Ao desenvolver localmente, você também pode passar -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
para ajudar nas reconstruções. Outros sinalizadores CMake suportados são:
-DLLVM_CMAKE_FLAGS
- sinalizadores extras para passar para cmake
ao construir LLVM/Clang.-DRUST_TARGET
- o alvo específico do Rust triplo para construir wasm-component-ld
, útil para compilações cruzadas. O compilador clang
agora deve estar localizado em build/install/bin/clang
mas é apenas um compilador, o sysroot ainda não foi compilado. A seguir, a segunda etapa da construção é construir o 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
Um conjunto de ferramentas completo agora deve estar presente na build/install
e está pronto para uso na compilação do código WebAssembly. Os sinalizadores CMake suportados são:
-DWASI_SDK_DEBUG_PREFIX_MAKE=OFF
- desabilita -fdebug-prefix-map
ao construir código C/C++ para usar caminhos de host completos.-DWASI_SDK_INCLUDE_TESTS=ON
– usado para construir testes.-DWASI_SDK_TEST_HOST_TOOLCHAIN=ON
- teste as bibliotecas wasi-libc e sysroot do conjunto de ferramentas do host, não construa ou use bibliotecas novas para testes.-DWASI_SDK_TARGETS=..
- uma lista de alvos para construir, por padrão todos os alvos WASI são compilados.-DWASI_SDK_INSTALL_TO_CLANG_RESOURCE_DIR=ON
- instale o compiler-rt no diretório de recursos do compilador. pode ser conveniente se você quiser usar o conjunto de ferramentas (por exemplo, ./build/install/bin/clang
) no local. Se quiser construir artefatos de distribuição, você pode usar o dist
target assim:
cmake --build build/toolchain --target dist
cmake --build build/sysroot --target dist
Tarballs serão criados em build/toolchain/dist
e build/sysroot/dist
. Observe que esses são tarballs separados para o conjunto de ferramentas e o sysroot. Para criar um único tarball para todo o SDK, primeiro você deseja copiar todos os tarballs para uma nova pasta e, em seguida, executar o script ./ci/merge-artifacts.sh
:
mkdir dist-my-platform
cp build/toolchain/dist/ * build/sysroot/dist/ * dist-my-platform
./ci/merge-artifacts.sh
Isso produzirá dist/wasi-sdk-*.tar.gz
que é igual aos artefatos de lançamento deste repositório.
Finalmente, você também pode agrupar muitas das etapas acima, menos merge-artifact.sh
, usando o script CI para executar o conjunto de ferramentas e a construção do sysroot:
./ci/build.sh
O pacote compilado pode ser encontrado no diretório build/dist
. Para lançar uma nova versão do pacote no GitHub, consulte RELEASING.md.
Uma instalação típica dos binários de lançamento pode ter a seguinte aparência:
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
Use o clang instalado no diretório wasi-sdk
:
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
Nota: ${WASI_SDK_PATH}/share/wasi-sysroot
contém as inclusões/libraries/etc específicas do WASI. A opção --sysroot=...
não é necessária se WASI_SDK_PATH
for /opt/wasi-sdk
. Para solução de problemas, pode-se substituir o caminho --sysroot
por uma compilação manual do wasi-libc.
Use um arquivo de conjunto de ferramentas para configurar a plataforma wasi-sdk .
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk.cmake ...
ou a plataforma wasi-sdk-thread
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk-pthread.cmake ...
O Autoconf 2.70 agora reconhece WASI.
Para maior comodidade ao compilar pacotes que ainda não foram atualizados, os arquivos config.sub e config.guess atualizados são instalados em share/misc/config.*
no diretório de instalação.
Fornecemos uma imagem docker incluindo WASI SDK que pode ser usada para construir projetos sem uma instalação separada do SDK. Autotools, CMake e Ninja estão incluídos nesta imagem, e variáveis de ambiente padrão são configuradas para usar WASI SDK para construção.
Por exemplo, este comando pode construir um projeto baseado em make com a imagem Docker.
docker run -v `pwd`:/src -w /src ghcr.io/webassembly/wasi-sdk make
Observe as limitações notáveis abaixo ao construir projetos, por exemplo, muitos projetos precisarão que o suporte a threads seja desativado em uma etapa de configuração antes de construir com o WASI SDK.
Este repositório ainda não oferece suporte a exceções C++ . O código C++ é compatível apenas com -fno-exceptions por enquanto. O trabalho no suporte ao tratamento de exceções está em andamento no nível da linguagem que dará suporte aos recursos.
Consulte suporte C setjmp/longjmp sobre suporte setjmp/longjmp.
Este repositório oferece suporte experimental a threads com --target=wasm32-wasi-threads
. Ele usa threads primitivos do WebAssembly (atomics, wait
/ notify
, memória compartilhada) e wasi-threads para gerar threads. Nota: isto é experimental – não espere estabilidade a longo prazo!
Este repositório ainda não oferece suporte a bibliotecas dinâmicas . Embora existam alguns esforços para projetar um sistema para bibliotecas dinâmicas no wasm, ele ainda está em desenvolvimento e ainda não é utilizável de maneira geral.
Não há suporte para rede . No entanto, é um objetivo da WASI apoiar redes no futuro.