x10で書かれたプログラムをビルドされたバイナリ形式で配布して、ユーザーがx10ランタイムをインストールしなくても使えるようにしたい。
デフォルトではx10のランタイムは共有ライブラリにdynamic linkされるので、それをstaticにリンクする方法。
前提条件
- x10 2.6.1
- Native x10 (JavaではなくC++のバックエンド)
- Linux
デフォルトでの挙動
x10の公式サイトから配布されているx10コンパイラ(x10c)は、x10プログラムをコンパイルした後、x10のランタイムライブラリとdynamic linkする。
$ x10c++ -d build -o hello.out Hello.x10
$ ldd hello.out # lddコマンドでどの共有ライブラリにリンクされているか表示される
...
libx10.so => /home/..../x10/x10.dist/stdlib/lib/libx10.so
libgc.so.1 => /home/..../x10/x10.dist/lib/libgc.so.1
...
libx10rt_sockets.so => /home/..../x10/x10.dist/lib/libx10rt_sockets.so
...
この通り、libx10.so
, libgc.so
, libx10rt_sockets.so
の3つのファイル動的リンクされている。
一般のLinux環境ではこれらの共有ライブラリが無いので、これらをstatic linkしたい。
方法
配布されているコンパイラは.a
ファイルを持っていないので、x10コンパイラとランタイムをソースからビルドする必要がある。
その際に環境変数X10_STATIC_LIB=1
をセットすると静的なランタイムライブラリがビルドされる。
git clone git@github.com:x10-lang/x10.git
cd x10
# 必要であれば特定のタグをcheckout
cd x10.dist
export X10_STATIC_LIB=1 # static libraryを利用するためのフラグを環境変数で指定
ant dist # 必要に応じて -Davailable.procs=... -Doptimize=true -DNO_CHECKS=true
ls lib # lib/以下に.aファイルができているはず
ls stdlib/lib # 同上
これでstatic linkする準備は整った。
しかし、この状態でコンパイルをしてもlibgcだけが動的リンクされたままになってしまう。
(これはx10のバグかもしれないのでgithubでissueを立てた。)
強制的にstatic linkするためにlibgc.so*
を削除して.aだけ存在するようにする
rm -f lib/libgc.so*
これ以降x10c++でコンパイルすればstatic linkされるようになる。
注意事項
この方法はmacOS(clang利用)の場合、リンカオプションが適切にセットされないようでうまくいかない。(これもx10のバグ?)