開発

[rust] リンカーにmoldを使う

Rustを使っていると時間がかかるのがコンパイル時間。

こちらの記事によると正確にはビルドのリンカー処理に時間がかかるようです。

ということで早速モダンなリンカーmoldを導入してみます。

sudo apt install mold
[target.'cfg(target_os = "linux")']
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
Code language: JavaScript (javascript)

ただ、moldは2021年にファーストリリースとまだ枯れていない感じなので開発時は良いかもしれませんがリリース時は標準のリンカーを使いたいです。

cfg()でなんとか条件を付けてできないかと模索してみました。

.cargo/config.tomlで使えるパラメータはどうやらここに書かれているパラメータのみらしいです。わかりやすいのはrustc –print=cfgで出力されるパラメータです。

この中でdebug_assertionsが開発環境だけのパラメータになりそうなので

[target.'cfg(all(debug_assertions, target_os = "linux"))']
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
Code language: JavaScript (javascript)

のように書いてもNG。

何故なのかと、調べてみると既にIssueが上がっていました。(同じようなことを考えていますね)

また、文脈的にちょっと違うかもしれませんがCargo Bookに、

The same applies to cfg(debug_assertions), cfg(test) and cfg(proc_macro). These values will not work as expected and will always have the default value returned by rustc –print=cfg. There is currently no way to add dependencies based on these configuration values.

とありました。

しかし、希望はあります。

Unstable FeaturesとしてProfile rustflags optionというものがあり、Cargo.tomlに

cargo-features = ["profile-rustflags"]

[package]
# ...

[profile.dev]
rustflags = [ "-C", "..." ]
Code language: PHP (php)

あるいは、.cargo/config.tomlに

# .cargo/config.toml
[unstable]
profile-rustflags = true

[profile.dev]
rustflags = [ "-C", "..." ]
Code language: PHP (php)

とすればnightlyなRustでプロファイル別にリンカーを変更できるかもしれません。(試してません)

単にコマンドラインから呼び出せばすむのでそれほど問題ないですが。

mold -run cargo build

さらに高速なリンカー

moldよりもwildというリンカーがさらに早いらしいです。こちらはRust製です。

Zedのビルドでも使えるようです。

管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago