Make

在 GNU Make 中的文件列表中應用規則(或 GNU Make 中的“for”指令)

  • November 20, 2016

我的 GNU Makefile 中有這個規則:

FITXER = fitxa.md

$(FITXER).html: $(FITXER)
   pandoc --from markdown --to html $(FITXER) -o $(FITXER).html

$(FITXER).jpeg: $(FITXER).html
   wkhtmltoimage $(FITXER).html $(FITXER).jpeg

有沒有辦法在文件列表中應用此規則:例如類似的東西(在虛擬碼中):

for FITXER in [fitxa.md, a.md, b.md, ...] do

  $(FITXER).html: $(FITXER)
   pandoc --from markdown --to html $(FITXER) -o $(FITXER).html

  $(FITXER).jpeg: $(FITXER).html
   wkhtmltoimage $(FITXER).html $(FITXER).jpeg
endfor

解決這個問題的方法是定義一般的建構規則:

%.html: %.md
   pandoc --from markdown --to html $< -o $@

%.jpg: %.html
   wkhtmltoimage $< $@

這告訴make瞭如何從 Markdown 文件創建 HTML 文件,然後如何從 HTML 文件創建 JPEG。

完成此操作後,所需要做的就是告訴您所追求make的所有輸出文件:

all: fitxa.jpg a.jpg b.jpg

.PHONY: all

make all將弄清楚如何獲取請求的 JPEG 文件。

您仍然可以定義其他規則來以不同的方式處理特定的 Markdown 文件:

foo.jpg: foo.md
   # Process foo.md here to build foo.jpg

這些特定規則優先於通用規則。

引用自:https://unix.stackexchange.com/questions/324274