Makefile来渲染所有.Rmd文件的所有目标目录
问题描述:
我的目标是有一个通用的Makefile,我可以复制到每个目录下我有一个RMD文件,该文件,在该目录中调用make
,使所有目标在此目录中的所有.Rmd文件中定义。Makefile来渲染所有.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 "$< -> [email protected]"
@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)
感谢。
答
当您运行make
时,它会执行它找到的第一个规则。在你的情况下,它是default
。它会检查这个文件是否存在。如果没有,则运行该脚本,该脚本应该生成目标文件(default
)。你的脚本不会那样做。这就是为什么下一次运行,它重新开始。如果文件存在,则脚本不需要运行。
你可以做的是这样的:
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)