I’m trying to cross-compile my rust application for the freebsd target from linux. I have everything (cross compilers, cargo configurations) configured so that simple rust applications compile and run fine on the target. Unfortunately, things get complicated when my dependencies have a build dependency on cc-rs.
When I need to cross-compile, I was doing:
$ cargo build --target=x86_64-unknown-freebsd
…but with the need to build C libraries, I needed to provide the
CC binary path as well, as spelled out in the cc-rs README, so I added that to the command.
$ CC=/path/to/cc cargo build --target=86_64-unknown-freebsd
This runs for a bit, and bails out when it tries to build this dependency
running: "sh" "/home/builder/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-sys-0.1.16/src/libbacktrace/configure" "--with-pic" "--disable-multilib" "--disable-shared" "--disable-host-shared" "--host=x86_64-unknown-linux-gnu" "--build=x86_64-unknown-linux-gnu" checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for x86_64-unknown-linux-gnu-gcc... /home/builder/cross/bin/cc checking for C compiler default output file name... a.out checking whether the C compiler works... --- stderr configure: error: in '/home/builder/rust-program/target/debug/build/backtrace-sys-6e3910c5866618b7/out': configure: error: cannot run C compiled programs. If you meant to cross compile, use '--host'.
(Here’s the kicker). If I run
cargo build --target=x86_64-unknown-freebsd again without the
CC variable, it succeeds, builds a binary for me, and that binary runs successfully on the target system.
config.log, it’s clear that we’re not passing target information down to the automake/autoconf that cc-rs seems to be using, as it still seems to think that the target is
x86_64-unknown-linux-gnu. automake is compiling an
a.out program, using the cross compiler, and because it doesn’t realize the target is different, it then tries to execute
a.out and thinks that the compiler can’t make executables. I’ve tried passing
TARGET as an env variable, trying to set it in
CFLAGS, etc, to no avail.
I’ve got a workaround, but running the command twice, once with the
CC variable and then again without it, isn’t very ergonomic or helpful. I suspect there’s a flag missing that I can’t find documentation for, and I’d really love some help tracking this down.