Xargo を用いてビルドを行ってきましたが、どうやらそれは必要ではなくなり、Cargo 単独でできるようになっていたらしいです。参考サイトは以下。
ARM Cortex-M 用トリプルが追加された
stable 版も nightly 版もどちらも対応しているようです。まずは最新版にアップデートしましょう。.cargo/config
の設定項目の都合上、nightly 版で試します。
$ rustup update # rustc をアプデ
$ rustup default nightly # nightly に切り替える
$ rustup target list | grep thumb # 対応リストを見てみる
thumbv6m-none-eabi
thumbv7em-none-eabi
thumbv7em-none-eabihf
thumbv7m-none-eabi
なるほど、確かにトリプルがありますね。では今回は STM32F303 を使いたいので、thumbv7em-none-eabihf を入れることにします。
$ rustup target add thumbv7em-none-eabihf
さて、今回は出来合いの自前マイコンプロジェクトで実験してみることにします。
クローンして、中の Makefile で xargo
となっている部分を cargo
にします。
そしてビルドしましょう!
$ make
cargo build
Compiling stm32OnRust v0.1.0 (/Users/yuki/STM32OnRust)
Compiling r0 v0.2.2
Finished dev [unoptimized + debuginfo] target(s) in 4.43s
いとも簡単に終わってしまいました。噂は本当だったんですね。
lld に対応
よくわからないのですが、クロスコンパイル環境としてアツい llvm
の速いリンカ、lld
にも対応したとのこと。Mac で Homebrew な人はまず入れましょう。サイズが 1GB 超えます。
$ brew install llvm
そしてインストールディレクトリを PATH
に含ませます。バージョンの文字列は入れた時期によって異なると思いますので、自分で調べてください。
$ export PATH="/usr/local/Cellar/llvm/7.0.0/bin/:${PATH}"
$ lld --version # 実行できるか確認
lld is a generic driver.
Invoke ld.lld (Unix), ld64.lld (macOS), lld-link (Windows), wasm-lld (WebAssembly) instead
そしたら .cargo/config
の中身をこんな感じに変えちゃえばいいです。だいぶ簡単になりましたね。
[target.thumbv7em-none-eabihf]
runner = 'arm-none-eabi-gdb'
rustflags = [
"-C", "linker=lld",
"-C", "linker-flavor=ld.lld",
"-C", "link-arg=-Tsrc/layout.ld",
]
[build]
target = "thumbv7em-none-eabihf"
あとはまたしてもビルドするだけです。少し速くなりました。
$ make
cargo build
Compiling stm32OnRust v0.1.0 (/Users/yuki/STM32OnRust)
Compiling r0 v0.2.2
Finished dev [unoptimized + debuginfo] target(s) in 3.91s