Makefileを使用して複数のファイルに出力する

Makefileを使用して複数のファイルに出力する

私は、マークダウン形式のファイルをLaTeXテンプレートを使って.pdfに変換するのに使うmakefileを持っています。現時点では、これは一度に1つのファイルでしか動作しません。しかし、makefileをどれでもアクティブ ディレクトリに markdown ファイルを作成し、1 回の make コマンドで同じ名前の .pdf に出力します。たとえば、次のようになります。

Foo.md ---> Foo.pdf

バー.md ---> バー.pdf

現在の makefile は次の通りです:

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

何かアドバイスがあればよろしくお願いします。

答え1

これを試して:

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

答え2

完全にテストしたわけではありませんが、多少の修正を加えると動作すると思います。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

また、このソリューションでは、次のファイルpdfとまったく同じ名前のファイルは生成されないことに注意してください。md

foo.md -> foo.md.pdf

ただし、修正するのはそれほど難しくないはずです。

答え3

# 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

関連情報