先日、msys2とおさらばしました。Cドライブの空き容量が700MBしかなかったからです。
そしてmsys2を消したあとに気が付きます。「あれ、ウチのRustってx86_64-pc-windows-gnu
だよな」と。
案の定、-lgcc
が見つからないという旨のエラーを吐くのでした。
C++のコンパイラを入れよう
ただ、このままmsys2を使うとCドライブがもう一回死ぬだけなのは自明なので、llvm-mingwを使うことにしました。
普通のmingwでも良かったのですが、C/C++を書くときにはclangを使いたいので...。
targetを追加しよう
cargo new
してcargo run
したら、-lgcc_eh
がないと言われました。llvm-mingwを使用しているからです。gcc関連のものはclangにはないので...。
しかし、Rustにはx86_64-pc-windows-gnullvm
というtargetがあります。
これを使うことで、llvm-mingw
でも動くようになります。
rustup target add x86_64-pc-windows-gnullvm
cargo run --target=x86_64-pc-windows-gnullvm
config.toml
に書き込む方法でもOKですが、gnullvm
を使いたい場合は毎回指定しなくてはならないようです。
そして気づくtoolchainとtargetの違い
本題のtoolchain
とtarget
についてですが、toolchain
はコンパイラの話で、target
は何のバイナリを作るかです。
toolchain
自分がどんなコンパイラたちを使うか。Winだとx86_64-pc-windows-msvc
x86_64-pc-windows-gnu
があります。
toolchainによって、デフォルトのtargetが決まるようです。msvcを使った場合、明示せずにビルドした場合のtargetはmsvcになります。gnuも然り。おそらく他もそうです。
target
主にクロスコンパイル用。作業しているOSがWinでもMacでもLinuxでも、何ならAndroidでもOK。好きなデバイスへ向けたバイナリを作れます。
もし、toolchainの垣根を超えたければ、targetを指定することで行けます。
ウチのrustのtoolchainはgnuですが、gnullvmに向けてバイナリを作っています。これもある種のクロスコンパイルかもしれません。
気づいたこと
ターゲットのあるものはツールチェインもあるもんだと思ってました。
この2つを見るとだいぶ違うなって思いますね。
https://forge.rust-lang.org/infra/other-installation-methods.html
https://rust-lang.github.io/rustup-components-history/
また、どうやらtoolchainによって若干挙動が異なるようです。
Winだとgnuのほうが速いけどmsvcのほうがバイナリは小さいとか。
Linだとgnuよりmuslのほうが依存性の少ないバイナリが作れるとか?
そのあたりの情報はどこにも発信されてないっぽいので、未知の領域です。
この辺が役に立つかも。