読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

"Gentoo Linux" の GCC 6 への移行状況

あくまでも本日現在のことですが、"Gentoo Linux"の gentoo リポジトリ(通称"Portage tree")内の GCC のパッケージは、バージョン 4.9.4 が stable の最新で、バージョン 5.4 が unstable の最新です。 したがって、 GCC 6 は通常の状態ではインストール不可になっています。

Gentoo では今も、GCC 6 をインストールしても使えるようにするための作業中のようです。 「582084 – (gcc-6) [TRACKER] sys-devel/gcc-6 porting」を見ると現時点では、未完了の案件がかなり残っています。 つまり、 GCC 6 に移行したくても、GCC 6 ではビルドに失敗するなどの支障があるパッケージが未だ多数あるということです。

Gentoo はパッケージ数が極端に多く、メンテナンスの行き届いていないパッケージが少なくありません。

よそのディストリビューションをみると、公式リポジトリ内のパッケージ数が少ないディストリビューションや、トップダウンの強権的な管理のもとにメンテナンスが強力に推し進められているディストリビューションがあります。 他方の Gentoo では、メンテナが足りないパッケージや、やる気のないメンテナや、ユーザ軽視で我流でやるメンテナもいます。 そのため、新バージョンへの移行が止まっているパッケージが出たり、パッケージの(主に ebuild ファイルの)バグがなかなか直されなかったりといったことで、ユーザが巻き込まれることがときどきあります。

ともかく、 gentoo リポジトリを見ての通り、現在移行作業中の GCC のバージョンは 6.2 です。

そしてそうこうしているうちに先日、 GCC の 6.3 が出ました。 GCC 6.2 にはいろいろとバグがあったようなので、 6.3 だとトラブルの出ないパッケージもあるかもしれません。 Gentoo は結局、 6.2 よりも 6.3 以降にland(着地)するのではないかという気がします。

そしてまたそうこうしているうちに、新機能搭載の GCC 7 が登場するでしょうから似たようなことが起こるんだろうなあと思います。

GCC のアップグレードに関しては、ディストリビューション各々、作業をし、対応をしています。 ほとんどのディストリビューションバイナリパッケージですから、各パッケージを一括で新たな GCC でビルドして齟齬がないか確かめて、そのビルド済バイナリをリリース、という処理をしているはずです。このビルド作業も、自動化しているディストリビューションがあります。

Gentoo では、Python なんかだと、互換性のないパッケージはおいておけるので、先にアップグレードをしています。 それに対して GCCBinutils 等々にしてもそうですが、どの GCC 対応だとかいう情報を各パッケージに組み込んで分けるということはしないし、したら困るでしょうから、アップグレードが後れがちです。

いうまでもないことですが、 GCC でなく Clang にしたとしても、同じ事態が起こります。そもそも GNU の標準的コンパイラGCC なのですから、 GNU/LinuxGCCコンパイルしないというのは強引でいささか無謀です。(Clang に変えたがっているのは主に BSD 系の方です。)

ちなみに、GCCGPL ライセンスを外したくてしょうがない人々が主になって Clang (clang, clang++, llvm-as など)、lld といったプログラムがつくられていっていますが、GCC に対する Clang の特徴は、昔のソースコードに非対応にすることで簡素でやや速くなっていることや、プロプライエタリ化のしやすい緩いライセンスであることなどです。

C++ のビルドが遅いからというのが建前で Clang や lld が宣伝されていますが、そもそも C++ というプログラミング言語が、プログラマが楽をして面倒はコンパイラにやらせる、数年に一度は規格を改めないと気が済まない、という困った言語です。 書くのに面倒が省けるということと、人気のあるライブラリなどのソフトウェアがまたぞろ C++ を採用しているということの相乗効果で、 C++ で書く人が多い*1です。 この C++ の規格がころころ変わることが、コンパイラのアップグレードのたびに苦労する主因だと思います。

*1:JavaC++ から派生したので JavaC++ とは似ており、書く人が比較的多い Java から C++ に流入することも一因でしょう。