mongolite on FreeBSD

R言語用のMongoDBドライバとして、mongoliteというものがある。比較的新しくて、2018年6月現在アクティブに開発されているらしい。

ただしどうやらLinux/Windows/Macを想定しているようで、FreeBSDだとinstall.packageするとエラーになる。

install.package("mongolite")
...
cc -shared -L/usr/local/lib/R/lib -L/usr/local/lib -Wl,-rpath=/usr/local/lib/gcc6 -L/usr/local/lib/gcc6 -B/usr/local/bin -fstack-protector -o mongolite.so bson.o client.o collection.o cursor.o hex.o mongo_log.o reader.o utils.o -Lmongoc -lstatmongoc -Lbson -lstatbson -lsasl2 -L/usr/local/lib -lssl -lcrypto -lresolv -lz -L/usr/local/lib/R/lib -lR
/usr/local/bin/ld: -lresolv が見つかりません
cc: error: linker command failed with exit code 1 (use -v to see invocation)
gmake: *** [/usr/local/lib/R/share/make/shlib.mk:6: mongolite.so] エラー 1
ERROR: compilation failed for package ‘mongolite’

* removing ‘/usr/home/okano/R/amd64-portbld-freebsd12.0-library/3.4/mongolite’

 ダウンロードされたパッケージは、以下にあります 
        ‘/tmp/RtmpPqW3nN/downloaded_packages’ 
 警告メッセージ: 
 install.packages("mongolite") で: 
   パッケージ ‘mongolite’ のインストールは、ゼロでない終了値をもちました 
> 

libresolvが見つからない、となっているが、このライブラリはBSD系には存在しないようで、configureにもそれらしいコードが入っている。

# Linux, MacOS and Solaris use libresolv
if [[ "$OSTYPE" != *"bsd"* ]]; then
  PKG_LIBS="$PKG_LIBS -lresolv"
fi

ただ、FreeBSDの場合、OSTYPEが"FreeBSD"となりBSDが大文字なので、ここの条件に引っかからない。とりあえず小文字に揃えて回避してみる。

if [[ "${OSTYPE,,}" != *"bsd"* ]]; then
  PKG_LIBS="$PKG_LIBS -lresolv"
fi

/tmpに残っているディレクトリ内で、再インストール。

[okano@truex220] /tmp/RtmpPqW3nN/downloaded_packages% R CMD INSTALL --build mongolite
...
cc -shared -L/usr/local/lib/R/lib -L/usr/local/lib -Wl,-rpath=/usr/local/lib/gcc6 -L/usr/local/lib/gcc6 -B/usr/local/bin -fstack-protector -o mongolite.so bson.o client.o collection.o cursor.o hex.o mongo_log.o reader.o utils.o -Lmongoc -lstatmongoc -Lbson -lstatbson -lsasl2 -L/usr/local/lib -lssl -lcrypto -lz -L/usr/local/lib/R/lib -lR
installing to /usr/home/okano/R/amd64-portbld-freebsd12.0-library/3.4/mongolite/libs
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* creating tarball
packaged installation of ‘mongolite’ as ‘mongolite_1.5_R_amd64-portbld-freebsd12.0.tar.gz’
* DONE (mongolite)
[okano@truex220]

入ったっぽい。つなげてみる。

> library(mongolite)
> con <- mongo("・・・・", url = "mongodb://・・・・")

いけてる模様。