1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今更ながらRustのtoolchainとtargetの違いに気がつく

Posted at

先日、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の違い

本題のtoolchaintargetについてですが、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のほうが依存性の少ないバイナリが作れるとか?

そのあたりの情報はどこにも発信されてないっぽいので、未知の領域です。


この辺が役に立つかも。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?