2017-10-20 128 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)