我的目标是拥有一个通用的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)
感谢。
答案 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)