読者です 読者をやめる 読者になる 読者になる

備忘録 blog

Docker/Machine Learning/Go

vgをコンパイルする

c++ Make

vg

ゲノム間の相同性表現は厄介で、文字列表現やドットプロットなどさまざまな手法が試されてきたが、大規模な構造変異やリファレンスゲノムを表現するにはどれも決定打に欠いている。一方でロングリードが読めるようになったことに伴って最近とくに議論が盛んになっており、さまざまなツールが提案されている。

github.com

これはアセンブリやマルチプルアラインメントでの、ゲノム配列の変異関係をグラフ表現するコマンドラインツール。イギリスのサンガーインスティテュートを中心としてオープンソースで開発が進められている。

f:id:sharply:20160416160521p:plain

ところがこのツール、依存関係が複雑でcloneが時間かかる上にコンパイルが厄介ではまった箇所が多い。

git clone --recursive https://github.com/vgteam/vg.git
cd vg
. ./source_me.sh && make static -j4

とりあえずこれを叩いてみて、エラーが発生した時のための備忘録。

Linux上でコンパイルしてみる

static-libとしてのjansson, zlib

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: -ljansson が見つかりません
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: -lz が見つかりません
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: -lbz2 が見つかりません
collect2: error: ld returned 1 exit status
Makefile:62: recipe for target 'static' failed
make: *** [static] Error 1

リポジトリの説明通りにstaticにmakeしようとすると、それに対応したライブラリが必要になる。openSUSEのパッケージではzlib-devel-staticglibc-devel-staticとかがそれである。 ところがjansson-devel-staticがないので、-ljansson が見つかりませんというエラーに対応するためにはパッケージのままでは管理できない。 gentooではライブラリを+static-libsフラグをemergeするだけでよいのになぁと思いながら、make staticすることを諦め、結局staticオプションをつけずにmakeコンパイルした。

gcc >= 4.9

undefined reference to `std::regex_token_iterator<gnu_cxx::normal_iterator, char, std::regex_traits >::regex_token_iterator()'

これはリポジトリの下の方の説明にもあったのだが、GCC>=4.9を使うようにとのこと。実際にc++11準拠のregex, 正規表現関連の実装が入ったのはGCC >=4.9からだったので、gcc4.8の環境ではコンパイルできない。これはgccをアップデートして対応。

これでようやくコンパイルできて、bin/vgにバイナリができていることを確認した。

最終手段

動的リンクにしたので、このままではlibフォルダ以下にある.soファイルへのリンクができないので

error while loading shared libraries: ****.so: cannot open shared object file: No such file or directory

のようなエラーが出て困ることになる。あまりよい方法ではないが、/etc/ld.so.conf.d/vg.confvg/libへの絶対パスを書いて、sudo /sbin/ldconfigした。 これでとりあえず動くようになり、グラフの出力を試すことができた。

Dockerを試す

Dockerfileがリポジトリにあったので、一応こちらも試してみた。

docker build .

結果は

/usr/bin/ld: error in /app/lib/libvcflib.a(sw.o)(.eh_frame); no .eh_frame_hdr table will be created.

Exit(2)で終了する。Ubuntu 16.04に変更しても、ldconfigを実行するようにしてもダメだった。原因はまだわからない。