为什么Build&重新加载重新编译所有C ++文件,即使这些文件没有改变?

时间:2016-12-30 19:07:29

标签: rstudio rcpp roxygen2

我在两台配置相同的机器上使用RStudio,甚至使用相同的.Rproj文件(来自Dropbox)。

来自RStudio webpage

  

增量重建

     

默认情况下,RStudio执行包的增量重建。 C ++文件只有在更改或任何头文件更改时才会重新编译。这为增量开发提供了快速周转。

在一台计算机上,如果我修改一个简单的.R文件,或者,即使我根本没有修改任何文件,也选择 Build&重新加载,然后C ++不会重新编译。

然而,另一方面,我得到:

没有更改文件:

==> devtools::document(roclets=c('rd', 'collate', 'namespace', 'vignette'))

Updating quanteda documentation
Loading quanteda
'/Library/Frameworks/R.framework/Resources/bin/R' CMD INSTALL '/Users/kbenoit/Dropbox (Personal)/GitHub/quanteda' --library='/var/folders/46/zfn6gwj15d3_n6dhyy1cvwc00000gp/T//RtmpowXjeu/devtools_install_cd475c156859' --no-R --no-data --no-help --no-demo --no-inst --no-docs --no-exec --no-multiarch --no-test-load --preclean
Re-compiling quanteda
clang++ -std=c++11 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/RcppParallel/include" -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/RcppArmadillo/include"   -fPIC  -Wall -mtune=core2 -g -O2 -c RcppExports.cpp -o RcppExports.o

更改了一个.R文件:
(这是一个没有实际功能的数据文档R文件)

==> Rcpp::compileAttributes()

* Updated src/RcppExports.cpp
* Updated R/RcppExports.R

==> devtools::document(roclets=c('rd', 'collate', 'namespace', 'vignette'))

Updating quanteda documentation
Loading quanteda
'/Library/Frameworks/R.framework/Resources/bin/R' CMD INSTALL '/Users/kbenoit/Dropbox (Personal)/GitHub/quanteda' --library='/var/folders/46/zfn6gwj15d3_n6dhyy1cvwc00000gp/T//RtmpLaNxr4/devtools_install_cdef692abc82' --no-R --no-data --no-help --no-demo --no-inst --no-docs --no-exec --no-multiarch --no-test-load --preclean
Re-compiling quanteda

问题:如何在必要时让第二台机器只进行增量构建,这是假设的默认行为?

更新

  1. 我已经确认这不是由于Dropbox,克隆到非Dropbox本地存储库并在两台计算机上构建。

  2. 即使在ccache中使用Makevars后,问题也不会消失,因为@DirkEddelbuettel建议(尽管出于其他原因这是个好主意,所以我现在正在使用它)。

  3. 如果我从“构建工具”窗格中的 Roxygen选项框中取消选中构建和重新加载 问题就会消失项目选项:

  4. Roxygen options

1 个答案:

答案 0 :(得分:3)

公平的问题。快速而有些相关的观点,有一些警告:

  • 我更喜欢忽略/避免使用devtools,因为我发现它混淆了。

  • 但下面的内容也适用于此。

  • 这里的关键命令是R CMD INSTALL及其朋友(即R CMD SHLIB等)

  • AFAIK这些根本不具备make的逻辑,除非必要,否则不会重建

  • plus 我们鼓励我们运行cleanup并删除现有工件

  • 过去曾被咬过,我更喜欢清洁后重建

所有这些都会导致完整(呃)重建。

但不要绝望:唯一最好的诀窍是......通过使用来避免这种情况

 CC=ccache gcc
 CXX=ccache g++

依此类推,OS X下clang的同意。只需信任 awesome ccache前端,你的重建(未更改的代码)就会闪电般快速。我在工作和家用机器上工作了很多年。

现在这里有一个相关的子问题:RStudio何时/如何为我们运行compileAttributes()?我不确定。我可能依赖(如make)时间戳,网络驱动器和共享可能存在问题。如果有疑问,我会通过一个更小的帮助脚本在命令行上本地执行此操作。

编辑:为方便起见,下面是我在本地dotfile仓库中的内容。我允许为gcc等设置一个版本,有时在编译器转换期间需要这个版本。当空的时候(就像现在一样)它没有坏处,我们只是得到g++等等。

#VER=-4.9
VER=
CCACHE=ccache
CC=$(CCACHE) gcc$(VER)
CXX=$(CCACHE) g++$(VER)
CXX1X=$(CCACHE) g++$(VER)

SHLIB_CXXLD=g++$(VER)

FC=ccache gfortran
F77=ccache gfortran