1) https://cran.r-project.org/bin/windows/base/howto-R-devel.html # the canonical guide for compiling R-devel on Windows using Rtools
2) https://www.r-bloggers.com/2022/01/building-r-4-2-for-windows-with-openblas/ # adapt parts of this guide to get openblas with R
根据上述两个链接,以下是一些基本步骤:
1. 安装 Rtools43
(i) 下载; (ii) 将其安装到默认位置(即C:\rtools43
)
2. 安装 MikTeX 和 Inno Setup
MikTeX(带有基本包和 inconsolata)用于构建软件包的vignettes和文档。Inno Setup 用于构建 R 安装程序。
3. 通用设置
运行 Msys2 shell (c:/rtools43/msys2.exe
)
创建一个文件夹来存储源代码:mkdir /c/R-devel
更新 Msys2:pacman -Syuu
它可能首先只会更新核心内容,然后要求您关闭终端。您应该按照说明操作,然后重新启动 Msys2 shell 并再次运行 pacman -Syuu
以完全更新所有组件
安装 wget 和 subversion:pacman -Sy wget subversion
将工作目录更改为步骤 3.2 中创建的文件夹:cd /c/R-devel
从 这里 获取最新的 Tcl/Tk 捆绑包,文件名类似于 tcltk-5493-5412.zip
:
TCLBUNDLE=tcltk-5493-5412.zip
wget https://cran.r-project.org/bin/windows/Rtools/rtools43/files/$TCLBUNDLE
获取最新的 R 版本(R-devel),并解压缩 Tcl:
svn checkout https://svn.r-project.org/R/trunk
cd trunk
unzip ../$TCLBUNDLE
4. 在 /c/R-devel/trunk/src/gnuwin32/
中添加一个 MkRules.local
您可以使用 Notepad++ 创建一个新的 MkRules.local
文件,并包含以下内容(请在第2步中将 ISDIR = ...
编辑为相应的目录):
USE_ATLAS = YES
EOPTS = -march=native -pipe
QPDF = /usr
ISDIR = C:/Program Files (x86)/Inno Setup 6
5. 调整 /c/R-devel/trunk/src/extra/blas/Makefile.win
您可以使用Notepad++将该行代码:-L../../../$(IMPDIR) -lR -L"$(ATLAS_PATH)" -lf77blas -latlas
修改为 -L../../../$(IMPDIR) -lR -fopenmp -lopenblas
- -L../../../$(IMPDIR) -lR -L"$(ATLAS_PATH)" -lf77blas -latlas
+ -L../../../$(IMPDIR) -lR -fopenmp -lopenblas
6. 编译 R
运行Msys2 shell并切换到适当的工作目录:cd /c/R-devel/trunk/src/gnuwin32/
设置环境变量如下(请在以下命令中更新MiKTeX安装目录):
export PATH=/x86_64-w64-mingw32.static.posix/bin:$PATH
export PATH=/c/Users/xxxxxxxx/AppData/Local/Programs/MiKTeX/miktex/bin/x64/:$PATH
export TAR="/usr/bin/tar"
export TAR_OPTIONS="--force-local"
测试工具是否可用:which make gcc pdflatex tar
构建R安装程序:
make rsync-recommended
make distribution
安装程序将位于:/c/R-devel/trunk/src/gnuwin32/installer/R-devel-win.exe
7. 测试我们的R编译是否使用了OpenBLAS
以下的R代码应该比从CRAN下载的标准Windows R运行得更快:
m <- 10000
n <- 2000
A <- matrix (runif (m*n),m,n)
system.time (S <- svd (A,nu=0,nv=0))
user system elapsed
4.02 0.65 7.83