2017-10-20 1 views
1

私の目的は、このディレクトリのmakeを呼び出してすべてのターゲットをレンダリングするRMDファイルを持つ各ディレクトリにコピーできるユニバーサルMakefileを持つことですこのディレクトリ内のすべての.Rmdファイルで定義されています。ディレクトリ内のすべての.Rmdファイルのすべてのターゲットをレンダリングするメイクファイル

以下のMakefileは、最後のファイルを期待通りにレンダリングするためだけに機能します。私は何か簡単なことを間違っていると確信しています。

Makefileを変更する必要があるため、どうすればよいですか?

また、makeを2回実行すると、すべてのファイルが再度生成されますが、SOURCEファイルは変更されません。

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) 

ありがとう:

は、私は次のMakefileを持っています。

答えて

0

makeを実行すると、見つかった最初のルールが実行されます。あなたの場合はdefaultです。このファイルが存在するかどうかをチェックします。そうでなければ、ターゲットファイル(default)を生成するはずのスクリプトが実行されます。あなたのスクリプトはそれをしません。だから、次回はmakeを走らせると、それはもう一度始まります。ファイルが存在する場合は、スクリプトを実行する必要はありません。あなたは何ができるか

はこれです:

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) 
関連する問題