![]() Per https://github.com/WebAssembly/wasi-sdk/issues/373, LLVM's libc++ no longer allows us to enable `<fstream>` and `<filesystem>` separately -- it's both or neither. Consequently, we either need to patch libc++ to not use `statvfs`, `chmod`, etc. or add stub functions for those features to `wasi-libc`. Since we're planning to eventually support those features with WASI Preview 2 and beyond, it makes sense to do the latter. Note that since libc++ uses `DT_SOCK`, I've added a definition for it -- even though WASI Preview 1 does not define it. No Preview 1 file will ever have that type, so code that handles that type will never be reached, but defining it allows us to avoid WASI-specific patches to libc++. Related to `DT_SOCK`, I had to change the `S_IFIFO` value so it does not conflict with `S_IFSOCK`, thereby avoiding ambiguity in `__wasilibc_iftodt`. Signed-off-by: Joel Dice <joel.dice@fermyon.com> |
||
---|---|---|
.github/workflows | ||
dlmalloc | ||
emmalloc | ||
expected | ||
libc-bottom-half | ||
libc-top-half | ||
test | ||
tools/wasi-headers | ||
.gitattributes | ||
.gitignore | ||
.gitmodules | ||
CODE_OF_CONDUCT.md | ||
LICENSE | ||
LICENSE-APACHE | ||
LICENSE-APACHE-LLVM | ||
LICENSE-MIT | ||
Makefile | ||
README.md |
wasi-libc
wasi-libc
is a libc for WebAssembly programs built on top of WASI system
calls. It provides a wide array of POSIX-compatible C APIs, including support
for standard I/O, file I/O, filesystem manipulation, memory management, time,
string, environment variables, program startup, and many other APIs.
wasi-libc
is sufficiently stable and usable for many purposes, as most of the
POSIX-compatible APIs are stable, though it is continuing to evolve to better
align with wasm and WASI. For example, pthread support is experimentally
provided via the wasi-threads proposal.
Usage
The easiest way to get started with this is to use wasi-sdk, which includes a
build of wasi-libc
in its sysroot.
Building from source
To build a WASI sysroot from source, obtain a WebAssembly-supporting C compiler (currently this is only clang 10+, though we'd like to support other compilers as well), and then run:
make CC=/path/to/clang/with/wasm/support \
AR=/path/to/llvm-ar \
NM=/path/to/llvm-nm
This makes a directory called "sysroot" by default. See the top of the Makefile for customization options.
To use the sysroot, use the --sysroot=
option:
/path/to/wasm/supporting/c/compiler --sysroot=/path/to/the/newly/built/sysroot ...
to run the compiler using the newly built sysroot.
Note that Clang packages typically don't include cross-compiled builds of
compiler-rt, libcxx, or libcxxabi, for libclang_rt.builtins-wasm32.a
,
libc++.a
, or libc++abi.a
, respectively, so they may not be usable without
extra setup. This is one of the things wasi-sdk simplifies, as it includes
cross-compiled builds of compiler-rt, libc++.a
, and libc++abi.a
.
Building in pthread support
To enable pthreads support via the wasi-threads proposal, follow the above
build directions with one addition: make ... THREAD_MODEL=posix
. This creates
additional artifacts in sysroot/lib/wasm32-wasi-threads
to support --target wasm32-wasi-threads
.
Arch Linux AUR package
For Arch Linux users, there's an official wasi-libc package tracking this Git repository. You might want to install other WASI related packages as well.