2017-10-20 218 views
1

我的目标是有一个通用的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) 

感谢。

回答

0

当您运行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)