Makefile用于呈现目录中所有.Rmd文件的所有目标

时间:2017-10-20 12:20:22

标签: r macos makefile knitr r-markdown

我的目标是拥有一个通用的Makefile,我可以将其复制到我有RMD文件的每个目录中,在该目录中调用make时,将在此目录中呈现所有.Rmd文件中定义的所有目标目录。

下面的Makefile仅用于按预期呈现最后一个文件。我确信我做的是一些简单的错误。

如何修改Makefile以使其完成预期的操作?

另外:当我第二次运行make时,会再次生成所有文件,但没有更改SOURCE文件。

我有以下Makefile:

SOURCES=$(shell find . -name "*.Rmd")
TARGETS_pdf=$(SOURCES:%.Rmd=%.pdf)
TARGETS_html=$(SOURCES:%.Rmd=%.html)
TARGETS_nb_html=$(SOURCES:%.Rmd=%.nb.html)
TARGETS_docx=$(SOURCES:%.Rmd=%.docx)

default: $(SOURCES)
    $(info Generating defined targets from $(SOURCES))
    @echo "$< -> $@"
    @Rscript -e "rmarkdown::render('$<', output_format = 'all')"

clean:
    rm -rf $(TARGETS_pdf)
    rm -rf $(TARGETS_html)
    rm -rf $(TARGETS_nb_html)
    rm -rf $(TARGETS_docx)

感谢。

1 个答案:

答案 0 :(得分:0)

当你运行make时,它会执行它找到的第一个规则。在您的情况下,它是default。然后检查该文件是否存在。如果没有,则运行脚本,该脚本应生成目标文件(default)。你的脚本不这样做。这就是下次make run的原因,它会重新开始。如果文件存在,则不需要运行脚本。

你能做的是:

SOURCES=$(shell find . -name "*.Rmd")
TARGET = $(SOURCES:%.Rmd=%.pdf) $(SOURCES:%.Rmd=%.html) $(SOURCES:%.Rmd=%.nb.html) $(SOURCES:%.Rmd=%.docx)

%.docx %.nb.html %.html %.pdf: %.Rmd
    Rscript -e "rmarkdown::render('$<', output_format = 'all')"

default: $(TARGET)

clean:
    rm -rf $(TARGET)