2013年1月30日水曜日

FreeBSD 9.1 RELEASEでC++ 11

FreeBSD 9.1-RELEASE(以下、9.1Rと記述します)でclang++を使ってC++ 11のソースコードをビルドできるようにする方法を紹介します。

gihyo.jpの記事に新機能の一つとして「LLVM libc++/libcxxrtなど新しいC++スタック」という記載があり喜び勇んでバイナリアップグレードをしたのですが、ヘッダファイルなどが足りなくてclangでC++11のビルドができませんでした。
原因が追い切れず暫く放置してしてましたが...
今日、「FreeBSD Toolchain News」に「The New C++ Stack in 9.1」という記事に導入方法が説明されているのを発見。試してみました。

記事によると、バイナリインストールでは新しいツールチェーンはインストールされないのでソースからビルドする必要とのこと。C++98関連にちょこっとバグがあるとの記述も...。

詳細は元記事を読んで頂くとして、自分がやってみた手順を紹介します。

ソースコードの取得

FreeBSDのインストール時にlibとcontribのソースコードもインストールしている場合はこの項目は飛ばしてください。

sysinstallからソースコードを追加しようとしましたが上手くいかなかったので、Subversionでソースコードをチェックアウトしました。(Subversionはインストール済みと仮定します)

rootで以下のコマンドを実行します。
# svn co svn://svn.freebsd.org/base/releng/9.1/lib /usr/src/lib
# svn co svn://svn.freebsd.org/base/releng/9.1/contrib /usr/src/contrib

C++標準ライブラリのビルド

ソースが取得できたら、C++の標準ライブラリをビルドします。
まずは、libc++のビルドに必要となるlibcxxrtをビルド&インストールします。
# cd /usr/src/lib/libcxxrt
# make
# make install
続いて、LLVM libc++をビルド&インストールします。
# cd /usr/src/lib/libc++
# make CXX=clang++
# make install
以上で標準ライブラリのインストール完了です。

C++11のソースをビルドしてみる

標準ライブラリのインストールが完了したので、C++11のソースコードをビルドします。
以下の内容でhello.cppを作成します。
そしてビルド。
% clang++ -stdlib=libc++ -std=c++11 -o hello hello.cpp
% ./hello
Hello1
Hello2
Hello3

初期化の記述や型推論のautoを含むC++ 11のソースコードをビルドし実行することができました。
lddでダイナミックリンクするライブラリを確認すると
%  ldd hello
hello:
        libc++.so.1 => /usr/lib/libc++.so.1 (0x80081c000)
        libm.so.5 => /lib/libm.so.5 (0x800acb000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800cec000)
        libc.so.7 => /lib/libc.so.7 (0x800ef9000)
        libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x80124c000)
ちゃんとlibc++が含まれています。

これで、ベースシステムだけでC++ 11のビルドが可能になりました。


FreeBSDではGPL3のソフトウェアをベースシステムに入れないという方針のため、GCCが古くC++ 11が実用的に使えない状況でした。
なので、新機能でC++ 11対応のlibc++が使えるようになるという期待をしてアップグレードをかけたのですが...という状況でした。

本家の9.1Rのリリースノートを真面目に読めばOptionalという記載があるので、放置してた期間はガッカリし損だったようです。

0 件のコメント:

コメントを投稿