Как упростить перечисление зависимостей в файле make - PullRequest
0 голосов
/ 27 февраля 2019

Цель

Я пытаюсь использовать файл Make для автоматизации создания фигуры на панели.Данные и цифры генерируются из Rscripts и впоследствии объединяются с использованием латекса для создания PDF.

Описание проблемы

Допустим, я хотел бы сгенерировать панельную фигуру, состоящую из 4 подфигур, расположенных в сетке 2x2.Используя следующий файл make, я могу сгенерировать как данные, так и подфигурки:

all : data/plot1.txt plots/plot1.pdf \
data/plot2.txt plots/plot2.pdf \
data/plot3.txt plots/plot3.pdf \
data/plot4.txt plots/plot4.pdf \
plots/figure_5.pdf

#Panel Figure#

#Plot 1
data/plot1.txt : scripts/plot1_sim.R
    Rscript scripts/plot1_sim.R $@

plots/plot1.pdf : scripts/plot1_sim.R data/plot1.txt
    Rscript scripts/plot1.R $@

#Plot 2
data/plot2.txt : scripts/plot2_sim.R
    Rscript scripts/plot2_sim.R $@

plots/plot2.pdf : scripts/plot2_sim.R data/plot2.txt
    Rscript scripts/plot2.R $@

#Plot 3
data/plot3.txt : scripts/plot3_sim.R
    Rscript scripts/plot3_sim.R $@

plots/plot3.pdf : scripts/plot3_sim.R data/plot3.txt
    Rscript scripts/plot3.R $@

#Plot 4
data/plot4.txt : scripts/plot4_sim.R
    Rscript scripts/plot4_sim.R $@

plots/plot4.pdf : scripts/plot4_sim.R data/plot4.txt
    Rscript scripts/plot4.R $@

Используя латексный файл, например figure.tex Я могу скомпилировать рисунок панели по своему усмотрению.

Однако теперь я хотел бы добавить конструкцию окончательного PDF по латексу в файл make.Этот файл, конечно, зависит от plots/plot1.pdf до plots/plot4.pdf включительно.

Я добавил его в код следующим образом:

plots/figure.pdf : scripts/figure.tex plots/plot1.pdf plots/plot2.pdf plots/plot3.pdf plots/plot4.pdf
    pdflatex scripts/figure.tex

С четырьмя подфигурами можно (но, возможно, некрасиво) сделать это так, но если вы сгенерируете рисунок панели с16 подфигур, код становится нечитаемым.

Вопрос

Есть ли лучший способ включить больший список зависимостей, в данном случае для создания панельных фигур с использованием make и latex?

1 Ответ

0 голосов
/ 28 февраля 2019

Насколько я понимаю, вы, вероятно, могли бы все это разложить на что-то вроде:

SIMRS    := $(wildcard scripts/plot*_sim.R)
PLOTS    := $(patsubst scripts/plot%_sim.R,%,$(SIMRS))
PDFPLOTS := $(patsubst %,plots/plot%.pdf,$(PLOTS))
TXTPLOTS := $(patsubst %,data/plot%.txt,$(PLOTS))

.PHONY: all

all: $(TXTPLOTS) $(PDFPLOTS) plots/figure_5.pdf

data/plot%.txt : scripts/plot%_sim.R
    Rscript $< $@

plots/plot%.pdf : scripts/plot%_sim.R data/plot%.txt
    Rscript scripts/plot$*.R $@

plots/figure.pdf: scripts/figure.tex $(PDFPLOTS)
    pdflatex $<

Обратите внимание, что шаблонное правило plots/plot%.pdf: ... выглядит странно: его рецепт использует scripts/plotX.R, но его предварительные условия: scripts/plotX_sim.R и data/plotX.txt (нет scripts/plotX.R).Это нормально?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...