OpenBabelのインストール

はじめに

 今回はLinuxでのOpenBabelのインストール方法を紹介します。RDKitとどちらにしようか迷いましたが、私はOpenBabelの方を良く利用しているのでこちらにしました。対象とするLinuxのディストリビューションは主にUbuntu 18.04 LTSとします。また基本的なことですが、GCCやCMakeなどの開発ツールはインストール済みであるとします。

 ただ単にインストールするだけなら難しいことはありません。aptやyumなどのパッケージマネージャーを利用すれば良いのです。例えば以下のようになります。Ubuntu系Linuxの場合は以下のコマンド一発です。

$ sudo apt install openbabel libopenbabel-dev

 上記のようにコマンドを入力すれば良いので簡単ですが、このインストール方法では結構古いバージョンのOpenBabelがインストールされてしまうという問題があります。できれば新しいバージョンを利用したいですよね。ということでGitでOpenBabelのソースコードを取ってきて、調査→インストール→動作チェックまでを紹介します。

 先ずは以下のコマンドでOpenBabelのソースコードを入手します。

$ git clone git://github.com/openbabel/openbabel.git

 masterブランチは最新すぎてちょっと不安なので、現在の安定版のブランチを選択します。openbabelディレクトリの中に入ってから、以下のようにコマンド入力します。

$ git checkout openbabel-2-4-x

 ではこの状態から始めましょう。

CMakeLists.txtの確認

 OpenBabelはCMakeを利用してビルドします。このCMakeは必ず「CMakeLists.txt」というファイル名で設定等を記述します。したがってこのファイルの中を見れば必要なライブラリは何か?、どのようなオプションがあるのか?が分かります。このようなインストールに関する情報はCMakeLists.txtを見なくてもドキュメントがあるのですが、情報が古かったりする場合があります。ここは敢えていばらの道を進みましょう。いばらと言ってもそんなに面倒ではありません。ちょっと確認するだけです。

必要なライブラリは何か?

 CMakeLists.txtをエディタで開けばわかりますが、結構長いし全部読むのは非常に大変です。(しかもCMakeLists.txtというファイルは一個だけでは無いのです。)だからポイントだけ押さえて見てみましょう。CMakeで必要なライブラリを探すときよく使用されるコマンドは「find_package」です。この手のコマンドは他にもいくつかあって、頻度は少ないですが、「find_library」や「find_path」もあります。あと「pkg_check_modules」というのがあります。これらを押さえておけば概ね大丈夫かと思います。

 とりあえず以下のようにgrepコマンドで様子をうかがいます。

$ grep -nH find_package CMakeLists.txt
CMakeLists.txt:149:  find_package(Inchi REQUIRED)
CMakeLists.txt:166:find_package(LibXml2)
CMakeLists.txt:171:find_package(ZLIB)
CMakeLists.txt:182:#find_package(wxWidgets COMPONENTS base core REQUIRED)
CMakeLists.txt:183:find_package(wxWidgets COMPONENTS base core adv)
CMakeLists.txt:340:  find_package(Boost)
CMakeLists.txt:397:  find_package(OpenMP)
CMakeLists.txt:452:find_package(Eigen3)
CMakeLists.txt:457:  find_package(Eigen2) # find and setup Eigen2
CMakeLists.txt:465:find_package(Cairo)
CMakeLists.txt:573:# point at the build directory and call find_package(OpenBabel2)
$ grep -nH pkg_check_modules CMakeLists.txt
(出力なし)

どうやらOpenBabelのビルドに必要そうなライブラリをリストアップすると以下の通りのようです。

ライブラリ説明
InchiInternational Chemical Identifierh
LibXml2xmlのパーサー
ZLIB圧縮解凍ライブラリ
wxWidgetsGUI用ライブラ
BoostC++のライブラリ
OpenMPスレッド並列化のライブラ
Eigen3線形代数ライブラリ
Cairo画像描画ライブラリ

 上記のライブラリはOpenBabelをビルドする前にインストールしておく方が無難です。ただし、全て必要かどうかはビルドオプションに依ります。私の場合はGUIは要らないのでwxWidgetsはインストールしません。ちなみにInChIはOpenBabelに付いているので、わざわざIUPACのページからダウンロードしなくても良いです。InChIを除いた上記ライブラリを一気にインスールする場合は以下のようなコマンドになります。

$ sudo apt install libxml2-dev zlib1g-dev libwxgtk3.0-dev libboost-all-dev libomp-dev libeigen3-dev libcairo2-dev

