【问题标题】:Why does Build & Reload recompile all C++ files even when these are unchanged?为什么 Build & Reload 会重新编译所有 C++ 文件,即使这些文件没有改变?
【发布时间】:2016-12-30 19:07:28
【问题描述】:

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

来自RStudio webpage

增量重建

默认情况下,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

更改了一个 .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. 如果我在 Build Tools 窗格的 Roxygen 选项 框中取消选中 Build and Reload,问题确实 会消失项目选项:

【问题讨论】:

  • 好更新。我以前被这个咬过(但提到了我的解决方法)。我也倾向于设置“Build & Reload”标志,特别是对于我使用 roxygen2 文档的包。我从不让 roxygen 接触到DESCRIPTION、NAMESPACE、...或任何其他东西。这些都不能解释构建问题。也许是 roxygen 弄乱了时间戳?

标签: rstudio rcpp roxygen2


【解决方案1】:

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

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

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

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

  • AFAIK 这些根本没有make 的逻辑,除非需要,否则不会重建

  • 加上鼓励我们运行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

【讨论】:

  • 嗨@Dirk,我们是否需要将上述定义保留在Makevars 中的src 目录中?
  • 通常将它们放入用户自己的$HOME 目录的.R/ 子目录中的~/.R/Makevars 文件中。
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多