2012-03-26

clangのビルド

さて、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() ;
}

Getting Started with LLVM System
LLVM Makefile Guide

No comments: