OpenMP に依存した R パッケージのインストール

MacOS X 上の R で caret パッケージをインストールしていたら OpenMP 関連のヘッダファイルが無いとためにパッケージのコンパイルに失敗しエラーとなった.対処法を記しておく.

caret パッケージのインストール中に以下のエラーが発生.OpenMP ライブラリ用の omp.h ヘッダファイルが見つからないというエラーだ.Mac のデフォルトコンパイラ clang の version 8.0.0 は OpenMP をサポートしていなかった.

/usr/bin/clang++  -I"/opt/local/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I"/Users/shito/Library/R/3.5/library/Rcpp/include" -I/opt/local/include   -fPIC  -pipe -Os -stdlib=libc++ -arch x86_64  -c auc_.cpp -o auc_.o
auc_.cpp:2:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^
1 error generated.
make: *** [auc_.o] Error 1

GCC 5 以降は OpenMP をサポートしている.パッケージ管理システムに MacPorts を使用しているなら,以下でインストール済みの GCC を確認できる.

$ port installed | grep gcc

私の環境では gcc6 がインストールされていたので,バイナリファイルの在りかを以下でチェック.

$ port contents gcc6 | grep /bin/
  /opt/local/bin/c++-mp-6
  /opt/local/bin/cpp-mp-6
  /opt/local/bin/g++-mp-6
  /opt/local/bin/gcc-ar-mp-6
  /opt/local/bin/gcc-mp-6
  /opt/local/bin/gcc-nm-mp-6
  /opt/local/bin/gcc-ranlib-mp-6
  /opt/local/bin/gcov-dump-mp-6
  /opt/local/bin/gcov-mp-6
  /opt/local/bin/gcov-tool-mp-6
  /opt/local/bin/gfortran-mp-6
  /opt/local/bin/x86_64-apple-darwin15-c++-mp-6
  /opt/local/bin/x86_64-apple-darwin15-g++-mp-6
  /opt/local/bin/x86_64-apple-darwin15-gcc-6.4.0
  /opt/local/bin/x86_64-apple-darwin15-gcc-ar-mp-6
  /opt/local/bin/x86_64-apple-darwin15-gcc-mp-6
  /opt/local/bin/x86_64-apple-darwin15-gcc-nm-mp-6
  /opt/local/bin/x86_64-apple-darwin15-gcc-ranlib-mp-6
  /opt/local/bin/x86_64-apple-darwin15-gfortran-mp-6

R のパッケージをインストールする際に使用するコンパイラに gcc6 をする.コンパイラの指定は,~/.R/Makevars ファイル内で行う(マニュアル参照).

# C++コンパイラに g++-mp-6 を指定
CXX=/opt/local/bin/g++-mp-6
# -std オプションを取り除く
CXXFLAGS= -DNDEBUG  -fPIC  -pipe -Os -arch x86_64

CXXFLAGS はコンパイラオプションを上書きする.caret パッケージのインストールではデフォルトで clang-stdlib=libc++ オプション付きで呼び出されていたが,gcc には無いオプションなので,このオプション以外を取り出して CXXFLAGS に設定した.stdlib=libc++ オプションのエラー部分は以下のとおり.

/opt/local/bin/g++-mp-6 -I"/opt/local/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I"/Users/shito/Library/R/3.5/library/Rcpp/include" -I/opt/local/include   -fPIC  -pipe -Os -stdlib=libc++ -arch x86_64  -c RcppExports.cpp -o RcppExports.o
g++-mp-6: error: unrecognized command line option '-stdlib=libc++'
make: *** [RcppExports.o] Error 1

以上の設定の下,R コンソールで install.package() を再度実行し,インストールに成功したら ~/.R/Makevars ファイルの記述を削除して元に戻しておくか,行頭に # を挿入しコメントアウトしておくと良い.