ดาวน์โหลดแพ็คเกจ SDK ที่นี่
พื้นที่เก็บข้อมูลนี้ไม่มีคอมไพเลอร์หรือโค้ดไลบรารี ใช้โมดูลย่อย git เพื่อดึงต้นน้ำ Clang และแผนผัง LLVM รวมถึงแผนผัง wasi-libc
ส่วน libc ของ SDK นี้ได้รับการดูแลในรูปแบบ wasi-libc
Upstream 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 และแบ่งออกเป็นสองซีก ขั้นแรกคุณสามารถสร้าง toolchain เองได้:
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
- แฟล็กพิเศษที่จะส่งผ่านไปยัง cmake
เมื่อสร้าง LLVM/Clang-DRUST_TARGET
- เป้าหมาย Rust เฉพาะสามเท่าเพื่อสร้าง wasm-component-ld
สำหรับ ซึ่งมีประโยชน์สำหรับคอมไพล์ข้าม ตอนนี้คอมไพเลอร์ 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
ตอนนี้ Toolchain แบบเต็มควรปรากฏเมื่อ build/install
และพร้อมสำหรับการใช้ในการคอมไพล์โค้ด WebAssembly ธง CMake ที่รองรับคือ:
-DWASI_SDK_DEBUG_PREFIX_MAKE=OFF
- ปิดการใช้งาน -fdebug-prefix-map
เมื่อสร้างโค้ด C/C++ เพื่อใช้พาธโฮสต์แบบเต็มแทน-DWASI_SDK_INCLUDE_TESTS=ON
- ใช้สำหรับการทดสอบการสร้าง-DWASI_SDK_TEST_HOST_TOOLCHAIN=ON
- ทดสอบไลบรารี wasi-libc และ sysroot ของโฮสต์ toolchain อย่าสร้างหรือใช้ไลบรารีใหม่สำหรับการทดสอบ-DWASI_SDK_TARGETS=..
- รายการเป้าหมายที่จะสร้าง ตามค่าเริ่มต้น เป้าหมาย WASI ทั้งหมดจะถูกคอมไพล์-DWASI_SDK_INSTALL_TO_CLANG_RESOURCE_DIR=ON
- ติดตั้งคอมไพเลอร์-rt ไปยังไดเร็กทอรีทรัพยากรของคอมไพเลอร์ อาจสะดวกถ้าคุณต้องการใช้ toolchain (เช่น . ./build/install/bin/clang
) แทน หากคุณต้องการสร้างส่วนการกระจาย คุณสามารถใช้ dist
target ดังนี้:
cmake --build build/toolchain --target dist
cmake --build build/sysroot --target dist
Tarballs จะถูกสร้างขึ้นภายใต้ build/toolchain/dist
และ build/sysroot/dist
โปรดทราบว่าสิ่งเหล่านี้เป็น tarball ที่แยกจากกันสำหรับ toolchain และ sysroot หากต้องการสร้าง tarball เดียวสำหรับ SDK ทั้งหมด คุณจะต้องคัดลอก 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
ซึ่งเหมือนกับส่วนการเปิดตัวสำหรับที่เก็บนี้
สุดท้าย คุณยังสามารถรวมขั้นตอนข้างต้นหลายๆ ขั้นตอนเพิ่มเติมได้ ลบ merge-artifact.sh
โดยใช้สคริปต์ CI เพื่อดำเนินการทั้ง toolchain และ sysroot build:
./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
:
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
มี include/libraries/etc เฉพาะของ WASI ตัวเลือก --sysroot=...
ไม่จำเป็นหาก WASI_SDK_PATH
คือ /opt/wasi-sdk
สำหรับการแก้ไขปัญหา เราสามารถแทนที่เส้นทาง --sysroot
ด้วยการสร้าง wasi-libc ด้วยตนเอง
ใช้ไฟล์ toolchain เพื่อตั้งค่าแพลตฟอร์ม 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 ที่สามารถใช้สำหรับการสร้างโปรเจ็กต์โดยไม่ต้องติดตั้ง SDK แยกต่างหาก Autotools, CMake และ Ninja รวมอยู่ในอิมเมจนี้ และตัวแปรสภาพแวดล้อมมาตรฐานได้รับการตั้งค่าให้ใช้ WASI SDK สำหรับการสร้าง
ตัวอย่างเช่น คำสั่งนี้สามารถสร้างโปรเจ็กต์แบบ make-based ด้วยอิมเมจ Docker
docker run -v `pwd`:/src -w /src ghcr.io/webassembly/wasi-sdk make
รับทราบข้อจำกัดที่เห็นได้ชัดเจนด้านล่างเมื่อสร้างโปรเจ็กต์ ตัวอย่างเช่น โปรเจ็กต์จำนวนมากจำเป็นต้องปิดใช้งานการรองรับเธรดในขั้นตอนการกำหนดค่าก่อนที่จะสร้างด้วย WASI SDK
พื้นที่เก็บข้อมูลนี้ยังไม่รองรับ ข้อยกเว้น C++ รหัส C++ รองรับเฉพาะ -fno-Exceptions ในตอนนี้ การทำงานเพื่อสนับสนุนการจัดการข้อยกเว้นกำลังดำเนินการในระดับภาษาซึ่งจะสนับสนุนคุณลักษณะต่างๆ
ดูการสนับสนุน C setjmp/longjmp เกี่ยวกับการสนับสนุน setjmp/longjmp
พื้นที่เก็บข้อมูลนี้สนับสนุน เธรด ด้วย --target=wasm32-wasi-threads
แบบทดลอง มันใช้เธรดดั้งเดิมของ WebAssembly (อะตอมมิก, wait
/ notify
, หน่วยความจำที่แชร์) และ wasi-threads สำหรับการวางไข่เธรด หมายเหตุ: นี่เป็นการทดลอง อย่าคาดหวังความเสถียรในระยะยาว!
พื้นที่เก็บข้อมูลนี้ยังไม่รองรับ ไลบรารีแบบไดนามิก แม้ว่าจะมีความพยายามในการออกแบบระบบสำหรับไดนามิกไลบรารี่แบบ Wasm แต่ก็ยังอยู่ในการพัฒนาและยังไม่สามารถใช้งานได้โดยทั่วไป
ไม่มีการสนับสนุนสำหรับ เครือข่าย แม้ว่า WASI จะเป็นเป้าหมายในการสนับสนุนระบบเครือข่ายในอนาคตก็ตาม