2011-11-25 64 views
2

我有許多標記文本格式的文本文件,我想使用GNU make來生成HTML輸出。我有這個Makefile與只有一個文件的工作原理:GNU makefile中的通配符

MARKDOWN=markdown2 

all: my_article_1242323266.html 

%.html: %.markdown 
    $(MARKDOWN) $< [email protected] 

clean: 
    rm -f *html 

現在,我希望把它與所有的降價/ HTML文件的工作,但我不想列出在Makefile我的所有文件。我試過$(通配符* .html),但它不能工作,因爲我沒有目錄中的「源」文件。怎麼做?

回答

3
MARKDOWN = markdown2 
HTMLS = $(patsubst %.markdown,%.html,$(wildcard *.markdown)) 

all: $(HTMLS) 

%.html: %.markdown 
    $(MARKDOWN) $< [email protected] 

clean: 
    rm -f $(HTMLS) 
3

使用類似這樣的SOURCES = $(shell find。-name「* .cpp」-print | sort)。這將讓所有的cpp文件

+0

那麼它不工作,它的上市HTML文件,但有沒有。 – lzap

+0

如果你在你的linux系統上找到並排序,我認爲默認安裝的話,它是行不通的。你把擴展名改爲* .html嗎? – v01d

+0

那麼所有的目標需要目標列表,而不是來源。看到我的答案。再次感謝你的幫助。 – lzap

1

謝謝v01d,我修改了他的解決方案到這一點:

MARKDOWN=markdown2 

SOURCES=$(shell find . -name "*.markdown" | sed 's/markdown/html/') 

all: $(SOURCES) 

%.html: %.markdown 
    $(MARKDOWN) $< [email protected] 

clean: 
    rm -f *html 
+1

該解決方案有四個缺點。首先,它不適用於諸如markdown-tutorial.markdown之類的文件名。其次,它需要外部命令「查找」和「sed」。這些最有可能在Linux/Unix下提供,但是一種純粹的解決方案會更快。第三,變量名稱SOURCES具有誤導性,因爲它包含目標。最後,「乾淨」應該只刪除目標。看到我的答案。 – 0xF