2011-11-25 66 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