我想使用makefile来更新R代码生成的图形文件。 R代码位于目录../R
中的各种文件中,所有文件都以.R
结尾。图文件位于../figs
目录中,所有文件均以.pdf
或.png
结尾。如果R文件的日期晚于任何图形文件,我想用命令
R --no-save < file.R
我看了很多示例makefile,但找不到任何我能适应的东西。
我目前的努力(不工作)如下:
PLOTDIR= ../figs
RDIR= ../R
RFILES= $(RDIR)/*.R
PLOTS= *.pdf *.png
FIGURES= $(PLOTDIR)/$(PLOTS)
$(FIGURES): $(RFILES)
R --no-save < $<
答案 0 :(得分:2)
您可以尝试以下操作。
技巧是你需要从输入(.R文件)中推断出输出
# Makefile
# Beware of indentation when copying use TABS
PLOTDIR = ../figs
RDIR = ../R
# list R files
RFILES = $(wildcard $(RDIR)/*.R)
# compute output file names
PDF_FIGS = $(RFILES:.R=.pdf)
PNG_FIGS = $(RFILES:.R=.png)
# relocate files in output folder
OUT_FILES = $(subst $(RDIR), $(PLOTDIR), $(PDF_FIGS) $(PNG_FIGS))
# first target is the default: simply do 'make'
all: $(OUT_FILES)
clean:
rm $(OUT_FILES)
.PHONY: all clean
# need to split PNG from PDF rules
$(PLOTDIR)/%.png: $(RDIR)/%.R
R --no-save < $<
$(PLOTDIR)/%.pdf $(PLOTDIR)/%.png: $(RDIR)/%.R
R --no-save < $<
编辑以反映我的评论:每个R脚本使用1个依赖项输出文件
PLOTDIR= ../figs
RDIR= ../R
# list R files
RFILES := $(wildcard $(RDIR)/*.R)
# relocate files in output folder
OUT_FILES=$(subst $(RDIR), $(PLOTDIR), $(RFILES:.R=.out))
#$(warning $(OUT_FILES))
# first target is the default: simply do 'make'
all: $(OUT_FILES)
clean:
rm $(OUT_FILES)
.PHONY: all clean
$(PLOTDIR)/%.out: $(RDIR)/%.R
R --no-save < $< && touch $@
答案 1 :(得分:1)
一个有趣的问题。它在逻辑上很简单,但却与Make喜欢做的事情相悖。
这似乎有效。它依赖于模式规则的一个模糊特征:如果模式规则具有多个目标,则表示只需运行一次即可更新其所有目标。
PLOTDIR = ../figs
RDIR = ../R
RFILES = $(wildcard $(RDIR)/*.R)
FIGURES = $(wildcard $(PLOTDIR)/*.pdf $(PLOTDIR)/*.png)
all: $(FIGURES)
$(PLOTDIR)/%.pdf $(PLOTDIR)/%.png: $(RFILES)
@for x in $?; do R --no-save \< $$x; done