FreeBSD、GCC 4.2.1でアップデート停止
FreeBSD - The Power To Serve |
FreeBSDはシステムコンパイラとツールチェーンの入れ替えを進めている。2010年5月中旬にカナダで開催されたBSDCan2010およびFreeBSD Developer Summitで、このあたりのまとまった議論と発表があった。GCCからLLVMへの移行はFreeBSDのみならず他のOSSプロジェクトでも進んでいる。FreeBSDの事例が他のプロジェクトにすべて当てはまるわけではないが、FreeBSDの場合にはどういった背景があってLLVMへの移行が決定されたのかがわかって興味深い。なお、いくつかのプロジェクトはFreeBSDと似たような理由で移行を進めている。
FreeBSDはこれまでGCCをシステムのデフォルトコンパイラとして採用してきた。強力な機能、必要とするアーキテクチャにすべて対応し、比較的高速なバイナリを出力する。FreeBSDにとってGCCは必要十分なコンパイラだったが、GCCがライセンスをGPL2からGPL3に変更した時点で状況が一転した。FreeBSDはシステムにマージされているGCCのアップグレードをGCC 4.2.1で停止し、それ以上アップグレードを実施しないことにした。GCC 4.2.1がGPL2でリリースされた最後のバージョンだ。
FreeBSDを利用する企業やユーザからGPL3になったGCCをベースシステムにマージしてほしくないという要望があり、それを受けての処置となる。GCCのみならず、GPL3のコードはFreeBSDのベースシステムにはマージしない方針になっており、今のところその方針が変更される可能性はない。
GCC 4.2.1を使い続ける問題点
しかしいつまでもGCC 4.2.1を使いつづければいいというものではなく、いくつかの問題がではじめている。問題点をまとめると次のとおり。
- アクティブなメンテナがいない
- 古いバグが残ったままになっている
- C++0Xのサポートがない
- 新しいCPUのサポートがない
GCCのバージョンをアップグレードできないということは、ツールチェーンのアップグレードもできないということになる。将来のアップグレードが見込めないとなると、別のツールへの変更が対処方法として上がってくるわけだが、ここに現れたのがLLVM Clangだ。
FreeBSDにベストフィット - LLVM Clang
そこでFreeBSD開発者の目を惹いたのがLLVM Clangだ。LLVMは2年前のBSDCan2008でFreeBSD開発者の前に現れ、多くの開発者の関心を惹いた。BSDCan2009以降は実際に対処が進められ、すでにコミット一歩手前まで対応を進めている。ClangBSDと呼ばれるLLVM Clangに対応したブランチはすでにそれなりの仕上がりを見せており、近いうちに9-CURRENTへマージされる見通しだ。
FreeBSDにとってLLVM Clangの利点は次のようなもの。
- BSDライセンス
- i386、amd64、powerpc、mips、arm、sparcなど必要になるすべてのアーキテクチャに対応
- GCCよりもコンパイル時間が短くなる
- GCCからのリプレースが現実的に実施できる
- コンパイルエラーメッセージがGCCよりも理解しやすく開発の手助けになる
- アクティブに開発されメンテナンスされている
- FreeBSDデベロッパにもアクティブなメンテナがいる
- LLVMの開発チームと良好な関係
現状での課題は次のとおり。
- i386版のboot2ビルド成果物が必要とされるサイズに収まらない
- x86におけるインラインアセンブラの対応が100%ではない
- GCC 4.2.1よりも厳密でありワーニングがまだ多く出力される
amd64は良好、i386には若干の問題あり、mipsとpowerpcは対応中、sparcも対応中で、armに対しては今のところきわだった進展なしといった状況にある。
ツールチェーンもBSDライセンスへ置き換え
LLVM Clangへの移行に合わせて、ツールチェーンを従来のGPLベースのものからBSDライセンスベースのものを開発して置き換える作業も進められている。GCC 4.2.1でアップグレードが停止したことにより、FreeBSDベースシステムで使われるツールチェーンも古くなってきているためだ。GCCのバージョンをあげることができなければ、対応するツールチェーンのバージョンもアップグレードできない。結果としてツールチェーンにもGCCの場合と同じ問題があることになり、このタイミングでの入れ替えというわけだ。
導入されることになるのはBSDライセンスで開発されるELFツールチェーンとデバッガ。nm(1)、size(1)、string(1)、c++filt(1)、addr2line(1)、readelf(1)、elfdump(1)、objcopy(1)、strip(1)などのシンプルなツールはすでに変更済み。後はas(1)やld(1)など複雑なツールの実装、libelfの改善、libdwarfの改善、libmcの導入、LLVMとの連携などが取り組まれることになる。
FreeBSD 9.0で実験対応、10.0で正式対応か
FreeBSDのビルドがLLVM Clangベースになり、そしてPorts Collectionにおけるビルドの大半をLLVM Clangにするには、まだまだ時間が必要。しかし、amd64版とi386版のカーネルとシステムのLLVM Clang対応はすぐそこまで迫ってきており、9.0での実験的な導入、10.0での正式な対応といったあたりが現実的な路線ということになりそうだ。
FreeBSDのケースでは主にライセンスが理由になっているが、コンパイル時間やコンパイルした成果物のパフォーマンスの高さなどからLLVMへ移行するOSSプロジェクトもある。FreeBSDとしてはLLVMのC++対応の改善とアセンブラ機能の改善が現在特に注目される分野であり、FreeBSDマージ後の対応性や性能改善に関与してくるものとみられる。