Compiling musl target for the gnu toolchain, for my platform

Here is what I want to do, in tl;dr form: I wish to compile '$platform-linux-musl std` etc for my stable toolchain, which is only platform-...-linux-gnu on my platform. This is partly a learning exercise. I receive an error that indicates rust built its own compiler and I didn't really want that.

So. Suppose I installed the stable toolchain for my platform, which lives at $RUSTUP_HOME/toolchains/stable-x86_64-unknown-linux-gnu/, and then I added a target using this compiler, specifically the musl one, which now lives at: $RUSTUP_HOME/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-musl/. This is all well and good on x86, everything works.

Now suppose that I am not on x86, but it seems that the compiler has definitions for musl on my platform. I would like static CRT linking here also. Suppose then that I have a working musl-gcc from my linux distribution, a working static libc I can use, and a copy of the Rust source. I cannot, as I have alluded, use rustup, since it does not provide my architecture's -musl target. Suppose also that I am curious and even if it did I am interested in how this is actually done, even for x86. Suppose also that I would prefer not to use an outdated docker container from github that was last updated in 201x.

Well, I'm a relatively smart cookie. I have the rust source, checked out at the tag I want, submodules and friends available. So I looked at the rustc dev guide on adding targets and it seems to suggest I want to say something like this:

DESTDIR=../stdlibstage1/ \
./ install -i --stage 1 --host $(uname -m)-unknown-linux-gnu --target $(uname -m)-unknown-linux-musl \
compiler/rustc library/std

What it doesn't document is that I might need to use config.toml. So I set my options based on a bit of googling and also looking at the CI of the rust project itself:

# Includes one of the default files in src/bootstrap/defaults
profile = "codegen"
changelog-seen = 2

cargo = "path/to/cargo"
rustc = "path/to/rustc"
rustfmt = "path/to/rustfmt"

[target.$(uname -m)-unknown-linux-musl]
crt-static = true
musl-root = "/usr/$(uname -m)-linux-musl/"

Substituting $(uname -m) provides correct paths on my distro.

This actually produces a working artefact, after a fashion! I can copy its components file and other parts into my rustup setup and cargo will pick them up. However, I then get an error:

error[E0514]: found crate `std` compiled by an incompatible version of rustc
  = help: please recompile that crate using this compiler (rustc 1.63.0 (4b91a6ea7 2022-08-08)) (consider running `cargo clean` first)

compiling a hello world with cargo build --target="$(uname -m)-unknown-linux-musl".

My question is: I think I asked in my config.toml that the platform rust should be used. It didn't seem to be picked up. What gives?

I've asked this here rather than internals because I am really just a user of Rust, rather than a developer per se. I can ask it there if it is more suitable (if so, even better if someone has the power to move it).

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.