どのようなオプションがあるのか?

 オプション関連についてもgrepコマンドでざっくり調べます。キーワードは「option」です。

$ grep -nH option CMakeLists.txt
CMakeLists.txt:45:option(ENABLE_VERSIONED_FORMATS
CMakeLists.txt:104:option(GLIBC_24_COMPATIBLE "Build project compatible with GLIBC 2.4" OFF)
CMakeLists.txt:110:option(BUILD_SHARED "enable shared build support" ON)
CMakeLists.txt:111:option(BUILD_MIXED "enable linux relocatable binaries support" OFF)
CMakeLists.txt:112:option(WITH_STATIC_INCHI "enable static inchi and related plugins" OFF)
CMakeLists.txt:113:option(WITH_STATIC_LIBXML "enable static libxml and xml file format plugins" OFF)
CMakeLists.txt:145:option(WITH_INCHI   "Build inchi support" ON)
CMakeLists.txt:146:option(OPENBABEL_USE_SYSTEM_INCHI
CMakeLists.txt:196:  option(OB_USE_PREBUILT_BINARIES
CMakeLists.txt:254:  option(ENABLE_SYMBOL_VISIBILITY
CMakeLists.txt:354:# Note: Windows version uses different options!
CMakeLists.txt:393:option(ENABLE_OPENMP
CMakeLists.txt:475:  option(OPTIMIZE_NATIVE "Optimize for native CPU architecture. Turn off if compiling for distribution/reuse on other machines." OFF)
CMakeLists.txt:490:  option(BUILD_GUI "Build the GUI" OFF)
CMakeLists.txt:492:  option(BUILD_GUI "Build the GUI" ON)
CMakeLists.txt:508:option(ENABLE_TESTS "Enable unit tests" ON)
CMakeLists.txt:523:option(RUN_SWIG "Generate language bindings with SWIG" OFF)
CMakeLists.txt:526:option(BINDINGS_ONLY "Build bindings only" OFF)
CMakeLists.txt:533:option(ALL_BINDINGS "Build all languages bindings" OFF)
CMakeLists.txt:536:option(PHP_BINDINGS "Build PHP bindings" OFF)
CMakeLists.txt:539:option(PYTHON_BINDINGS "Build Python bindings" OFF)
CMakeLists.txt:542:option(RUBY_BINDINGS "Build Ruby bindings" OFF)
CMakeLists.txt:545:option(PERL_BINDINGS "Build Perl bindings" OFF)
CMakeLists.txt:548:option(JAVA_BINDINGS "Build Java bindings" OFF)
CMakeLists.txt:551:option(R_BINDINGS "Build R bindings" OFF)
CMakeLists.txt:554:option(CSHARP_BINDINGS "Build Csharp bindings" OFF)
CMakeLists.txt:569:option(MINIMAL_BUILD "Disable full build" OFF)

ライブラリの場合より大分長いですね。45行目はENABLE_VERSIONED_FORMATSで途切れています。このような場合はエディタでCMakeLists.txtを開いて45行目付近を確かめます

 44 
 45 option(ENABLE_VERSIONED_FORMATS
 46   "Enable versioning of the format plugin directory" ON)
 47 

これは簡単に言うとフォーマット(sdfとかmol2とかpdb等のこと)のプラグインを入れているディレクトリをバージョン毎にわけますか?ということです。通常わけるのでONとなっています。このような感じでそのオプションがどのようなものかやデフォルト値を確認します。オプションの指定はビルドするときのcmakeコマンドを実行する時に記述します。あたりまえですけど、記述すべきはデフォルトと異なる場合のみです。

 以下はオプションについてまとめた表です。今回デフォルトと異なるのはOpenMPで並列化するかどうか?とGUIを利用するかどうか?という2個のオプションです。OpenMPでの並列化は力場の計算部分のみです。以前言及しましたがOpenBabelはスレッドセーフでは無いので、並列化できるのはごく一部です。(Gitのログを見ているとスレッドセーフにしようと努力していることが伺えます。次期バージョンを非常に期待しています。)あと、GUIは要らないです。OpenBabelはコマンドで扱う方がずっと使いやすいですからね。

オプション備考
デフォルト今回の設定
ENABLE_VERSIONED_FORMATSONON
GLIBC_24_COMPATIBLEOFFOFF
BUILD_SHAREDONON
BUILD_MIXEDOFFOFF
WITH_STATIC_INCHIOFFOFF
WITH_STATIC_LIBXMLOFFOFF
WITH_INCHIONON
OPENBABEL_USE_SYSTEM_INCHIOFFOFF
OB_USE_PREBUILT_BINARIESwindows用ONEither
ENABLE_SYMBOL_VISIBILITYOFFOFF
ENABLE_OPENMPOFFON
OPTIMIZE_NATIVEwindows用OFFEither
BUILD_GUIONOFF
ENABLE_TESTSONON
RUN_SWIGOFFOFF
BINDINGS_ONLYOFFOFF
ALL_BINDINGSOFFOFF
PHP_BINDINGSOFFOFF
PYTHON_BINDINGSOFFOFF
RUBY_BINDINGSOFFOFF
PERL_BINDINGSOFFOFF
JAVA_BINDINGSOFFOFF
R_BINDINGSOFFOFF
CSHARP_BINDINGSOFFOFF
MINIMAL_BUILDOFFOFF

やっと確認終了

 最後にオプションの確認をgrep使ったりエディタを使ったりと原始的な方法で確認しましたが、実はccmakeという便利なコマンドがあります。これを利用すればオプションを超簡単に確認・変更が可能です。ただ、原始的な方法に意味が無いわけではありません。例えばMINIMAL_BUILDというオプションなんかはONにしたとして、どんなMINIMALかはccmakeではわかりません。CMakeLists.txtをエディタで開くと以下のような記述があります。

567 
568 # A minimal build with just two formats (SMI, SDF) useful for developers
569 option(MINIMAL_BUILD "Disable full build" OFF)
570 

CMakeのコメント行としてSDフォーマットとSMILESフォーマットの2つだけに対応したビルドをしますということが分かります。さすがにコメント行まではccmakeでは表示してくれませんよね。でもこの記述は間違いです(笑)。src/formatsの下のCMakeLists.txtを見ると以下のような記述があります。

  2 set(formats_common
  3   smilesformat
  4   mdlformat
  5   mol2format
  6   pdbformat
  7  )
231 if(MINIMAL_BUILD)
232   set(formats
233     ${formats_common}
234   )
235 else(MINIMAL_BUILD)

MINIMAL_BUILDがONのときは、formats_commonにセットしたフォーマットのみが有効になるということです。よく見るとformats_commonにはsdfやsmiles以外にもmol2とpdbも含まれています。SDFとSMIだけでは無いのです。このようにオープソースを利用する場合は泥臭く確かめる必要もたまにあります。

ビルド開始

 最後にインストール先のディレクトリを決めます。デフォルトは/usr/localの下にインストールされます。今回の場合はホームディレクトリにappというディレクトリを作成してそこにインストールすることにします。

 とりあえず「build」というディレクトリを作成して、そこに移動します。ディレクトリ名はbuildでなくてもいいです。

$ mkdir build
$ cd build

 そして以下のコマンドでcmakeを実行します。オプションの指定は「-D変数名=値」で指定します。インストール先はCMAKE_INSTALL_PREFIXという変数を設定します。

$ cmake -DCMAKE_INSTALL_PREFIX=${HOME}/app -DENABLE_OPENMP=ON -DBUILD_GUI=OFF .. 

 次にmakeします。-jオプションで並列数を指定します。今回は4並列でコンパイルします。

$ make -j 4

 いよいよインストールです。root権限が必要なディレクトリにインストールする場合はrootになってから以下のコマンドを実行します。

$ make install

 環境設定については以下の2行を~/.bashrcに記述します。記述したらsourceするか、一旦exitして再ログインします。

export PATH=${HOME}/app/bin:${PATH}
export LD_LIBRARY_PATH=${HOME}/app/lib:$LD_LIBRARY_PATH

動作確認

 以下のコマンドで動作確認してみましょう。日付部分は異なるでしょうが、バージョンが表示されればOKです。

$ obabel -V
Open Babel 2.4.1 -- Jan 11 2019 -- 10:50:21

 最後にOpenBabelで私のお気に入りの機能を一つ紹介しましょう。以下のコマンドを入力してみてください。出力は下の図の様に表示されます。ちなみにこのSMILESはアスピリンです。

$ obabel -:'CC(=O)Oc1ccccc1C(=O)O' -oascii
obabelコマンドの出力

 なんと構造式がアスキーアートで出力されるのです。普段コマンド画面ばかりで仕事するので、いちいちGUIで構造を確認するのが面倒な場合があります。そんな時この機能を使えば構造の大体の様子が分かります。アスキーアートなので大体しか分かりませんけど、それでも便利です。しかし、作者は一体何を思ってこんな機能を実装したのでしょうね。おそらく作者もいちいちGUIを使うのが面倒に感じる方なのかもしれません。