External rustler dependencies with Nerves

Hi folks.

In my project I needed a way to check to see if a process was running on the host system (mainly when MIX_TARGET=:host) so I quickly wrapped up the proclist crate with Rustler however my firmware doesn’t start complaining about missing shared libraries (basically it’s not cross-compiling it’s just lucky that my laptop and the firmware have the same arch). The main article I can find talks you through setting up a nerves project with rustler crates in-tree but it doesn’t help with rustler-based dependencies. Now in my case, since I only use this package when doing dev on my laptop, I can just disable it for all other targets, which is fine, but I think we need to figure out a way to make the increasing number of rustler-based packages work nicely in the nerves ecosystem.

What tooling do we need that is missing? I expect we’d need some changes to rustler itself - I’m happy to open and shepherd some PRs if that’s the case.

I’ve used Rustler on Nerves before, and fortunately it exposes ways to support cross compile, namely through the RUSTLER_TARGET environment variable. Cocoa has a really good guide on it here:

There’s also a :target configuration option for the Rustler package:

You might just be able to set that to the target triple on your Nerves device in your config/target.exs. But there might also be some more steps that would be required to get it to work on Nerves - it looks like Cocoa’s method explicitly sets the linker with System.get_env("CC") |> tap(&System.put_env("RUSTFLAGS", "-C linker=#{&1}")), so that might also be required

2 Likes

Thanks @gus - it took a bit of thinking for me to realise that I needed to provide all those env vars in the proclist package and not my nerves project directly. Also because I’m targeting x86_64 I needed to add --codegen target-feature=-crt-static to RUSTFLAGS. The final result is here for those who searched this up.