2014年4月20日日曜日

mint16(saucy)にllvm-3.3とEmscripten-1.12.1以降を導入するtipsとfastcompについて

もくじ:

  1. llvm-3.3 --> Mint16(sausy)
  2. emscripten-fastcomp

なかみ:

[1. llvm-3.3 --> Mint16(sausy) ]

Emscriptenは1.12.0までLLVM-3.2、1.12.1以降はLLVM-3.3をバックエンドにします。

Mint16(saucy)ではllvm-3.3パッケージをaptで導入すると、/usr/bin/にllvm-ar-3.3やllvm-link-3.3などバージョン番号付きの/usr/lib/llvm-3.3/bin/のファイルへのシンボリックリンク群までは作られます。

※以下、書いてから気付いたもっと簡単な方法②: 

~/.emscripten に LLVM_ADD_VERSION = '3.3' を追記する。

参考: https://github.com/kripken/emscripten/issues/2101#issuecomment-34859570

※以下、当初書いてた方法①: 

しかし、バージョン番号なしのリンクは作られないようなので、1つ前の記事に書いたようなワンライナーなど使ってよしなにllvm-arなどバージョン番号なしで実行可能に用意します。llvm-xxx-3.3は/usr/binに22ファイル、clang-3.3パッケージもインストールしていれば+1つ(こちらはclangもパッケージで作ってくれる)。

と、ここまでで安心してem++とか試すと /usr/bin/opt がありませんですわよなどとお小言を頂く事になります。
dpkg -L llvm-3.3
これで llvm-3.3 パッケージが導入してくれるファイルの一覧が得られますので、 /usr/binに導入されるバージョン番号付きのファイルのシンボリックリンクの作り忘れに気をつけましょう。具体的には以下5つ。

  1. /usr/bin/bungpoint-3.3
  2. /usr/bin/macho-dump-3.3
  3. /usr/bin/c-index-test-3.3
  4. /usr/bin/opt-3.3
  5. /usr/bin/llc-3.3
これらもバージョン番号なしで実行可能なようにシンボリックリンクを準備します。

GNU/Linuxのファイルシステムの構成や手動でシンボリックリンクを作っちゃう意味がわからない場合には、/usr/binにroot権限でシンボリックリンクを作らずに ~/opt/bin.llvm-3.3など安全なユーザーホーム以下の場所にシンボリックリンクを作るか/usr/lib/llvm-3.3/binへのシンボリックリンクにするなどして、~/.zshrcや~/.bashrcにPATH=~/opt/bin.llvm-3.3:$PATHとかすればいいんじゃないかな、と思います(╹◡╹)

さて、これでEmscripten-1.12.1以降をllvm-3.3を用意できてMint16(saucy)で使える状態かと言うと実はまだ詰めが甘くて、今度は /usr/bin/lli がありませんって怒られます。これは、 llvm-3.3 パッケージの依存パッケージ llvm-3.3-runtime に含まれていて、
dpkg -L llvm-3.3-runtime
とすると確認できます。

  • /usr/bin/lli-3.3
これもバージョン番号なしでコマンドを実行可能な状態にします。これでllvm関連でEmscriptenからCRITICALを貰う事は無くなります(╹◡╹)

無くなりますが、たぶん fastcomp がどうしたと怒られます。解決方法は2つ。

[2. emscripten-fastcomp ]

1.  EMCC_FAST_COMPILER=0 をセットして Emscripten を使う:
EMCC_FAST_COMPILER=0 emcc
とりあえず場当たり的な解決としてはこれで使えます。たぶん。

参考: https://github.com/kripken/emscripten/wiki/LLVM-Backend#status-of-original-compiler-and-how-to-disable-fastcomp

2. emscripten-fastcomp を用意する:

fastcompは Emscripten-1.12.1 から導入されたかくかくしかじか従来よりも4倍高速なコンパイラーです。ただし、いまのところembind未対応だったり、C++erには少し悲しみもあります。

emscriptenリポジトリーに加えて、こちらの emscripten-fastcomp リポジトリーも導入します。
  1. emscripten-fastcomp のブランチ origin/incoming を checkout
  2. tools ディレクトリーへ移動して emscripten-fastcomp-clang リポジトリーを clang というディレクトリー名で clone
  3. clang ディレクトリーへ移動してブランチ origin/incoming を checkout
  4. ビルド
    1. ../../ (元の emscripten-fastcomp)へ戻って
    2. mkdir build && cd build して
    3. cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86;JSBackend" -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF
    4. ninja
  5. ~/.emscripten の LLVM_ROOT ビルドしたclangバイナリーのありかに設定
    1. LLVM_ROOT='/...dokoka.../emscripten-fastcomp/build/bin' 

これで emcc や em++ のデフォルトで fastcomp 仕様で Emscripten-1.12.1 以降を使えるようになります。ちなみに執筆現在で Emscripten はタグが 1.14.1 までしかありませんが、コミットログを見ると 1.16.0 まであります。

参考: https://github.com/kripken/emscripten/wiki/LLVM-Backend#getting-fastcomp

0 件のコメント:

コメントを投稿