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

Why does Build & Reload recompile all C++ files even when these are unchanged?

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

来自RStudio webpage

Incremental Rebuilds

By default RStudio performs incremental rebuilds of packages. C++ files are only recompiled when they change or any header files change. This provides fast turnaround for incremental development.

在一台机器上,如果我修改了一个简单的 .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

等等

更改了一个 .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. 即使按照@DirkEddelbuettel 的建议,在Makevars 中使用ccache 后,问题也没有消失(尽管由于其他原因这是一个好主意,所以我现在正在使用它).

  3. 如果我取消选中 Roxygen 选项中的 Build and Reload,问题 确实 消失了 项目选项的构建工具窗格中的框:

公平的问题。快速且有点相关的内容,但有一些警告:

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

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

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

  • AFAIK 这些根本没有 make 的逻辑,除非需要

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

  • 以前被咬过,我更喜欢清洗后重建

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

但不要绝望:唯一最好的技巧是......通过使用

避免这种情况
 CC=ccache gcc
 CXX=ccache g++

等等,同上 OS X 下的 clang。只要相信 awesome ccache 前端和你的重建(不变的代码)将快如闪电。多年来,我一直在我的工作和家用机器上这样做。

这里有一个相关的子问题:when/how 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