備忘ログ

チラシの裏的備忘録&メモ

Rtools40のpacmanを使ってライブラリをインストールする機会があったのでメモしておく

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


  1. DebianLinuxapt get updateみたいなものだと思う、記憶が正しければArch linux系でパッケージ管理にpacmanを使っていたような気がする。Ubuntuしか使えないからわからん。

  2. ちなみに、後で貼るリンクにある通り、“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でインストールするたびにインデックスがリフレッシュされるようなので、この操作はいらない疑惑もあるが、同じページにまずこれやっとけと書いてあるのでちゃんと言われたとおりにやる。

  3. “R pacman"で調べると、こっちじゃなくてRのパッケージ管理用のpacmanが結構ヒットする。