前回の記事に書いたように、Rtools 3.3以降は64ビット版と32ビット版を別々にコンパイルします。
なので、C/C++のライブラリが必要なパッケージは、その依存ライブラリも64ビット版と32ビット版を用意しておかないといけないっぽいです。これを意識していない構成にしていると、パッケージがうまくインストールできません(ld
が、ライブラリが見つかりません!的なエラーを出す)。どうするのがベストプラクティスなのかちょっと調べてみたのでメモります。
例:xml2
libxml2へのバインディングであるxml2をみてみます。
これはこういうディレクトリ構成になっています(必要な部分だけ抜粋)
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周辺はこういうやり方をしてるみたいです。
背景とかはあまり理解できていないところもあるので、間違ってたら指摘いただけるとありがたいです。