MacOS的ARM64的R如何解決編譯問題

先參考https://mac.r-project.org/tools/ 安裝好XCode和gfortran

目前(截止到2022年2月份), Arm64架構(gòu)的R能夠直接安裝CRAN絕大部分的R包,但是Bioconductor的R包都需要編譯(這也就為什么我推薦用Intel架構(gòu)的R,可以避免遇到要編譯R包里的坑)。

編譯R包最怕遇到的問題,就是遇到R以外的底層庫的依賴,比如說Rhtslib, 就要求編譯htslib, 而htslib依賴lzma是MacOS默認(rèn)沒有安裝,因此我們會(huì)因?yàn)槿鄙賦z庫的支持,導(dǎo)致htslib編譯失敗,從而導(dǎo)致Rhtslib安裝失敗,間接導(dǎo)致所有依賴于Rhtslib的R包無法使用。還有一些R包編譯需要gsl庫,就會(huì)因?yàn)檎也坏?gsl-config 而報(bào)錯(cuò)。

經(jīng)過我不斷踩坑后,我整理了解決方案。后續(xù),如果你也打算在Arm64的Mac上安裝原生的R,就按照我的思路來配置

首先,你需要安裝homebrew, 國內(nèi)用戶推薦按照清華鏡像里的方案來配置,https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ , 能夠避免網(wǎng)絡(luò)問題導(dǎo)致的坑。在海外的朋友,就按照官方站點(diǎn), brew.sh 的命令來配置。

homebrew會(huì)安裝在 /opt/homebrew下,該目錄里面包括后續(xù)安裝的軟件(bin), 頭文件(include)和動(dòng)態(tài)鏈接庫(lib).

之后,我們需要為R配置相關(guān)環(huán)節(jié),使得R能夠調(diào)用到homebrew安裝的環(huán)境。

我們需要打開R,然后運(yùn)行如下命令

file.edit(file.path(Sys.getenv("R_HOME"), "etc", "Makeconf"))

如此就能打開R的Makeconf文件,R就通過該文件里面的參數(shù)來進(jìn)行R包和底層依賴的編譯。我們搜索搜索 CFLAG, 添加 -I/opt/homebrew/inlucde, 搜索LDFLAGS, 添加 -L/opt/homebrew/lib, 效果如下

CFLAGS = -I/opt/homebrew/include -falign-functions=64 -Wall -g -O2 $(LTO)
LDFLAGS = -L/opt/R/arm64/lib -L/opt/homebrew/lib

重啟R/RStudio之后,你就能編譯安裝Rhtslib(當(dāng)然你需要先運(yùn)行 brew install xz,把lzma.h 裝好`)

BiocManager::install("Rhtslib")

此外你可能還會(huì)遇到gsl-config not found報(bào)錯(cuò),盡管你明明用brew install gsl安裝了軟件,也能夠在命令行中成功調(diào)用 gsl-config,但是R就是視而不見。 這是因?yàn)镽讀取的變量,默認(rèn)就來自于MacOS的環(huán)境變量來自于 /etc/path文件和 /ect/path.d目錄里。 因此,你即便在.zshrc, 或者.bashrc里面加入了 homebrew 的路徑,R也是不認(rèn)的。

解決方案,打開R,然后運(yùn)行如下命令,

file.edit("~/.Rprofile")

添加如下內(nèi)容,修改R啟動(dòng)時(shí)的環(huán)境變量

Sys.setenv("PATH"=paste0( "/opt/homebrew/bin:/opt/homebrew/sbin:",  Sys.getenv("PATH")))

重啟R/Rstudio之后,R就能夠用到homebrew安裝的程序了。

或者,我們也可以下載到本地,用 R CMD INSTALL進(jìn)行編譯安裝,以DirichletMultinomial為例

wget https://mirrors.tuna.tsinghua.edu.cn/bioconductor/packages/3.14/bioc/src/contrib/DirichletMultinomial_1.36.0.tar.gz
R CMD INSTALL DirichletMultinomial_1.36.0.tar.gz

總結(jié)一下:

  1. 通過homebrew來安裝依賴環(huán)境
  2. 編譯R的Makeconf使得R能夠調(diào)用homebrew里的include和lib
  3. 編譯R的.Rprofile修改PATH,使得R能夠用到hombrew的bin的程序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容