RでWindows環境でバイナリビルドされていないソースからのRのパッケージをインストールするときに使うRtools。Windows環境以外にとっては無関係の話し。
Rtools 4.0になって導入された(多分)、pacmanを使う機会があったのでメモしておく。
あとどうでもいい話だが、Rtools40なのかRtools 4.0なのかという話があるが、一応、Programとして選択するときにRtools 4.0のフォルダがWindows上で作成されてそこにあるので、Rtools 4.0と今後表記する。Program名はRtools40だし、ダウンロードするサイトもそのようになっているし多分Rtools40の方が一般的な気がするがWindowsのフォルダがそうなっているので。
発端
ことの発端としてはアップデートのチェックをしたら{RCurl}
パッケージのアップデートがきていたが、最新版にまだWindowsバイナリ版がなくソースからインストールすることにしたところ
install.packages("RCurl") Installing package into ‘D:/document/R/win-library/4.0’ (as ‘lib’ is unspecified) There is a binary version available but the source version is later: binary source needs_compilation RCurl 1.98-1.2 1.98-1.3 TRUE installing the source package ‘RCurl’ URL 'https://cran.rstudio.com/src/contrib/RCurl_1.98-1.3.tar.gz' を試しています Content type 'application/x-gzip' length 728630 bytes (711 KB) downloaded 711 KB * installing *source* package 'RCurl' ... ** パッケージ 'RCurl' の解凍および MD5 サムの検証に成功しました ** using staged installation ** libs *** arch - i386 "C:/rtools40/mingw32/bin/"gcc -I"C:/PROGRA~1/R/R-40~1.4/include" -DNDEBUG -I/include -DHAVE_LIBIDN_FIELD=1 -DHAVE_CURLOPT_URL=1 -DHAVE_CURLINFO_EFFECTIVE_URL=1 -DHAVE_CURLINFO_RESPONSE_CODE=1 -DHAVE_CURLINFO_TOTAL_TIME=1 -DHAVE_CURLINFO_NAMELOOKUP_TIME=1 -DHAVE_CURLINFO_CONNECT_TIME=1 -DHAVE_CURLINFO_PRETRANSFER_TIME=1 -DHAVE_CURLINFO_SIZE_UPLOAD=1 -DHAVE_CURLINFO_SIZE_DOWNLOAD=1 -DHAVE_CURLINFO_SPEED_DOWNLOAD=1 -DHAVE_CURLINFO_SPEED_UPLOAD=1 -DHAVE_CURLINFO_HEADER_SIZE=1 -DHAVE_CURLINFO_REQUEST_SIZE=1 -DHAVE_CURLINFO_SSL_VERIFYRESULT=1 -DHAVE_CURLINFO_FILETIME=1 -DHAVE_CURLINFO_CONTENT_LENGTH_DOWNLOAD=1 -DHAVE_CURLINFO_CONTENT_LENGTH_UPLOAD=1 -DHAVE_CURLINFO_STARTTRANSFER_TIME=1 -DHAVE_CURLINFO_CONTENT_TYPE=1 -DHAVE_CURLINFO_REDIRECT_TIME=1 -DHAVE_CURLINFO_REDIRECT_COUNT=1 -DHAVE_CURLINFO_PRIVATE=1 -DHAVE_CURLINFO_HTTP_CONNECTCODE=1 -DHAVE_CURLINFO_HTTPAUTH_AVAIL=1 -DHAVE_CURLINFO_PROXYAUTH_AVAIL=1 -DHAVE_CURLINFO_OS_ERRNO=1 -DHAVE_CURLINFO_NUM_CONNECTS=1 -DHAVE_CURLINFO_SSL_ENGINES=1 -DHAVE_CURLINFO_COOKIELIST=1 -DHAVE_CURLINFO_LASTSOCKET=1 -DHAVE_CURLINFO_FTP_ENTRY_PATH=1 -DHAVE_CURLINFO_REDIRECT_URL=1 -DHAVE_CURLINFO_PRIMARY_IP=1 -DHAVE_CURLINFO_APPCONNECT_TIME=1 -DHAVE_CURLINFO_CERTINFO=1 -DHAVE_CURLINFO_CONDITION_UNMET=1 -DHAVE_CURLOPT_KEYPASSWD=1 -DHAVE_CURLOPT_DIRLISTONLY=1 -DHAVE_CURLOPT_APPEND=1 -DHAVE_CURLOPT_KRBLEVEL=1 -DHAVE_CURLOPT_USE_SSL=1 -DHAVE_CURLOPT_TIMEOUT_MS=1 -DHAVE_CURLOPT_CONNECTTIMEOUT_MS=1 -DHAVE_CURLOPT_HTTP_TRANSFER_DECODING=1 -DHAVE_CURLOPT_HTTP_CONTENT_DECODING=1 -DHAVE_CURLOPT_NEW_FILE_PERMS=1 -DHAVE_CURLOPT_NEW_DIRECTORY_PERMS=1 -DHAVE_CURLOPT_POSTREDIR=1 -DHAVE_CURLOPT_OPENSOCKETFUNCTION=1 -DHAVE_CURLOPT_OPENSOCKETDATA=1 -DHAVE_CURLOPT_COPYPOSTFIELDS=1 -DHAVE_CURLOPT_PROXY_TRANSFER_MODE=1 -DHAVE_CURLOPT_SEEKFUNCTION=1 -DHAVE_CURLOPT_SEEKDATA=1 -DHAVE_CURLOPT_CRLFILE=1 -DHAVE_CURLOPT_ISSUERCERT=1 -DHAVE_CURLOPT_ADDRESS_SCOPE=1 -DHAVE_CURLOPT_CERTINFO=1 -DHAVE_CURLOPT_USERNAME=1 -DHAVE_CURLOPT_PASSWORD=1 -DHAVE_CURLOPT_PROXYUSERNAME=1 -DHAVE_CURLOPT_PROXYPASSWORD=1 -DHAVE_CURLOPT_SSH_HOST_PUBLIC_KEY_MD5=1 -DHAVE_CURLOPT_NOPROXY=1 -DHAVE_CURLOPT_TFTP_BLKSIZE=1 -DHAVE_CURLOPT_SOCKS5_GSSAPI_SERVICE=1 -DHAVE_CURLOPT_SOCKS5_GSSAPI_NEC=1 -DHAVE_CURLOPT_PROTOCOLS=1 -DHAVE_CURLOPT_REDIR_PROTOCOLS=1 -DHAVE_CURLOPT_SSH_AUTH_TYPES=1 -DHAVE_CURLOPT_SSH_PUBLIC_KEYFILE=1 -DHAVE_CURLOPT_SSH_PRIVATE_KEYFILE=1 -DHAVE_CURLOPT_FTP_SSL_CCC=1 -DHAVE_CURLOPT_COOKIELIST=1 -DHAVE_CURLOPT_IGNORE_CONTENT_LENGTH=1 -DHAVE_CURLOPT_FTP_SKIP_PASV_IP=1 -DHAVE_CURLOPT_FTP_FILEMETHOD=1 -DHAVE_CURLOPT_LOCALPORT=1 -DHAVE_CURLOPT_LOCALPORTRANGE=1 -DHAVE_CURLOPT_CONNECT_ONLY=1 -DHAVE_CURLOPT_CONV_FROM_NETWORK_FUNCTION=1 -DHAVE_CURLOPT_CONV_TO_NETWORK_FUNCTION=1 -DHAVE_CURLOPT_CONV_FROM_UTF8_FUNCTION=1 -DHAVE_CURLOPT_MAX_SEND_SPEED_LARGE=1 -DHAVE_CURLOPT_MAX_RECV_SPEED_LARGE=1 -DHAVE_CURLOPT_FTP_ALTERNATIVE_TO_USER=1 -DHAVE_CURLOPT_SOCKOPTFUNCTION=1 -DHAVE_CURLOPT_SOCKOPTDATA=1 -DHAVE_CURLOPT_SSL_SESSIONID_CACHE=1 -DHAVE_CURLOPT_WRITEDATA=1 -DCURL_STATICLIB -O2 -Wall -std=gnu99 -mfpmath=sse -msse2 -mstackrealign -c base64.c -o base64.o In file included from base64.c:1: Rcurl.h:4:10: fatal error: curl/curl.h: No such file or directory #include <curl/curl.h> ^~~~~~~~~~~~~ compilation terminated. make: *** [C:/PROGRA~1/R/R-40~1.4/etc/i386/Makeconf:222: base64.o] Error 1 ERROR: compilation failed for package 'RCurl' * removing 'D:/document/R/win-library/4.0/RCurl' * restoring previous 'D:/document/R/win-library/4.0/RCurl' Warning in install.packages : installation of package ‘RCurl’ had non-zero exit status The downloaded source packages are in ‘C:\Users\xxx\AppData\Local\Temp\RtmpwJNbtD\downloaded_packages’
となり、インストールに失敗した。
エラーメッセージの
Rcurl.h:4:10: fatal error: curl/curl.h: No such file or directory #include <curl/curl.h> ^~~~~~~~~~~~~
の通りcurl.h
が無いため。ただパッケージを使いたいだけならCRAN側でWindows版のバイナリビルドされるのを数日程度まてばよい(かアップデートじゃなく初回のインストールならバイナリを指定してインストールすればよい)のだがせっかくなのでRtools 4.0のpacmanをつかってライブラリをインストールしてみた。
Rtools 4.0のRtools Bashからpacmanを使う
手順は簡単で、ProgramのRtools 4.0のRtools Bashを起動して
パッケージリポジトリインデックスをサーバーと同期させるのに
pacman -Sy
を実行する1。パッケージデータベースを同期中とでてすぐに完了する2。
その後、curlをインストールするために、
pacman -S mingw-w64-{i686,x86_64}-curl
を実行する。-S <パッケージ名>
でインストールしたいパッケージを指定してインストールする。
パッケージ名は前半のmingw-w64-
は定型文で、{i686,x86_64}
は、32bit版(i686)と64bit版(x86_64)を両方インストールするという指定で片方だけならmingw-w64-x86_64-curl
とすると64bit版だけ指定できる。Rを64bit版しかインストールしていないならこれでもいいのかもしれない(自分の環境はそうではないので未検証)。それにインストールしたい-curl
をくっつけるといい感じになる。
依存関係を解決しながらライブラリをインストールしてくれるので(curlを含めて自分の環境だと6つほどインストールされた)、ただただ待つ。
インストールに成功したら、再び、Rで
install.packages("RCurl")
を実行しソースからビルドしたらうまくいった。大変簡単である。
以前、ライブラリをちまちまインストールたけど結局うまく行かなかった経験があるので、大変簡単になって嬉しい限り。
参考
docs/rtools40.md at master · r-windows/docs · GitHub
Rtools 4.0のpacmanについてはだいたいここに書いてある(と思う)3。
-
Debian系Linuxの
apt get update
みたいなものだと思う、記憶が正しければArch linux系でパッケージ管理にpacmanを使っていたような気がする。Ubuntuしか使えないからわからん。↩ -
ちなみに、後で貼るリンクにある通り、“The most important pacman command is –sync or for short: -S. This command is used to refresh the index of available packages, and install packages in your Rtools.”とあるので、パッケージを
pacman -S
でインストールするたびにインデックスがリフレッシュされるようなので、この操作はいらない疑惑もあるが、同じページにまずこれやっとけと書いてあるのでちゃんと言われたとおりにやる。↩