Description
This is an issue that currently blocks me from porting a library to WASM:
I have a library called proj5, which I use in a backend server (in a regular Rust program). I wanted to port the library to wasm (the wasm32-unknown-unknown
target) that is now available on nightly and found it to be impossible to do it while still being able to use it in the backend:
The only way to get a WASM binary is by setting the crate-type
to "cdylib"
in the Cargo.toml file. However, if I do this, I can't use the crate in my regular rust program anymore! And if I leave it out, there is not WASM output.
So currently a crate can be compiled either for WASM or for use in a regular Rust program, not both (controlled by the target). I tried the following so far:
- Setting the crate-type in Cargo.toml
[target.'cfg(target_arch = "wasm32")']
crate-type = ["dylib"]
This doesn't work, the argument goes unused:
warning: unused manifest key: target.cfg(target_arch = "wasm32").crate-type
I also tried:
[target.wasm32-unknown-unknown]
crate-type = ["dylib"]
Same thing, same error message. The crate builds, but doesn't produce a WASM binary.
- Setting RUSTFLAGS (in the
.cargo/config
) does not seem to have any effect. I tried:
[target.wasm32-unknown-unknown]
rustflags = [ "--crate-type=cdylib" ]
This just gives a cryptic error, and sets the crate-type twice:
error: unexpected character in cfg `/`, expected parens, a comma, an identifier, or a string
No line number, no column number, nothing. Not sure where it failed - the error message could be heavily improved upon.
I also tried it with crate_type
, -- --crate-type
, --crate-type dylib
. None of which work. I expected --crate-type=dylib
to work, because it is documented this way, however I suspect that the documentation is incorrect or out of date.
- Setting the crate type in lib.rs
So the last thing I tried was to override the crate type via cfg_attr
:
// lib.rs
#![cfg_attr(target_arch = "wasm32", crate_type = "cdylib")]
This is simply ignored by cargo. I still get a .rlib
file, not a .wasm
file.
So right now I'm out of options. Why is is so hard to build a library for both regular Rust use and WASM? Right now I can only choose either-or.
There is a workaround in that I make a second crate (as cdylib
), which just exposes the first one (the rlib
), but I don't think this is the way to go. This is important for feature-gating crates so that they can be compiled to WASM without any workarounds.