【问题标题】:How do I see and replicate the R default Makevars configuration?如何查看和复制 R 默认 Makevars 配置?
【发布时间】:2017-10-23 07:16:43
【问题描述】:

我没有~/.R/Makevars 文件和

> tools::makevars_user()
character(0)
> tools::makevars_site()
character(0)

然而,R 必须从某处读取配置,因为 .cpp 文件包含 Rcpp 导出包中的 src 子目录编译正常。

我很想知道如何在src 目录中编写Makefile.win,以便Rcpp 文件与TMB .cpp 文件一起继续编译。目前是一个像这样的makefile:

all: fn1.dll fn2.dll

fn1.dll: fn1.cpp
    Rscript --vanilla -e "TMB::compile('fn1.cpp')"

fn2.dll: fn2.cpp
    Rscript --vanilla -e "TMB::compile('fn2.cpp')"

clean:
    rm -rf *o

可以很好地编译TMB 文件,实际上是由https://github.com/kaskr/adcomp/issues/43 建议的

我尝试修改 Dirk here 建议的 makefile,但即使使用全新的测试包也无法复制 R 的默认行为。

我的会话信息:

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

【问题讨论】:

  • 规则一:不要写Makefile,只写Makevars sn-p。有关详细信息,请参阅“编写 R 扩展”,并以数千个 CRAN 包为例。
  • 至于您的问题本身:$(RHOME)/etc/Makeconf 就是它所在的位置。
  • 谢谢。我希望过渡到Makevars sn-p,但我只需要知道如何将TMB 位集成到其中。
  • 啊,我的系统在$(RHOME)/etc/x64/Makeconf$(RHOME)/etc/i386/Makeconf

标签: c++ r makefile rcpp tmb


【解决方案1】:

我仍然不知道如何使用Makevars 来做我想做的事,本质上是:

  1. 在 Rstudio (Windows 7) 中通过 Build and Reload 包为所有 Rcpp 导出文件执行普通默认 make。在后台,这会调用 Rcpp::compileAttributes(),然后继续运行其他包构建​​命令。
  2. 使用 Rstudio Build and Reload 执行另一个 make,但现在它读取的 Makefile 仅编译 TMB 代码。

但是,我确实有一个解决方法。从本质上讲,R extensions manual 声明:

可以使用以下 `src/install.libs.R' 文件复制接近默认行为的内容:

...

由于编译TMB.cpp文件的代码只是R命令,因此很容易将它们集成到这样的文件中:

# replicate default R
files <- Sys.glob(paste("*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)

# now do TMB files
cpp_files <- list.files('./TMB/', full.names = T, pattern = '*.cpp')

for (f in cpp_files) {
    TMB::compile(f)
}

files <- Sys.glob(paste("./TMB/*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)

该文件读取并编译所有TMP类型.cpp文件,存放在子目录&lt;pkgdir&gt;/src/TMB中,然后将&lt;pkgdir&gt;/src/&lt;pkgdir&gt;/src/TMB中的所有后续.dlls复制到安装目录包。

注意,当 TMB 文件存储在子目录中时,it is possible, but possibly very difficult 使用 Makevars 完成编译。 Dirk 推荐了 matrix package 中的示例,但我没有运气修改那里的代码来做我想做的事。

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多