繁体   English   中英

用于构建链接到分析的 R 包的 Makefile

[英]Makefile for building an R package linked to an analysis

假设我有一个项目,我已经为其开发了一个 R 包。 层次结构可能看起来像这样。

/project
---Makefile
---workflow.R
---test.R
---/mypackage
    ---DESCRIPTION
    ---NAMESPACE
    ---/R
        ---func1.R
        ---func2.R

workflow.R mypackage取决于正在安装的最新版本的mypackage 但是,如果包中的任何文件已被修改,我只想重新构建包。

目前,在我的 Makefile 中,我有:

PACKAGE=$(wildcard mypackage/**/*)

all: install test workflow

install: $(PACKAGE)
    R CMD INSTALL mypackage

workflow: install
    Rscript workflow.R

test: install
    Rscript test.R

但是,每次运行make test时,这都会重新安装包,即使包内没有任何更改。 有没有干净的方法来避免这种情况?

install规则不会在当前目录中创建名为install的文件,因此每次都会尝试重新制作它。 这看起来应该是一个.PHONY目标,但它本身并不能解决问题,因为它仍然会执行配方。

一种解决方案是使用另一个规则来创建存根文件:

.PHONY: all install test workflow

all: install test workflow

install: install.done
install.done: $(PACKAGE)
    R CMD INSTALL mypackage
    touch $@

或者您可以只install存根文件本身并使其成为非.PHONY规则。

听起来您想将安装视为中间步骤。 您可以通过添加来做到这一点

.INTERMEDIATE: install

到你的makefile。

制作手册解释( 链接):

如果一个普通文件 b 不存在,并且 make 考虑一个依赖于 b 的目标,它总是创建 b,然后从 b 更新目标。 但是如果 b 是一个中间文件,那么 make 可以很好地保持原样。 它不会更新 b 或最终目标,除非 b 的某些先决条件比该目标更新或有其他原因更新该目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM