Problem
I'm trying to build an library with proc-macro for x86_64-unknown-linux-musl target.
When the host is x86_64-unknown-linux-gnu it can be compiled successfully.
However, when the host is x86_64-unknown-linux-gnu, Cargo outputs this error:
error: cannot produce proc-macro for `proc_macro_lib v0.1.0 (/proc-macro-lib)` as the target `x86_64-unknown-linux-musl` does not support these crate types
As I understand, there should be no difference, as the target is the same and no C libraries from the host are used.
Steps
I've created this repository to reproduce the problem using Docker.
Running
docker-compose up --build host-gnu
runs cargo build for a library with proc-macro = true with host x86_64-unknown-linux-gnu and target x86_64-unknown-linux-musl, it builds the library successfully.
However, running
docker-compose up --build host-must
outputs the error mentioned above.
Notes
Output of cargo version:
cargo 1.36.0 (c4fcfb725 2019-05-15)
Thanks for the detailed repro! I think the issue is that rustc for musl does not support dynamic linking. Proc-macros have to be dynamic libraries as they are loaded by rustc. I'm not up-to-speed on what is blocking this, but I think https://github.com/rust-lang/rust/issues/59302 is the main issue for tracking this.
One option is to use the gnu host with --target for musl.
I'm going to close this as this is a rustc issue.
In case someone else hits this page, my build worked using the flags commented at rust-lang/rust#59302
i.e.: RUSTFLAGS="-C target-feature=-crt-static"
Most helpful comment
In case someone else hits this page, my build worked using the flags commented at rust-lang/rust#59302
i.e.:
RUSTFLAGS="-C target-feature=-crt-static"