Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
f629dda
Add a wasm32-wasip3 target
alexcrichton Dec 23, 2025
c3fd350
Fix bindings target with wit-bindgen in environment
alexcrichton Jan 6, 2026
99eb715
wasip2: Improve "command" startup flow
alexcrichton Jan 7, 2026
5898236
Fix build
alexcrichton Jan 7, 2026
13502fb
Fix windows build
alexcrichton Jan 7, 2026
eaabc98
Initial work
TartanLlama Jan 8, 2026
0b14220
Reactor changes
TartanLlama Jan 9, 2026
0f7893e
Merge remote-tracking branch 'alex/better-startup' into sy/wasip3-reb…
TartanLlama Jan 9, 2026
3eb98bc
Task init work
TartanLlama Jan 13, 2026
7446601
Merge branch 'sy/wasip3-rebased' into sy/wasip3
TartanLlama Jan 13, 2026
5f34620
Remove bad change
TartanLlama Jan 13, 2026
e862c56
Remove unecessary changes
TartanLlama Jan 13, 2026
c2b32bc
Remove unecessary changes
TartanLlama Jan 13, 2026
cfcf4ff
Update bindings
TartanLlama Jan 13, 2026
91b7365
Update bindings
TartanLlama Jan 13, 2026
6457a9e
Update bindings
TartanLlama Jan 13, 2026
7156e73
Remove unecessary changes
TartanLlama Jan 13, 2026
f26cfb5
Formatting
TartanLlama Jan 13, 2026
08bfd94
Formatting
TartanLlama Jan 13, 2026
669b118
Formatting
TartanLlama Jan 13, 2026
f66008a
Formatting
TartanLlama Jan 13, 2026
a8c5c34
Formatting
TartanLlama Jan 13, 2026
e2e89e7
Update bindings
TartanLlama Jan 14, 2026
a2fd15b
Update bindings generation and WASIP3
TartanLlama Jan 14, 2026
640a4eb
Update wasip2
TartanLlama Jan 15, 2026
53391ea
Merge branch 'sy/wasip3-bindings' into sy/wasip3
TartanLlama Jan 15, 2026
d3b8d34
Bindings
TartanLlama Jan 15, 2026
de2f8bd
Use configure_file for versions
TartanLlama Jan 15, 2026
e7bb3b4
Fix target name
TartanLlama Jan 15, 2026
8ffc6f7
Correct downloading wkg
TartanLlama Jan 15, 2026
befee4d
Add comment
TartanLlama Jan 15, 2026
804b372
Change target names for wkg
TartanLlama Jan 15, 2026
89ab587
Fix wkg
TartanLlama Jan 15, 2026
8e553ac
Correct sed on mac
TartanLlama Jan 15, 2026
80dd8eb
Add defined symbol for wasip2
TartanLlama Jan 15, 2026
1ff00a0
Update symbols
TartanLlama Jan 15, 2026
4655c5d
Bump wasmtime
TartanLlama Jan 15, 2026
c92167e
Attempt to fix windows
TartanLlama Jan 15, 2026
69eb82c
Change to file download
TartanLlama Jan 15, 2026
c164b41
Add overflow checks
TartanLlama Jan 16, 2026
772668a
More CMake and clocks fixes
TartanLlama Jan 16, 2026
11c49ea
Try to fix windows
TartanLlama Jan 16, 2026
e70507c
Another try at fixing windows
TartanLlama Jan 16, 2026
e900471
Merge branch 'sy/wasip3-bindings' into sy/wasip3
TartanLlama Jan 16, 2026
ff9c6a3
More pthreads
TartanLlama Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ jobs:
- name: Setup `wasmtime`
uses: bytecodealliance/actions/wasmtime/setup@v1
with:
version: "38.0.3"
version: "40.0.2"
- name: Setup wasi-libc
run: |
cmake -S . -B build -G Ninja \
Expand Down
6 changes: 5 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ elseif(TARGET_TRIPLE MATCHES "-wasip2$")
set(SHARED ON)
elseif(TARGET_TRIPLE MATCHES "-wasip3$")
set(WASI p3)
set(SHARED ON)
# TODO: wasip3_thread_start.s also uses non-position-independent code.
set(SHARED OFF)
else()
message(FATAL_ERROR "Unknown WASI target triple: ${TARGET_TRIPLE}")
endif()
Expand All @@ -87,6 +88,9 @@ endif()
if(TARGET_TRIPLE MATCHES "-threads$")
set(THREADS ON)
add_compile_options(-mthread-model posix -pthread -ftls-model=local-exec -matomics)
elseif(TARGET_TRIPLE MATCHES "-wasip3$")
set(THREADS OFF)
add_compile_options(-mthread-model posix -pthread -ftls-model=local-exec -matomics)
else()
set(THREADS OFF)
add_compile_options(-mthread-model single)
Expand Down
66 changes: 54 additions & 12 deletions cmake/ba-download.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,23 @@ function(ba_download target repo version)
endif()

