如何查看和复制R默认Makevars配置?

时间:2017-10-23 07:16:44

标签: c++ r makefile rcpp tmb

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

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

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

我很想知道如何在Makefile.win目录中编写src,以便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

1 个答案:

答案 0 :(得分:0)

我仍然不知道如何使用Makevars来做我想要的,基本上是这样的:

  1. 对于所有make导出文件,通过Build and Reload包在Rstudio(Windows 7)中执行正常默认Rcpp。在引擎盖下,这将调用Rcpp::compileAttributes()然后继续运行其他包构建​​命令。
  2. 使用Rstudio make执行另一个Build and Reload,但现在只读取仅编译Makefile代码的TMB
  3. 然而,我确实有一个解决方法。基本上,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类型<pkgdir>/src/TMB文件,然后复制.dll中的所有后续<pkgdir>/src/个}和<pkgdir>/src/TMB到软件包的安装目录。

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