Saída para vários arquivos com Makefile

Saída para vários arquivos com Makefile

Eu tenho um makefile que uso para converter arquivos markdown em .pdf por meio de um modelo de látex. No momento, isso só funciona com um arquivo por vez. No entanto, eu gostaria que o makefile fosse executadoqualquerarquivo markdown no diretório ativo e saída para um .pdf com o mesmo nome com um único comando make. Por exemplo, eu poderia ter o seguinte:

Foo.md ---> Foo.pdf

Barra.md ---> Barra.pdf

Meu makefile atual está aqui:

TEX = pandoc
MEXT = md
src = template.tex $(wildcard *.$(MEXT))
FLAGS = --latex-engine=xelatex

letter.pdf : $(src)
$(TEX) $(filter-out $<,$^ ) -o $@ --template=$< $(FLAGS)

.PHONY: clean
clean :
rm output.pdf

Obrigado por qualquer indicação...

Responder1

Experimente isto:

TEX = pandoc
MEXT = md
SRC = $(wildcard *.$(MEXT))
PDFS = $(SRC:.md=.pdf)
TMP = template.tex
FLAGS = --latex-engine=xelatex

all:    ${PDFS}

%.pdf:  %.md ${TMP}
        ${TEX} $(filter-out $<,$^ ) -o $@ --template=${TMP} $(FLAGS) $<


.PHONY: clean
clean:
        rm *.pdf

Responder2

Não testei isso completamente, mas acho que deve funcionar com algumas modificações. Usando o loop for:

TEX = pandoc
MEXT = md
SRC = $(wildcard *.$(MEXT))
TMP = template.tex
FLAGS = --latex-engine=xelatex

letter.pdf : 
    $(foreach i, $(SRC), $(TEX) -o $(i).pdf --template=$(TMP) $(FLAGS) $(i);)

.PHONY: clean
clean :
    rm -f *.pdf

Observe também que esta solução não produzirá pdfarquivos exatamente com o mesmo nome dos mdarquivos:

foo.md -> foo.md.pdf

Não deve ser difícil de consertar.

Responder3

# List files to be made by finding all *.md files and appending .pdf

PDFS := $(patsubst %.md,%.md.pdf,$(wildcard *.md))

# The all rule makes all the PDF files listed
all : $(PDFS)

# This generic rule accepts PDF targets with corresponding Markdown 
# source, and makes them using pandoc
%.md.pdf : %.md
    pandoc --latex-engine=xelatex $< -o $@

# Remove all PDF outputs
clean :
    rm $(PDFS)

# Remove all PDF outputs then build them again
rebuild : clean all

informação relacionada