当然ながらzeroの能力ではRustのコンパイルには時間かかるので、クロス環境が必要です。以前Golang用のDocker(QEMU環境)では上手くいかなかった、おそらくlinkerの問題なのか、ので代替え案としてIntel MacのVMware環境でのUbuntuで環境作りました。
https://www.freecodecamp.org/news/embedded-rust-programming-on-raspberry-pi-zero-w/
を参考にしています。
いくつか修正が必要だったので、そこを記述します。
・ターゲットインストールのコマンドはtargetとaddが逆になってる
$ rustup target add arm-unknown-linux-gnueabihf configはobslete
・~/.cargo/configを使うのは古くて(obsoleteと言われる)コンパイル通らないから、.cargo/config.tomlに入れる(以下のように)てlinker対象ファイルはパスを通すかフルパスで指定
[target.arm-unknown-linux-gnueabihf]
linker = "/rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc"
・hello worldのサンプルプログラムをcargo initで作成(sampleディレクトリに)してコンパイル
fn main() {
println!("Hello, world! from Ubuntu compiler");
}
$ cargo build --release --target=arm-unknown-linux-gnueabihf
・バイナリをラズパイに転送(実行ファイルはsample/target/arm-unknown-linux-gnueabihf/release以下に存在)
$ scp release/sample pi@192.168.1.16:~/sample
・ラズパイで実行
$ ./sample
Hello, world! from Ubuntu compiler
ただし、
https://github.com/raspberrypi/tools
のページには、
These toolchains are deprecated. They are outdated and easily available from other sources (e.g. direct from Ubuntu apt). e.g.
sudo apt-get install gcc-arm-linux-gnueabihf
とあるので、このやり方の方がスマートなのかもしれない。
クロスコンパイルには他にはcrossとDockerを使うやり方もありますが、それほどのアドバンテージがあるようには思えないから当面この環境かな。
admin