プーシキン見出語コンコーダンスプログラム Конкорданс к тексту А. С. Пушкина の 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/
ちょっと前置きが長くなってしまったが,“Internal error” に遭遇して,「うちの環境も Clang/LLVM C/C++ コンパイラに移行すべきなんだろうか?」などという思いに至り,Clang を試してみることにしたのである。
Clang(クラン,と発音するようである)は 米国 Apple と Google が肩入れして凄い速度で開発が進んでいる C/
# 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/
CC=clang CXX=clang++ CPP=clang-cpp
それにしても C++ コンパイラを指す変数が CXX ってのは,C++ をかしげた恰好で,いつもながらの UNIX 流のジョークか。