여기에서 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
로 컴파일할 수도 있습니다. 이 시나리오에서는 $CLANG_INSTALL_DIR/$CLANG_VERSION/lib/wasi/
로 추출해야 하는 릴리스 다운로드에서 별도로 사용할 수 있는 libclang_rt.builtins-wasm32.a
개체도 필요합니다.
이 저장소는 git 하위 모듈을 사용하므로 이를 복제하려면 아래 명령을 사용해야 합니다.
git clone --recursive https://github.com/WebAssembly/wasi-sdk.git
Wasm-sdk의 빌드 프로세스에는 일부 패키지가 필요합니다.
cmake
clang
ninja
python3
해당 패키지를 설치하려면 OS 설명서를 참조하세요.
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
- 컴파일러의 리소스 디렉터리에 컴파일러-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에 대한 단일 타르볼을 만들려면 먼저 모든 타르볼을 새 폴더에 복사한 다음 ./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
생성됩니다.
마지막으로 툴체인과 sysroot 빌드를 모두 수행하는 CI 스크립트를 사용하여 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.*
에 설치됩니다.
별도의 SDK 설치 없이 프로젝트 구축에 사용할 수 있는 WASI SDK가 포함된 도커 이미지를 제공합니다. 이 이미지에는 Autotools, CMake, Ninja가 포함되어 있으며 표준 환경 변수는 WASI SDK를 사용하여 빌드하도록 설정되어 있습니다.
예를 들어 이 명령은 Docker 이미지를 사용하여 make 기반 프로젝트를 빌드할 수 있습니다.
docker run -v `pwd`:/src -w /src ghcr.io/webassembly/wasi-sdk make
프로젝트를 빌드할 때 아래의 주목할만한 제한 사항에 유의하세요. 예를 들어 많은 프로젝트에서는 WASI SDK로 빌드하기 전에 구성 단계에서 스레드 지원을 비활성화해야 합니다.
이 저장소는 아직 C++ 예외를 지원하지 않습니다. C++ 코드는 현재 -fno-Exceptions에서만 지원됩니다. 해당 기능을 지원할 언어 수준에서 예외 처리 지원 작업이 진행 중입니다.
setjmp/longjmp 지원에 대해서는 C setjmp/longjmp 지원을 참조하세요.
이 저장소는 --target=wasm32-wasi-threads
사용하여 스레드를 실험적으로 지원합니다. WebAssembly의 스레드 프리미티브(atomics, wait
/ notify
, 공유 메모리)와 wasi-thread를 사용하여 스레드를 생성합니다. 참고: 이는 실험적입니다. 장기적인 안정성을 기대하지 마세요!
이 저장소는 아직 동적 라이브러리를 지원하지 않습니다. wasm에서 동적 라이브러리를 위한 시스템을 설계하려는 노력이 일부 있지만 아직 개발 중이며 아직 일반적으로 사용할 수는 없습니다.
네트워킹은 지원되지 않습니다. 하지만 미래에는 네트워킹을 지원하는 것이 WASI의 목표입니다.