最近私が追っているバグなどの話

これは Rust Language Advent Calendar 2014 の5日目の記事です。

……が、当初考えていたものを書きあげられませんでした。見切り発車で2回目の登録をしてすみません。

とはいえ、登録した以上は何かしら書こうと思い、gentoo-rust関連で私が追っているバグについての話を少々。

gentoo-rustとは何か

gentoo-rustはGentoo Linuxのoverlay[1]のひとつで、Rust関連のパッケージを扱っています。

gentoo-rustのパッケージは長い間メインリポジトリには入っていなかったのですが、gentoo-rustのものとは別に作成された同様のパッケージがメインリポジトリに導入されました。メインリポジトリとgentoo-rustで同名で内容が異なるパッケージが存在するのは好ましくないので、まずgentoo-rustに新しいパッケージを投入した後でテスト期間を経てメインリポジトリに投入するという合意ができました。現在ではgentoo-rustとメインリポジトリのパッケージはテスト中の変更を除けば同一のものです。

私はgentoo-rustの参加者の一人で、普段はこれを使ってインストールしたRustを使っています。

[1]メインのパッケージリポジトリに後乗せする追加リポジトリのこと。UbuntuのPPAのようなものだと考えておけばだいたいあってる。

システムにインストールしたLLVMとの組み合わせ

ディストリビューションのパッケージメンテナはパッケージ内に別のパッケージと重複するライブラリをバンドルすることを嫌う傾向があります。バンドルされたライブラリはシステムのライブラリをアップデートしてもそのままなので、プラグイン機構と組み合わさったときに厄介なバグを引き起こしたり、セキュリティバグの修正で手間が増えたりすることを考えればバンドルされたライブラリは避けたいところでしょう。

Gentoo Linuxでは別の問題もあります。(バイナリパッケージではなく)ソースコードからビルドするパッケージでは、システムのライブラリを使う場合に比べてバンドルされたライブラリを使う場合はビルド時間が伸びることになります。負荷をかけてハードウェアやカーネルのバグを探したい場合や他に暖房器具がない場合を除けば、ビルド時間が短くて困ることはあまりありません。そういうわけで、gentoo-rustのdev-lang/rustパッケージはデフォルトでシステムのLLVMを使うようになりました。

ところで、私がgentoo-rustに関わりはじめた頃はシステムのLLVMを使うとブートストラップの初段で失敗していました。Rustが自前で当てていたLLVMのパッチが上流にすべて取り込まれたのは3.5以降ということもあって、システムのLLVMでビルドするというのは最近まで難しいことでした。また、今でもバンドルされたLLVMを使う方がrustc開発者の間でも主流ではないかと思います。

現在、私が追っているバグのひとつは次のコードをシステムのLLVMとリンクしたrustcでコンパイルするとリンクに失敗するというものです。

use std::intrinsics::assume;

fn main() {
    unsafe {
        assume(1u == 1u);
    }
}

std::intrinsicsというのはコンパイラ内部の組み込み命令を含むモジュールで、LLVM周りの変更でいかにもおかしくなりそうだと思ってテストしたらその通りでした。

問題の箇所が絞り込めてからバグ報告しようかと思っていたのですが、忘れると良くないので今週末に報告しておきます。

Python 2かPython 3か

rustcのコードベース内ではPythonで書かれたスクリプトがいくつか使われており、中にはビルドの過程で呼び出されるものもあります。公式にはPython 2系を使うことになっています[2]。しかし、デフォルトのPythonを3系にしていてもビルドに成功したという話を聞いたのでいくつか読んでみると、Python 2系でもPython 3系でも動くようになっていたり、Python 2系でないと動かなかったり、(なぜか)Python 3系でないと動かなかったりとまちまちでした。

現状でも特に不便ではないのですが、将来を考えるとあまり良い状態ではないのでどうしたら良いか思案中です。

[2]LLVMがPython 2を使うようなので、それに合わせている。

CargoとcURLのコンパイルオプション

CargoはRustのパッケージマネージャとして今ではなくてはならない存在ですが、私の環境では外部パッケージに依存したパッケージをビルドできないバグが発生しています。

エラーメッセージによるとcURLのコンパイルオプションが原因のようで、gentoo-rust側としてはnet-misc/curlパッケージのUSEフラグを指定する、Cargo(というよりRustのcURLバインディング)側としては可能ならビルド時にオプションを確認するという対応が考えられますが、まだ原因となったコンパイルオプションを絞り込んでいる最中です。

おわりに

次回から脱稿の目処が立ってから担当に名乗りを上げます。すみませんでした。

明日は@nida_001さんの予定です。