ゲノムグラフを生成するvgをARM Macでコンパイルする

## はじめに vgとは

何もわかってないのでbing AIに説明してもらった。

https://github.com/vgteam/vg

- vgは、ゲノムバリエーショングラフを扱うためのツールキットです。
- ゲノムの多様性を記述するための強力なオブジェクトであるバリエーショングラフを構築、操作、可視化するためのツールを提供します。

## コンパイル

M1 や M2 などのARM Mac をbioinformaticsに使うべきではないという話がある。しかし今Macを買う人はほとんどM2だと思う。速度を要求するbioiformaticsのプログラムはSIMD拡張命令を使って高速化しているので、M2 Macでは正常にコンパイルできない場合がある。

vgのARM Macにけるコンパイルもやや混沌としている。自分もそこまでコンピュータに詳しいわけではないので上手に問題の切り分けができない。しかし、誰かの役に立つかもしれないので遭遇した問題と、解決策をメモっておく。
ただ、どれが効いたのかよくわからない部分も多い。

## リポジトリをcloneする

```
git clone --recursive https://github.com/vgteam/vg.git
cd vg
```

`--recursive` に注意してほしい。vgはC++のプロジェクトである。C++のツールでしばしば見られる「依存ライブラリはgit submoduleとして管理する」という方針をとっている。なのでサブモジュールとして依存ライブラリをダウンロードする必要がある。

HTTP Proxy環境などインターネットへのアクセスが制限されている場合は、すでにこの時点で問題が発生する。`elfutils` のsubmoduleがダウンロードされない。`.gitmodues`を確認すると、

```
[submodule "deps/elfutils"]
        path = deps/elfutils
        url = git://sourceware.org/git/elfutils.git
```

となっており、リポジトリのURLがhttpsではないのである。この問題を解決するためには、次の[issue](https://github.com/vgteam/vg/issues/2491#issuecomment-537036831)を参照して、

```
git config --global url."https://".insteadOf git://
```

とするのがよい。しかし、そもそもGitプロトコルは現在では推奨されていない。httpsで構わない気がしたので、gitをhttpsに差し替える[プルリクエスト](https://github.com/vgteam/vg/pull/4117)を作成した。（このプルリクエストがマージされた場合は問題は発生しなくなると思う）

### conda環境をはずす

一般的にはCやCppのツールをコンパイルするときには通常はcondaを外すべきである。miniconda/anaconda を使っている人は、コンパイル時にconda内部のツールが使われたり、ライブラリにリンクされることを防ぐために `conda deactivate` をして、環境変数やパスを外しておく。

## 依存するライブラリをインストールする。

MacPorts を使う方法も公式のREADMEには書かれている。Homebrewを使っている場合は、下記のコマンドを叩いて依存するライブラリをインストールする。

```
brew bundle
```

これでリポジトリ直下の `Brewfile` 内に記述されているライブラリがインストールされる。Rubyの `bundle` コマンドを知っていると、このディレクトリだけで有効になるようにライブラリがインストールされるのかな？と思ったりするが、そんなことは全くなく、ツールはグローバルにインストールされる。

## コンパイル

```
. ./source_me.sh && make -j7
```

このあたりから、少し混沌としてくる。

`. ./source_me.sh` の意味であるが、`.` は `source` と同じらしい。この `source_me.sh` は主に環境変数を設定している。`./source_me.sh && make` では環境変数は `make` コマンドまで反映されないらしい。だから `. ./source_me.sh` とする。`./source_me.sh` は、`LIBRARY_PATH` `LD_LIBRARY_PATH` `DYLD_LIBRARY_PATH` `LD_INCLUDE_PATH` `CFLAGS` `CXXFLAGS` などを `pwd` 下のディレクトリに設定する。

ここで、CCやCXX設定しているが、自分の場合はコンパイラはgccなどは使わず、Apple謹製のものを使った。自分の場合はこれでうまくいった。

`gcc --version`

```
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

`g++ --version`

```
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

そのうえで gcc を使わないといけないのか、あるいは、すでにbrew bundleでインストールされているはずのopenmpがインストールされていないのかと紛らわしいエラーメッセージが出た気がするが、そうではなく LLVM をインストールする必要があった。

```
brew install llvm
```

おそらく `llvm-config` などでLLVMのライブラリ等ののパスを取得していると思うので、実行形式のファイルがパスに含まれるように

```
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
```

を `~/.zshrc` に追加した。効いているかどうかは定かではない。

一応このあたりの対策でをすると、コンパイルが通るようになった。

（しかし、それ以前には、エラーメッセージがない状態で `make` コマンドが正常に途中で終了したりするという、あまり経験したことがない現象もあったりしたので、どうなっているのかはよくわからない。）

MacOSはDockerで動かせないので、完全に新しい環境でコンパイルが可能だということを再現できないので、この記事もこのぐらいになる。（[GitHub ActionsにM1が来るらしい](https://github.com/actions/runner-images/issues/8439) ので期待してる）

コンパイルが終わると、`bin/vg` が利用できるようになる。

```
bin/vg
```

```
vg: variation graph tool, version v1.51.0-22-g49cc69c14 "Quellenhof"

usage: vg <command> [options]

main mapping and calling pipeline:
  -- autoindex     mapping tool-oriented index construction from interchange formats
  -- construct     graph construction
  -- rna           construct splicing graphs and pantranscriptomes
  -- index         index graphs or alignments for random access or mapping
  -- map           MEM-based read alignment
  -- giraffe       fast haplotype-aware short read alignment
  -- mpmap         splice-aware multipath alignment of short reads
  -- augment       augment a graph from an alignment
  -- pack          convert alignments to a compact coverage index
  -- call          call or genotype VCF variants
  -- help          show all subcommands

For more commands, type `vg help`.
For technical support, please visit: https://www.biostars.org/tag/vg/
```

念のためリンクを確認しておく。公式READMEによるとMacではstaticなコンパイルはできないようである。予想外のライブラリにリンクされていないかチェックする。

```
otool -L bin/vg
```

なかには

```
/Users/kojix2/Cpp/vg/lib/libvgio.dylib (compatibility version 0.0.0, current version 0.0.0)
```

のように、vgディレクトリ内にリンクされているライブラリが存在するので注意が必要である。

誤って miniconda/condaにリンクされていないことをチェックしてもいいかもしれない。

```
otool -L bin/vg | grep conda
```

正しく動作するのか不安なので、テストを走らせるとよいと思う。

```
make test
```

まとまりがありませんが、この記事は以上です。