为什么 Build & Reload 会重新编译所有 C++ 文件,即使这些文件没有更改?

Ken*_*oit 4 rcpp rstudio roxygen2

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

RStudio 网页

增量重建

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

在一台机器上,如果我修改一个简单的 .R 文件,或者即使我根本不修改任何文件,并选择Build & Reload,那么 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
Run Code Online (Sandbox Code Playgroud)

ETC

更改了一个.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
Run Code Online (Sandbox Code Playgroud)

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

更新

  1. 在克隆到非 Dropbox 本地存储库并在两台计算机上构建后,我已经验证这不是 Dropbox 造成的。

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

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

氧气选项

Dir*_*tel 5

公平的问题。快速且有些相关的看法,但有一些警告:

  • 我更喜欢忽略/避免开发工具,因为我发现它会造成混淆。

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

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

  • make据我所知,除非需要,否则这些根本不具有不重建的逻辑

  • 另外,我们鼓励运行cleanup和删除现有的工件

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

所有这些都会导致全面重建。

但不要绝望:最好的技巧是......通过使用来避免这种情况

 CC=ccache gcc
 CXX=ccache g++
Run Code Online (Sandbox Code Playgroud)

等等,在clangOS X 下同上。只要相信出色的 ccache前端,您的重建(未更改的代码)将快如闪电。我已经在我的工作和家用机器上这样做很多很多年了。

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

编辑:为了方便起见,下面是我在本地点文件存储库中的内容。我允许为 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
Run Code Online (Sandbox Code Playgroud)