[英]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.