if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(os macos)
if (target STREQUAL wkg)
set(os apple-darwin)
else()
set(os macos)
endif()
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
set(os linux)
if (target STREQUAL wkg)
set(os unknown-linux-gnu)
else()
set(os linux)
endif()
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(os windows)
if (target STREQUAL wkg)
set(os pc-windows-gnu)
else()
set(os windows)
endif()
else()
set(os "UNKNOWN_OS")
message(WARNING "Unsupported system ${CMAKE_HOST_SYSTEM_NAME} for ${target}")
Expand All @@ -34,20 +46,50 @@ function(ba_download target repo version)
set(fmt tar.gz)
endif()

if (target STREQUAL wit-bindgen OR target STREQUAL wasm-tools)
if (target STREQUAL wit-bindgen OR target STREQUAL wasm-tools OR target STREQUAL wkg)
set(tag v${version})
else()
set(tag ${version})
endif()


message(STATUS "Using ${target} ${version} for ${arch}-${os} from ${repo}")

ExternalProject_Add(
${target}
EXCLUDE_FROM_ALL ON
URL "${repo}/releases/download/${tag}/${target}-${version}-${arch}-${os}.${fmt}"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
if (target STREQUAL wkg)
# wkg ships a single binary rather than an archive
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(download_name "${target}-${arch}-${os}.exe")
else()
set(download_name "${target}-${arch}-${os}")
endif()
ExternalProject_Add(
${target}
EXCLUDE_FROM_ALL ON
URL "${repo}/releases/download/${tag}/${target}-${arch}-${os}"
DOWNLOAD_NO_EXTRACT ON
DOWNLOAD_NAME ${download_name}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)

# Make the binary executable on Unix-like systems
if (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
ExternalProject_Add_Step(
${target} chmod-executable
COMMAND chmod +x <DOWNLOADED_FILE>
DEPENDEES download
DEPENDERS build
)
endif()
else()
ExternalProject_Add(
${target}
EXCLUDE_FROM_ALL ON
URL "${repo}/releases/download/${tag}/${target}-${version}-${arch}-${os}.${fmt}"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
endif()
endfunction()
202 changes: 124 additions & 78 deletions cmake/bindings.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ if (NOT BINDINGS_TARGET)
return()
endif()

include(ExternalProject)

# If `wit-bindgen` is on the system and has the right version, favor that,
# otherwise download a known good version.
find_program(WIT_BINDGEN_EXECUTABLE NAMES wit-bindgen)
Expand All @@ -15,8 +17,8 @@ if(WIT_BINDGEN_EXECUTABLE)
OUTPUT_VARIABLE WIT_BINDGEN_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)

if (NOT (WIT_BINDGEN_VERSION MATCHES "0\\.48\\.0"))
message(WARNING "wit-bindgen version 0.48.0 is required, found: ${WIT_BINDGEN_VERSION}")
if (NOT (WIT_BINDGEN_VERSION MATCHES "0\\.51\\.0"))
message(WARNING "wit-bindgen version 0.51.0 is required, found: ${WIT_BINDGEN_VERSION}")
set(WIT_BINDGEN_EXECUTABLE "")
endif()
endif()
Expand All @@ -26,7 +28,7 @@ if (NOT WIT_BINDGEN_EXECUTABLE)
ba_download(
wit-bindgen
"https://github.com/bytecodealliance/wit-bindgen"
"0.48.0"
"0.51.0"
)
ExternalProject_Get_Property(wit-bindgen SOURCE_DIR)
set(wit_bindgen "${SOURCE_DIR}/wit-bindgen")
Expand All @@ -35,101 +37,139 @@ else()
set(wit_bindgen ${WIT_BINDGEN_EXECUTABLE})
endif()

include(ExternalProject)
set(p2 0.2.0)
ExternalProject_Add(
wasip2-wits
URL https://github.com/WebAssembly/wasi-cli/archive/refs/tags/v${p2}.tar.gz
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
EXCLUDE_FROM_ALL TRUE
)
ExternalProject_Get_Property(wasip2-wits SOURCE_DIR)
set(wasip2_wit_dir ${SOURCE_DIR}/wit)
# If `wkg` is on the system and has the right version, favor that,
# otherwise download a known good version.
find_program(WKG_EXECUTABLE NAMES wkg)
if(WKG_EXECUTABLE)
message(STATUS "Found wkg: ${WKG_EXECUTABLE}")

execute_process(
COMMAND ${WKG_EXECUTABLE} --version
OUTPUT_VARIABLE WKG_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)

if (NOT (WKG_VERSION MATCHES "0\\.13\\.0"))
message(WARNING "wkg version 0.13.0 is required, found: ${WKG_VERSION}")
set(WKG_EXECUTABLE "")
endif()
endif()

if (NOT WKG_EXECUTABLE)
include(ba-download)
ba_download(
wkg
"https://github.com/bytecodealliance/wasm-pkg-tools"
"0.13.0"
)
ExternalProject_Get_Property(wkg DOWNLOADED_FILE)
set(wkg_bin ${DOWNLOADED_FILE})
else()
add_custom_target(wkg)
set(wkg_bin ${WKG_EXECUTABLE})
endif()

set(bottom_half "${CMAKE_SOURCE_DIR}/libc-bottom-half")

set(wasip2_wit_dir ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2/wit)
set(wasip2-version 0.2.0)
file(MAKE_DIRECTORY ${wasip2_wit_dir})
configure_file(${CMAKE_SOURCE_DIR}/wasi/wasi-libc-wasip2.wit.in ${wasip2_wit_dir}/wasi-libc-wasip2.wit)
set(wasip2_stamp ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2/.wit-fetch-stamp)
add_custom_command(
OUTPUT ${wasip2_stamp}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2
COMMAND ${wkg_bin} wit fetch
COMMAND ${CMAKE_COMMAND} -E touch ${wasip2_stamp}
WORKING_DIRECTORY ${wasip2_wit_dir}/..
DEPENDS wkg ${wasip2_wit_dir}/wasi-libc-wasip2.wit
COMMENT "Fetching WASI P2 dependencies"
)
add_custom_target(wasip2-wits DEPENDS ${wasip2_stamp})
add_custom_target(
bindings-p2
COMMAND
${wit_bindgen} c
--autodrop-borrows yes
--rename-world wasip2
--type-section-suffix __wasi_libc
--world wasi:cli/imports@${p2}
--rename wasi:clocks/monotonic-clock@${p2}=monotonic_clock
--rename wasi:clocks/wall-clock@${p2}=wall_clock
--rename wasi:filesystem/preopens@${p2}=filesystem_preopens
--rename wasi:filesystem/types@${p2}=filesystem
--rename wasi:io/error@${p2}=io_error
--rename wasi:io/poll@${p2}=poll
--rename wasi:io/streams@${p2}=streams
--rename wasi:random/insecure-seed@${p2}=random_insecure_seed
--rename wasi:random/insecure@${p2}=random_insecure
--rename wasi:random/random@${p2}=random
--rename wasi:sockets/instance-network@${p2}=instance_network
--rename wasi:sockets/ip-name-lookup@${p2}=ip_name_lookup
--rename wasi:sockets/network@${p2}=network
--rename wasi:sockets/tcp-create-socket@${p2}=tcp_create_socket
--rename wasi:sockets/tcp@${p2}=tcp
--rename wasi:sockets/udp-create-socket@${p2}=udp_create_socket
--rename wasi:sockets/udp@${p2}=udp
--rename wasi:cli/environment@${p2}=environment
--rename wasi:cli/exit@${p2}=exit
--rename wasi:cli/stdin@${p2}=stdin
--rename wasi:cli/stdout@${p2}=stdout
--rename wasi:cli/stderr@${p2}=stderr
--rename wasi:cli/terminal-input@${p2}=terminal_input
--rename wasi:cli/terminal-output@${p2}=terminal_output
--rename wasi:cli/terminal-stdin@${p2}=terminal_stdin
--rename wasi:cli/terminal-stdout@${p2}=terminal_stdout
--rename wasi:cli/terminal-stderr@${p2}=terminal_stderr
--world wasi:cli/imports@${wasip2-version}
--rename wasi:clocks/monotonic-clock@${wasip2-version}=monotonic_clock
--rename wasi:clocks/wall-clock@${wasip2-version}=wall_clock
--rename wasi:filesystem/preopens@${wasip2-version}=filesystem_preopens
--rename wasi:filesystem/types@${wasip2-version}=filesystem
--rename wasi:io/error@${wasip2-version}=io_error
--rename wasi:io/poll@${wasip2-version}=poll
--rename wasi:io/streams@${wasip2-version}=streams
--rename wasi:random/insecure-seed@${wasip2-version}=random_insecure_seed
--rename wasi:random/insecure@${wasip2-version}=random_insecure
--rename wasi:random/random@${wasip2-version}=random
--rename wasi:sockets/instance-network@${wasip2-version}=instance_network
--rename wasi:sockets/ip-name-lookup@${wasip2-version}=ip_name_lookup
--rename wasi:sockets/network@${wasip2-version}=network
--rename wasi:sockets/tcp-create-socket@${wasip2-version}=tcp_create_socket
--rename wasi:sockets/tcp@${wasip2-version}=tcp
--rename wasi:sockets/udp-create-socket@${wasip2-version}=udp_create_socket
--rename wasi:sockets/udp@${wasip2-version}=udp
--rename wasi:cli/environment@${wasip2-version}=environment
--rename wasi:cli/exit@${wasip2-version}=exit
--rename wasi:cli/stdin@${wasip2-version}=stdin
--rename wasi:cli/stdout@${wasip2-version}=stdout
--rename wasi:cli/stderr@${wasip2-version}=stderr
--rename wasi:cli/terminal-input@${wasip2-version}=terminal_input
--rename wasi:cli/terminal-output@${wasip2-version}=terminal_output
--rename wasi:cli/terminal-stdin@${wasip2-version}=terminal_stdin
--rename wasi:cli/terminal-stdout@${wasip2-version}=terminal_stdout
--rename wasi:cli/terminal-stderr@${wasip2-version}=terminal_stderr
${wasip2_wit_dir}
COMMAND cmake -E copy wasip2.h ${bottom_half}/headers/public/wasi/__generated_wasip2.h
COMMAND cmake -E copy wasip2_component_type.o ${bottom_half}/sources
COMMAND cmake -E copy wasip2.c ${bottom_half}/sources
DEPENDS wit-bindgen wasip2-wits
DEPENDS wit-bindgen wkg wasip2-wits
)

set(p3 0.3.0-rc-2025-09-16)
ExternalProject_Add(
wasip3-wits
URL https://github.com/WebAssembly/wasi-cli/archive/refs/tags/v${p3}.tar.gz
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
EXCLUDE_FROM_ALL TRUE
set(wasip3_wit_dir ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3/wit)
set(wasip3-version 0.3.0-rc-2026-01-06)
file(MAKE_DIRECTORY ${wasip3_wit_dir})
configure_file(${CMAKE_SOURCE_DIR}/wasi/wasi-libc-wasip3.wit.in ${wasip3_wit_dir}/wasi-libc-wasip3.wit)
set(wasip3_stamp ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3/.wit-fetch-stamp)
add_custom_command(
OUTPUT ${wasip3_stamp}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3
COMMAND ${wkg_bin} wit fetch
COMMAND ${CMAKE_COMMAND} -E touch ${wasip3_stamp}
WORKING_DIRECTORY ${wasip3_wit_dir}/..
DEPENDS wkg ${wasip3_wit_dir}/wasi-libc-wasip3.wit
COMMENT "Fetching WASI P3 dependencies"
)
ExternalProject_Get_Property(wasip3-wits SOURCE_DIR)
set(wasip3_wit_dir ${SOURCE_DIR}/wit-0.3.0-draft)

add_custom_target(wasip3-wits DEPENDS ${wasip3_stamp})
add_custom_target(
bindings-p3
COMMAND
${wit_bindgen} c
--generate-threading-helpers
--autodrop-borrows yes
--rename-world wasip3
--type-section-suffix __wasi_libc
--world wasi:cli/imports@${p3}
--rename wasi:clocks/monotonic-clock@${p3}=monotonic_clock
--rename wasi:clocks/wall-clock@${p3}=wall_clock
--rename wasi:filesystem/preopens@${p3}=filesystem_preopens
--rename wasi:filesystem/types@${p3}=filesystem
--rename wasi:random/insecure-seed@${p3}=random_insecure_seed
--rename wasi:random/insecure@${p3}=random_insecure
--rename wasi:random/random@${p3}=random
--rename wasi:sockets/types@${p3}=sockets
--rename wasi:sockets/ip-name-lookup@${p3}=ip_name_lookup
--rename wasi:cli/environment@${p3}=environment
--rename wasi:cli/exit@${p3}=exit
--rename wasi:cli/stdin@${p3}=stdin
--rename wasi:cli/stdout@${p3}=stdout
--rename wasi:cli/stderr@${p3}=stderr
--rename wasi:cli/terminal-input@${p3}=terminal_input
--rename wasi:cli/terminal-output@${p3}=terminal_output
--rename wasi:cli/terminal-stdin@${p3}=terminal_stdin
--rename wasi:cli/terminal-stdout@${p3}=terminal_stdout
--rename wasi:cli/terminal-stderr@${p3}=terminal_stderr
--world wasi:cli/imports@${wasip3-version}
--rename wasi:clocks/monotonic-clock@${wasip3-version}=monotonic_clock
--rename wasi:clocks/system-clock@${wasip3-version}=system_clock
--rename wasi:filesystem/preopens@${wasip3-version}=filesystem_preopens
--rename wasi:filesystem/types@${wasip3-version}=filesystem
--rename wasi:random/insecure-seed@${wasip3-version}=random_insecure_seed
--rename wasi:random/insecure@${wasip3-version}=random_insecure
--rename wasi:random/random@${wasip3-version}=random
--rename wasi:sockets/types@${wasip3-version}=sockets
--rename wasi:sockets/ip-name-lookup@${wasip3-version}=ip_name_lookup
--rename wasi:cli/environment@${wasip3-version}=environment
--rename wasi:cli/exit@${wasip3-version}=exit
--rename wasi:cli/stdin@${wasip3-version}=stdin
--rename wasi:cli/stdout@${wasip3-version}=stdout
--rename wasi:cli/stderr@${wasip3-version}=stderr
--rename wasi:cli/terminal-input@${wasip3-version}=terminal_input
--rename wasi:cli/terminal-output@${wasip3-version}=terminal_output
--rename wasi:cli/terminal-stdin@${wasip3-version}=terminal_stdin
--rename wasi:cli/terminal-stdout@${wasip3-version}=terminal_stdout
--rename wasi:cli/terminal-stderr@${wasip3-version}=terminal_stderr
${wasip3_wit_dir}
COMMAND cmake -E copy wasip3.h ${bottom_half}/headers/public/wasi/__generated_wasip3.h
COMMAND cmake -E copy wasip3_component_type.o ${bottom_half}/sources
Expand All @@ -139,12 +179,18 @@ add_custom_target(

add_custom_target(bindings DEPENDS bindings-p2 bindings-p3)

if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(SED_INPLACE_ARGS -i '')
else()
set(SED_INPLACE_ARGS -i)
endif()

function(wit_bindgen_edit p)
add_custom_target(
bindings-${p}-edit
COMMAND sed -i "" "'s_#include .wasi${p}\.h._#include \"wasi/wasi${p}.h\"_'" ${bottom_half}/sources/wasi${p}.c
COMMAND sed -i "" "s/extern void exit_exit/_Noreturn extern void exit_exit/" ${bottom_half}/headers/public/wasi/__generated_wasi${p}.h
COMMAND sed -i "" "s/extern void __wasm_import_exit_exit/_Noreturn extern void __wasm_import_exit_exit/" ${bottom_half}/sources/wasi${p}.c
COMMAND sed ${SED_INPLACE_ARGS} "'s_#include .wasi${p}\.h._#include \"wasi/wasi${p}.h\"_'" ${bottom_half}/sources/wasi${p}.c
COMMAND sed ${SED_INPLACE_ARGS} "s/extern void exit_exit/_Noreturn extern void exit_exit/" ${bottom_half}/headers/public/wasi/__generated_wasi${p}.h
COMMAND sed ${SED_INPLACE_ARGS} "s/extern void __wasm_import_exit_exit/_Noreturn extern void __wasm_import_exit_exit/" ${bottom_half}/sources/wasi${p}.c
DEPENDS bindings-${p}
)
add_dependencies(bindings bindings-${p}-edit)
Expand Down
1 change: 1 addition & 0 deletions expected/wasm32-wasip2/defined-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1504,6 +1504,7 @@ wasip2_list_u32_free
wasip2_list_u8_free
wasip2_option_string_free
wasip2_string_dup
wasip2_string_dup_n
wasip2_string_free
wasip2_string_from_c
wasip2_string_set
Expand Down
Loading