Rtools3.3以降を使うWindows用Rパッケージの構成

前回の記事に書いたように、Rtools 3.3以降は64ビット版と32ビット版を別々にコンパイルします。

なので、C/C++のライブラリが必要なパッケージは、その依存ライブラリも64ビット版と32ビット版を用意しておかないといけないっぽいです。これを意識していない構成にしていると、パッケージがうまくインストールできません(ldが、ライブラリが見つかりません!的なエラーを出す)。どうするのがベストプラクティスなのかちょっと調べてみたのでメモります。

例:xml2

libxml2へのバインディングであるxml2をみてみます。

github.com

これはこういうディレクトリ構成になっています(必要な部分だけ抜粋)

R/
man/
src/
|__ Makevars.in
|__ Makevars.win
...
tools/
windows/
|__ libxml2-2.9.2/
    |__ include/
    |__ lib/
        |__ i386/
        |__ x64/
configure
configure.win
...

windowsディレクトリ

ここには、コンパイル済みのlibxml2が入っています。これは実は別レポジトリに分けられています。rwinlibという謎の組織がWindows用のライブラリをコンパイルしまくってホストしています。

toolsディレクトリには、これをダウンロードしてきて展開するwinlibs.Rというスクリプトが入っています。

windows/libxml2-2.9.2ディレクトリ

ここにはコンパイル済みのStaticなライブラリ・ヘッダファイルが配置されます。

  • include: ヘッダファイル(*.h
  • lib/i386: 32ビット版のStaticなライブラリ(*.a
  • lib/x64: 64ビット版のStaticなライブラリ(*.a

このライブラリをビルドの際に使い分けるのは、src/Makevars.winがうまいことやってくれます。

src/Makevars.win

Makevars.winは、Windowsでだけ参照されるMakefile用の設定です。一部抜粋すると、環境変数を2つ設定しています。

PKG_CPPFLAGS= -I../windows/libxml2-2.9.2/include -DIN_LIBXML
PKG_LIBS= -L../windows/libxml2-2.9.2/lib${R_ARCH} -lxml2 -liconv -lz -lws2_32

${R_ARCH}に入る値が64ビット版をビルドするときは/x64、32ビット版をビルドするときは/i386になるので、PKG_LIBSをこういう風に書いておくとうまく使い分けてくれるというからくりです。

configure.win

configure.winは、Windowsでだけ実行されるconfigureスクリプトですが、これはからっぽのファイルになっています。Windows版はあらかじめライブラリを配置してしまっているので何もしなくていいから、ということのようです。

まとめ

ということで、Hadley周辺はこういうやり方をしてるみたいです。

背景とかはあまり理解できていないところもあるので、間違ってたら指摘いただけるとありがたいです。