Laden Sie hier SDK-Pakete herunter.
Dieses Repository enthält keinen Compiler- oder Bibliothekscode selbst; Es verwendet Git-Submodule, um den Upstream-Clang- und LLVM-Baum sowie den Wasi-Libc-Baum einzubinden.
Der libc-Teil dieses SDK wird in wasi-libc verwaltet.
Upstream-Clang und LLVM (ab 9.0) können sofort für WASI kompiliert werden, und WebAssembly-Unterstützung ist standardmäßig in ihnen enthalten. Alles, was hier getan wird, besteht darin, Builds bereitzustellen, die so konfiguriert sind, dass sie der Einfachheit halber das Standardziel und Sysroot festlegen.
Man könnte auch eine Standard-Clang-Installation verwenden, ein Sysroot aus den oben genannten Quellen erstellen und mit --target=wasm32-wasi --sysroot=/path/to/sysroot
kompilieren. In diesem Szenario wären auch die libclang_rt.builtins-wasm32.a
Objekte erforderlich, die separat in den Release-Downloads verfügbar sind und nach $CLANG_INSTALL_DIR/$CLANG_VERSION/lib/wasi/
extrahiert werden müssen.
Dieses Repository verwendet das Git-Submodul. Um es zu klonen, müssen Sie den folgenden Befehl verwenden:
git clone --recursive https://github.com/WebAssembly/wasi-sdk.git
Der Build-Prozess des Wasm-sdk benötigt einige Pakete:
cmake
clang
ninja
python3
Informationen zur Installation dieser Pakete finden Sie in der Dokumentation Ihres Betriebssystems.
Die Erstellung von wasi-sdk
verwendet CMake und ist in zwei Hälften geteilt. Zuerst können Sie die Toolchain selbst erstellen:
cmake -G Ninja -B build/toolchain -S . -DWASI_SDK_BUILD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=build/install
cmake --build build/toolchain --target install
Wenn Sie lokal entwickeln, möchten Sie möglicherweise auch -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
übergeben, um bei Neuerstellungen zu helfen. Weitere unterstützte CMake-Flags sind:
-DLLVM_CMAKE_FLAGS
– zusätzliche Flags, die beim Erstellen von LLVM/Clang an cmake
übergeben werden.-DRUST_TARGET
– das spezifische Rust-Ziel-Triple, für wasm-component-ld
erstellt werden soll, nützlich für Cross-Compiles. Der clang
-Compiler sollte sich jetzt unter build/install/bin/clang
befinden, aber es ist nur ein Compiler, die Sysroot-Datei ist noch nicht erstellt. Als nächstes besteht der zweite Schritt des Builds darin, das Sysroot zu erstellen:
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
Beim build/install
sollte nun eine vollständige Toolchain vorhanden sein, die beim Kompilieren von WebAssembly-Code verwendet werden kann. Unterstützte CMake-Flags sind:
-DWASI_SDK_DEBUG_PREFIX_MAKE=OFF
– Deaktivieren Sie -fdebug-prefix-map
beim Erstellen von C/C++-Code, um stattdessen vollständige Hostpfade zu verwenden.-DWASI_SDK_INCLUDE_TESTS=ON
– wird zum Erstellen von Tests verwendet.-DWASI_SDK_TEST_HOST_TOOLCHAIN=ON
– Testen Sie die Wasi-Libc- und Sysroot-Bibliotheken der Host-Toolchain. Erstellen oder verwenden Sie keine neuen Bibliotheken für Tests.-DWASI_SDK_TARGETS=..
– eine Liste der zu erstellenden Ziele. Standardmäßig werden alle WASI-Ziele kompiliert.-DWASI_SDK_INSTALL_TO_CLANG_RESOURCE_DIR=ON
– Compiler-RT im Ressourcenverzeichnis des Compilers installieren. könnte praktisch sein, wenn Sie die Toolchain (z. B. ./build/install/bin/clang
) direkt verwenden möchten. Wenn Sie Verteilungsartefakte erstellen möchten, können Sie das dist
Ziel wie folgt verwenden:
cmake --build build/toolchain --target dist
cmake --build build/sysroot --target dist
Tarballs werden unter build/toolchain/dist
und build/sysroot/dist
erstellt. Beachten Sie, dass es sich hierbei um separate Tarballs für die Toolchain und Sysroot handelt. Um einen einzelnen Tarball für das gesamte SDK zu erstellen, müssen Sie zunächst alle Tarballs in einen neuen Ordner kopieren und dann das Skript ./ci/merge-artifacts.sh
ausführen:
mkdir dist-my-platform
cp build/toolchain/dist/ * build/sysroot/dist/ * dist-my-platform
./ci/merge-artifacts.sh
Dadurch wird dist/wasi-sdk-*.tar.gz
erstellt, das mit den Release-Artefakten für dieses Repository identisch ist.
Schließlich können Sie viele der oben genannten Schritte zusätzlich bündeln, abzüglich merge-artifact.sh
, indem Sie das CI-Skript verwenden, um sowohl die Toolchain- als auch die Sysroot-Erstellung durchzuführen:
./ci/build.sh
Das erstellte Paket befindet sich im Verzeichnis build/dist
. Informationen zur Veröffentlichung einer neuen Version des Pakets auf GitHub finden Sie unter RELEASING.md.
Eine typische Installation der Release-Binärdateien könnte wie folgt aussehen:
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
Verwenden Sie den im wasi-sdk
Verzeichnis installierten 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
Hinweis: ${WASI_SDK_PATH}/share/wasi-sysroot
enthält die WASI-spezifischen Includes/libraries/etc. Die Option --sysroot=...
ist nicht erforderlich, wenn WASI_SDK_PATH
/opt/wasi-sdk
ist. Zur Fehlerbehebung kann man den Pfad --sysroot
durch einen manuellen Build von wasi-libc ersetzen.
Verwenden Sie eine Toolchain-Datei, um die wasi-sdk -Plattform einzurichten.
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk.cmake ...
oder die wasi-sdk-thread- Plattform
$ cmake -DCMAKE_TOOLCHAIN_FILE=${WASI_SDK_PATH}/share/cmake/wasi-sdk-pthread.cmake ...
Autoconf 2.70 erkennt jetzt WASI.
Zur Vereinfachung beim Erstellen von Paketen, die noch nicht aktualisiert wurden, werden die aktualisierten Dateien config.sub und config.guess unter share/misc/config.*
im Installationsverzeichnis installiert.
Wir stellen ein Docker-Image inklusive WASI SDK zur Verfügung, das für Bauprojekte ohne separate Installation des SDK verwendet werden kann. Autotools, CMake und Ninja sind in diesem Image enthalten und Standardumgebungsvariablen sind so eingestellt, dass sie WASI SDK zum Erstellen verwenden.
Mit diesem Befehl kann beispielsweise ein Make-basiertes Projekt mit dem Docker-Image erstellt werden.
docker run -v `pwd`:/src -w /src ghcr.io/webassembly/wasi-sdk make
Beachten Sie beim Erstellen von Projekten die nachstehenden bemerkenswerten Einschränkungen. Bei vielen Projekten muss beispielsweise die Thread-Unterstützung in einem Konfigurationsschritt deaktiviert werden, bevor mit dem WASI SDK erstellt werden kann.
Dieses Repository unterstützt noch keine C++-Ausnahmen . C++-Code wird derzeit nur mit -fno-Exceptions unterstützt. Auf Sprachebene wird an der Unterstützung der Ausnahmebehandlung gearbeitet, um die Funktionen zu unterstützen.
Informationen zur Unterstützung von setjmp/longjmp finden Sie unter C setjmp/longjmp-Unterstützung.
Dieses Repository unterstützt experimentell Threads mit --target=wasm32-wasi-threads
. Es verwendet WebAssemblys Thread-Primitive (Atomics, wait
/ notify
, Shared Memory) und Wasi-Threads zum Spawnen von Threads. Hinweis: Dies ist experimentell – erwarten Sie keine Langzeitstabilität!
Dieses Repository unterstützt noch keine dynamischen Bibliotheken . Zwar gibt es einige Bemühungen, ein System für dynamische Bibliotheken in wasm zu entwerfen, es befindet sich jedoch noch in der Entwicklung und ist noch nicht allgemein verwendbar.
Es gibt keine Unterstützung für Netzwerke . Es ist jedoch ein Ziel von WASI, die Vernetzung in Zukunft zu unterstützen.