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.
Looking at 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.