Ubuntu11.4のclangでC++のコンパイルするとiostreamとかのインクルードエラーが出る件の対処まとめ

さっきの方法 は何か怖いので正しいと思える方法で対処する。
ビルドするだけなら簡単だけど、apt的に色々あると嫌なのでUbuntuらしく、むしろDebianらしく解決してみる。

dpkgの作りかたは簡単だけど、我流すぎてバージョンの扱いとかわりと雑だったのでここを参考に作法とかに従ってみた。

とりあえず必要なものをインストール。なんか必要なさそうなのもインストールしてる気がするけど気にしない。

% sudo apt-get build-dep clang
% sudo apt-get install devscripts

作業場所を作り、ソースをダウンロード。重い。

% mkdir ~/deb/clang
% cd ~/deb/clang
% apt-get source clang

作業ディレクトリに潜る。

% cd clang-2.8/debian
% debchange -i

changelogを書くことになるので、バージョンが被らないように気をつけて書く。今回はこんな感じにした。

clang (2.8-0forgcc4.5) natty; urgency=low

  * add gcc4.5 include path

 -- illness072 <illness072@yukiho>  Sat, 20 Aug 2011 23:08:03 +0900

インクルードパスがベタ書きされてる何か切ない気持ちにさせられるソースコードを編集。

% emacs clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp
--- clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp.orig	2011-08-20 22:57:03.556053522 +0900
+++ clang-2.8/tools/clang/lib/Frontend/InitHeaderSearch.cpp	2011-08-20 22:50:15.046053387 +0900
@@ -615,6 +615,11 @@
     // Debian based distros.
     // Note: these distros symlink /usr/include/c++/X.Y.Z -> X.Y
     //===------------------------------------------------------------------===//
+    // Ubuntu 11.04 "Natty Narwhal" -- gcc-4.5.2
+    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
+                                "x86_64-linux-gnu", "32", "", triple);
+    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
+                                "i486-linux-gnu", "", "64", triple);
     // Ubuntu 10.04 LTS "Lucid Lynx" -- gcc-4.4.3
     // Ubuntu 9.10 "Karmic Koala"    -- gcc-4.4.1
     // Debian 6.0 "squeeze"          -- gcc-4.4.2

あとはビルドしてインストール。ビルドすごい時間かかる。アニメ1話ぶんじゃ済まないくらい時間かかる。

% debuild -us -uc
% cd ../..
% sudo dpkg -i clang_2.8-0forgcc4.5_amd64.deb

さっきの方法で酷いシンボリックリンク作ったのならそれは消して、さっきのHelloWorldがコンパイルできるか試す。

% clang++ hello.cpp
% ./a.out
Hello, おにいちゃん!!

よし。