end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

c/c++ -> javascript 変換compiler - emscripten を試す

https://github.com/kripken/emscripten/

この手のツールは、hello world程度のsrcしか変換できないと思っていましたが、物理engine:bulletやfont engine:freetypeのデモをみると、その完成度に驚きます。
最近、jsでバイナリを扱うアプリが増えた裏にemscriptenがあるのかも...

で、実際にinstallし、試してみました。

参考site

Emscripten入門

http://teikyo.tumblr.com/2011-emscripten-1
http://teikyo.tumblr.com/2011/emscripten-tips
日本語で大変、分かりやすくまとめてられています。

2011年12月(約6ヶ月前)のentryで、emmaken.py 後継の emcc が公開されている為、install方法等は、本家siteをご覧になった方が良いと思います。

本家emscripten wiki

https://github.com/kripken/emscripten/wiki
全てが網羅されている訳ではありませんが、導入段階では次の3ページが参考になります

Tutorial 導入方法
Interacting with Compiled Code tutorialと合わせて読みたい動作の基本
Filesystem Guide 何と、仮想ファイルシステムを持ってます
emscriptenのファイルIO

http://hujimi.seesaa.net/article/264965970.html
ファイルへの入出力がcode付きで丁寧に記載されています。
いやー、--pre-jsやModule等、ここには助けられました。

Alon Zakai @ Mozilla

http://mozakai.blogspot.jp/search/label/emscripten
emscriptenの開発者のblog. emscriptenによるconrigure->make等分かりやすく記載されています。

emscripten installの前準備

2012年7月時点では、次の依存packageがあります

  • LLVM with Clang (3.1 is the officially supported version)
  • Node.js (0.5.5 or above)
  • Python 2.6

※私の場合、コマンドラインでjsを動作させたかった為、javascript engineのv8もinstallしています

LLVM with Clang

LLVMとClangは別々に提供されいますが、まとめてbuildするので、ご注意

$ wget http://llvm.org/releases/3.1/llvm-3.1.src.tar.gz
$ wget http://llvm.org/releases/3.1/clang-3.1.src.tar.gz
$ tar -zxvf llvm-3.1.src.tar.gz 
$ tar -zxvf clang-3.1.src.tar.gz
$ mv clang-3.1.src llvm-3.1.src/tools/clang
$ cd llvm-3.1.src
$ ./configure
$ make
$ su
# make install
Node.jsとPython 2.6に難しい部分はないはずなので割愛

emscripten install

emscriptenpythonで書かれており、installといっても、次のurlからダウンロードし、解凍するだけです。
https://github.com/kripken/emscripten/

解凍後に簡単な動作確認を行うのであれば、先程も記載した次のurlをご覧下さい。
http://teikyo.tumblr.com/2011-emscripten-1

libtiff をemscriptenでjs化...tiff2pdfの動作には失敗しましたが

試しにlibtiffを次の手順でmake(というかjs化)してみました.

$ http://download.osgeo.org/libtiff/tiff-4.0.2.tar.gz
$ tar -zxvf tiff-4.0.2.tar.gz
$ cd tiff-4.0.2
$ /home/endo/local/emscripten/emconfigure ./configure
$ /home/endo/local/emscripten/emmake make
$ /home/endo/local/emscripten/emcc tools/tiff2pdf.o \
       libtiff/.libs/libtiff.a --minify 1 -o tiff2pdf_core.js

作成された tiff2pdf_core.js をv8 (d8)で動作させると...

$ /home/endo/local/v8/out/ia32.release/d8 tiff2pdf_core.js test.tif 
tiff2pdf: No input file specified.
LIBTIFF, Version 4.0.2
Copyright (c) 1988-1996 Sam Leffler
Copyright (c) 1991-1996 Silicon Graphics, Inc.

usage:  tiff2pdf [options] input.tiff
options:
 -o: output to file name
 -z: compress with Zip/Deflate
 -q: compression quality
 -n: no compressed data passthrough
 -d: do not compress (decompress)
 -i: invert colors
 -u: set distance unit, 'i' for inch, 'm' for centimeter
 -x: set x resolution default in dots per unit
 -y: set y resolution default in dots per unit
 -w: width in units
 -l: length in units
 -r: 'd' for resolution default, 'o' for resolution override
 -p: paper size, eg "letter", "legal", "A4"
 -F: make the tiff fill the PDF page
 -f: set PDF "Fit Window" user preference
 -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS
 -c: sets document creator, overrides image software default
 -a: sets document author, overrides image artist default
 -t: sets document title, overrides image document name default
 -s: sets document subject, overrides image image description default
 -k: sets document keywords
 -b: set PDF "Interpolate" user preference
 -h: usage
test.tif:1: SyntaxError: Unexpected token ILLEGAL
II*
   ^
SyntaxError: Unexpected token ILLEGAL

上手く、コマンドライン引数をmain()か受け取りません。
※--pre-jsでModule['arguments']にで引数を設定しても同様でし、ブラウザで動作させても同様でした。

make手順が悪かったのかな?
それとも他に emscripten のdocumentがあるのかな?

今回は上手くいきませんでしたが、時間を見つけてtiff2pdf.cも合わせて読んでみます。