Makefile只识别已更改的先决条件,而不是新的先决条件

时间:2018-03-16 03:05:18

标签: makefile gnu-make

尝试编写一个简单的makefile,使用Pandoc将Markdown文件编译为HTML。我不想将所有必备.md文件显式添加到makefile中,因此我尝试使用模式规则和通配符先决条件:

all: www/*.html

www/%.html: src/%.md
    pandoc -f markdown -t html $< > $@

这很接近,但只处理.md目标文件已存在并且已过期的先决条件.html文件。已经没有.md文件的新.html文件会被忽略(因此,如果构建了所有非新文件,我会make: Nothing to be done for 'all'.

我错过的概念是什么?我不确定如何告诉make在.md中更改的AND src/文件上运行,并将模式规则应用于每个文件。

2 个答案:

答案 0 :(得分:4)

您可以从.html目录中已有的.md文件中获取要生成的src/个文件的列表。

首先,可以使用wildcard内置函数获取现有.md文件的列表:

md-files := $(wildcard src/*.md)

然后,将substitution reference应用于md-files变量,以便删除src/前缀,并为每个.md替换后缀.html .md文件列表的元素:

$(md-files:src/%.md=%.html)

最后,通过将addprefix内置函数应用于结果列表,可以将前缀www/添加到该列表的每个元素中:

html-files := $(addprefix www/,$(md-files:src/%.md=%.html))

将所有内容放在一起,生成的makefile将是:

md-files := $(wildcard src/*.md)
html-files := $(addprefix www/,$(md-files:src/%.md=%.html))

.PHONY: all
all: $(html-files)

www/%.html: src/%.md
    pandoc -f markdown -t html $< > $@

答案 1 :(得分:1)

试试这个:

ORDER BY o.Order_ID;