はじめに
最近CMakeに関する話題についてブログ投稿していて、OpenBabelやRDKitを利用したプログラムをビルドするためのCMakeの利用方法について紹介してきました。今回は実践編ということで、私が良く利用するドッキングプログラムである”smina”のビルドについて解説したいと思います。sminaはもともとautodock vinaから派生したドッキングプログラムです。autodock vinaではタンパク質や化合物の入力構造ファイルはPDBQT形式というものになります。我々が良く利用するPDBやSDF形式とは異なり少し扱いづらい部分があります。そこでsminaはOpenBabelを利用することによって、入出力ファイルとしてPDBやSDFも利用可能となっています。これによりsminaは非常に扱いやすいドッキングプログラムとなっています。
そんな使いやすいsminaでありますが、SourceForgeにて公開されているビルド済のsminaの実行ファイルは少々古いバージョンのものです。厳密にはmacOS版は新しいみたいですが、Linux版は古いままです。したがって、新しいバージョンを利用したい場合はビルドしなければなりません。sminaはCMakeを利用しているということもあって、CMakeシリーズのちょうど良いブログの題材なので今回取り上げてみました。
事前準備
先ずはsminaのソースコードを入手しましょう。入手にはGITを利用します。以下のコマンドを実行しましょう。
$ git clone git://git.code.sf.net/p/smina/code smina-code
コマンドが終了すると”smina-code”というディレクトリの下にsminaのソースコードがダウンロードされています。あと、OpenBabelのバージョン3をインストールしておきましょう。以前のブログにも書きましたが、anacondaかminicondaを利用すると簡単にインストールできます。この例では”ob3″という仮想環境を作成して、そこにOpenBabelをインストールすることにします。先ずは仮想環境の作成です。必要ない場合は飛ばしてください。
$ conda create -n ob3 python=3.9
つぎにOpenBabel本体をインストールします。
$ conda install -c conda-forge openbabel=3.1.1
これでOpenBabelがインストールされます。
CMakeLists.txtを読む
オープンソースソフトウェアをビルドするには、必要とされる様々なライブラリを用意しなければなりません。何が必須ライブラリなのかは基本的にドキュメントに記述されていますが、当てにならない場合があります。いずれにしてもCMakeLists.txtファイルを見る必要があります。以前のOpenBabelのインストールについてのブログ記事でも言及しましたが、”find_package”とか”pkg_check_modules”というコマンドに注目します。それではgrepコマンドを利用して調べてみます。
$ cd smina-code # git cloneしたsminaのコードのディレクトリに入る
$ grep -nH -E 'find_package|pkg_check_modules' CMakeLists.txt
CMakeLists.txt:45:find_package(Boost REQUIRED COMPONENTS
CMakeLists.txt:61:find_package(Eigen3 REQUIRED)
CMakeLists.txt:66:find_package(OpenBabel3 REQUIRED)
上記コマンドの結果、pkg_check_modulesコマンドは使われて無く、find_packageで検索されているライブラリは”Boost”と”Eigen3″と”OpenBabel3″ということがわかります。つまりOpenBabelの他にBoostとEigen3が必要という事になり、sminaをビルドする前に予めインストールしておく必要があります。BoostとEigen3にをインストールするには以下のコマンドを実行しましよう。
$ sudo apt install -y libboost-all-dev libeigen3-dev # Ubuntu系の場合
$ sudo dnf -y install boost boost-devel eigen3-devel eigen3-doc # RedHat系(CentOSなど)
OpenBabel3についてのインストールは以前のブログ記事を参照してください。これら3つのライブラリがインストールできれば準備完了です。
cmakeの実行
とりあえず、ビルド用のディレクトリを作成してcmakeを実行してみましょう。smina-codeディレクトリにおいて以下のコマンドを実行してみます。
$ mkdir build
$ cd build
$ cmake ..
おそらくエラーが出て止まってしまうのではないかと思います。cmakeが止まってしまう理由は大体において必要とするライブラリが見つからないからです。前節までに説明したようにOpenBabelとBoostとEigen3をインストールしている場合は、このエラーの原因はOpenBabelが見つからないことです。condaコマンドでちゃんとインストールしたのに見つからないのは、インストールした場所が探索する候補に入っていないからです。こういう場合はCMakeのモジュールファイルもチェックする必要が出てきます。トップレベルのCMakeLists.txtを確認してみると、最初の方に以下のような記述がみられます。
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules)
これはsmina-codeディレクトリの下にあるCMake/Modulesディレクトリの中の拡張子がcmakeのモジュールファイルもincludeやfind_packageコマンドで見ることにしますよという内容になっています。
この中を見るとOpenBabelに関するモジュールファイルが2個あって、”FindOpenBabel3.cmake”というファイルがCMakeLists.txtから呼び出されていると気づくでしょう。このファイルの内容を見てみると17行辺りに以下のような記述が見られます。
if(OPENBABEL3_INCLUDE_DIR AND OPENBABEL3_LIBRARIES)
# in cache already or user-specified
set(OPENBABEL3_FOUND TRUE)
else()
これは”OPENBABEL3_INCLUDE_DIR”と”OPENBABEL3_LIBRARIES”という変数に何か値が設定されていれば、OpenBabelが見つかったとしてほとんど何もせずに終わるという意味です。さもなければelse以下が実行されます。つまり、OpenBabelをインストールしたディレクトリが明確に分かっていれば、CMakeLists.txtファイルを編集するなどして上記2変数にインストールディレクトリを代入しておけば良いということになります。さもなければelse以下の以下のようなコマンドが実行されることになります。
find_path(OPENBABEL3_INCLUDE_DIR openbabel/obconversion.h
PATHS
${OPENBABEL_DIR}/include/openbabel3
${OPENBABEL_DIR}/include
$ENV{OPENBABEL_INCLUDE_DIR}/openbabel3
$ENV{OPENBABEL_INCLUDE_DIR}
$ENV{OPENBABEL_INCLUDE_PATH}/openbabel3
$ENV{OPENBABEL_INCLUDE_PATH}
$ENV{OPENBABEL_DIR}/include/openbabel3
$ENV{OPENBABEL_DIR}/include
$ENV{OPENBABEL_PATH}/include/openbabel3
$ENV{OPENBABEL_PATH}/include
$ENV{OPENBABEL_BASE}/include/openbabel3
$ENV{OPENBABEL_BASE}/include
...
これはOpenBabelがインストールされている場所を探索する候補をリストアップしています。これを見るとOpenBabelのインストール先の指定が色々されていることがわかります。例えば”OPENBABEL_DIR”という変数に適切なディレクトリが設定されていれば良いことがわかります。あとは、シェルの環境変数”OPENBABEL_DIR”に適切な値を入れることによっても解決できることが見て取れます。(bashでは環境変数をexportコマンドで設定できます。)いくつか解決方法がありますが、ここではCMakeLists.txtを編集しない方針で行きます。
buildディレクトリ内で、cmakeコマンドを実行する際に以下のような”-D”オプションをつけると変数を設定できます。
$ cmake -D OPENBABEL_DIR=${HOME}/miniconda3/envs/ob3 ..
これでうまくcmakeが最後まで通ったのではないかと思います。面倒ですがオープンソースのプログラムをビルドするには、このようにCMakeのプログラムを読む必要が出てきます。このライブラリの依存関係の解決こそがCやC++を利用した開発の面倒臭さや難しさです。だからこそPythonとかが流行っていると私は思っています。Pythonの場合は世界の誰かが既にライブラリの依存問題を解決してくれている状態でいろいろなツールを利用できるから超便利ですよね。
ビルドする
上述した通りにCMakeが実行できれば、後はmakeするだけです。以下のコマンドを実行しましょう。
$ make -j4
上記の場合は4並列でmakeする例です。大体の場合は正常に処理が進むはずです。最後にsmina
という実行ファイルが出来ていれば成功です。とりあえずバージョンを確認してみます。
$ ./smina --version
smina master:7369fc0 Built Feb 12 2023. Based on AutoDock Vina 1.1.2.
この表記の意味はGitのmasterブランチのコミットIDが7369fc0のソースコードから、2023年2月12日にビルドしましたということです。sminaは外部ライブラリをeigenとboostしか利用していないので、いろいろなアーキテクチャの計算機でビルドし易いと思います。スーパーコンピュータなどでドッキング計算をする場合などに是非sminaをビルドして利用してみてください。
Category: Docking, Linux関連, プログラミング関連