Clang/LLVM 3.3 の導入

プーシキン見出語コンコーダンスプログラム Конкорданс к тексту А. С. Пушкина の Web 画面作成では Wt C++ Web Toolkit を利用している。ちょっとある事情でこれの新しいバージョン Wt 3.3.3 にアップグレードすることにした。ところが,サーバ機 FreeBSD 9.2-RELEASE で gcc 4.2.1 C/C++ コンパイラを用いて Wt ライブラリをビルドしようとしたらエラーが出た。

[ 66%] Building CXX object src/CMakeFiles/wt.dir/Wt/Render/CssParser.o
CC: Internal error: Killed: 9 (program cc1plus)
Please submit a full bug report.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
gmake[2]: *** [src/CMakeFiles/wt.dir/Wt/Render/CssParser.o] エラー 1
gmake[1]: *** [src/CMakeFiles/wt.dir/all] エラー 2
gmake: *** [all] エラー 2

“Internal error”,コンパイラのバグレポートを送れ,なんてのはあんまり見ない gcc エラーである。FreeBSD 9.2-RELEASE の標準的な C/C++ コンパイラはいまだに gcc (GNU C/C++) version 4.2.1 である。これには,gcc は version 4.4 以降,ソフトウェア特許を否定する GPLv3 (GNU General Public License version 3) に準拠するようになって,IT ビジネス界から忌避されるようになりつつある,そういう事情がある。

GPLv3 ライセンスは,これに準拠する限り,産業財産権で保護したいコードであろうとソースコード含め無償で配布しなければならない,という,いささかアナーキーな条件をもつ。GPLv3 準拠の gcc 及びそのライブラリでコンパイル・リンクしたプログラムは GPLv3 リソースを抱えることになり,GPLv3 準拠を理由にソースコードを公開しなければならなくなる法的リスクを負うとしたら,ソフトウェアの独自性でメシを食う IT 企業にとって死活問題になりかねない。FreeBSD 10 では,とうとう gcc を捨て去り,Clang/LLVM C/C++ コンパイラを正式採用するようになった。Clang は,より商業的活用のしやすいイリノイ大学/NCSA オープンソース・ライセンス (University of Illinois/NCSA Open Source License) に準拠したオープンソースソフトウェアである。

ちょっと前置きが長くなってしまったが,“Internal error” に遭遇して,「うちの環境も Clang/LLVM C/C++ コンパイラに移行すべきなんだろうか?」などという思いに至り,Clang を試してみることにしたのである。

Clang(クラン,と発音するようである)は 米国 Apple と Google が肩入れして凄い速度で開発が進んでいる C/C++ コンパイラである。Mac OS X では,当然ながら,その開発用ツールである Xcode の C/C++ コンパイラは Clang 製品 Objective C++ になっている。自宅の FreeBSD には,ports によって clang35 をインストールした。この ports は Clang/LLVM 3.3 であり,C++11 標準に準拠したバージョンである。

# cd /usr/ports/lang/clang35 && make install clean
# rehash
# clang --version
FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610
Target: i386-unknown-freebsd9.2
Thread model: posix

さて,clang を用いて再度 Wt-3.3.3 のビルドを試みる。コンパイルはうまく通りました。

% tar zxvf ~/tmp/wt-3.3.3.tar.gz -C ~/var
% cd ~/var/wt-3.3.3
% mkdir -p build
% cd build
% env CC=clang CXX=clang++ CPP=clang-cpp cmake \
  -DBOOST_DIR=/usr/local -DCMAKE_INSTALL_PREFIX=/usr/local ../
% gmake
% sudo gmake install

cmake の実行環境変数 CC (C コンパイラ),CXX (C++ コンパイラ),CPP (プリプロセッサ) に対し,clang プログラムを指示することにより,標準だと gcc が使われるところを書き換えている。

ports で make するときにも clang を使うようにするには,/etc/make.conf に以下を書き加えておく。

CC=clang
CXX=clang++
CPP=clang-cpp

それにしても C++ コンパイラを指す変数が CXX ってのは,C++ をかしげた恰好で,いつもながらの UNIX 流のジョークか。