さて、Ubuntuの基本的な使い方に慣れたので、さっそく環境の構築に入る。まず、GNU/Linuxに移行した最初の目的である、clangを使うことにする。Ubuntuのレポジトリにはclangはあるが、残念ながら古すぎる。面白いことをするには、SVNから最新版を引っ張ってこなければならない。
clangをコンパイルするのは非常に簡単だ。とくに珍しいツールも必要ない。比較的新しいgccとGNU makeがあればいい。テストするには、もうすこしツールが必要だ。基本的にはClang - Getting Startedに従えばよい。ただし、SVNから取得すると、デフォルトのビルドがとんでもないことになるので、このままでは使いづらい。もちろん、普通に使うことは想定してないのだから、当然といえば当然だが、clangをハックするのでもなければ、やはり使いづらい。
まず、デフォルトでは、すべてのアーキテクチャ向けのクロスコンパイルができるようになっている。また、デフォルトではデバッグビルドかつassertが有効である。そのため、clangの単一のバイナリだけで、サイズが460MBぐらいになる。なかなか壮大だ。
configureしたあとでも設定を上書きできるのだが、どうせならconfigure時に指定してしまおう。
configure --enable-optimized --enable-assertions=no --enable-targets=host-only
これで、とりあえず試してみるだけのビルドができる。
ちなみに、SSVNではllvmとclangとcompiler-rtが分離されているので、アップデートするときは、ひとつひとつsvn checkoutするより、make updateを使ったほうが便利だ。
しかしまあ、なんとLinuxでは他人の書いたソフトウェアのビルドがたやすいことよ。これがWindowsなら、まずビルドツールからしててんでバラバラなので、非常に苦労する。
そんなわけで、clangを試してみたが、まあ、特にこれと言って面白いこともなく、普通に動作する。gccも頑張っているので、clangだけがサポートしている機能といえば、非staticメンバー関数のref-qualifierしかない。
#include <iostream> #include <utility> struct X { void f() & { std::cout << "lvalue" << std::endl ;} void f() && { std::cout << "rvalue" << std::endl ; } } ; int main() { X x ; x.f() ; std::move(x).f() ; }
No comments:
Post a Comment