如何使用Gnu Make执行支票列表?

时间:2016-03-09 10:36:58

标签: makefile gnu-make

我有一个Makefile,它应该对一组输入文件执行一些简单的命令。每个都没有输出,只需要检查命令的成功:

# Makefile
check: test1 test2 test3

test1: one.xml
    xmllint --schema my.xsd $@
test2: two.xml
    xmllint --schema my.xsd $@
test3: three.xml
    xmllint --schema my.xsd $@

我希望这更通用,我不必为每个文件列出相同的规则。例如,当我使用$(wildcard ...)

时,这尤其不方便
# Makefile (sketch only)
XMLS:=$(wildcard *.xml)

check: xmllint

xmllint: %.xml   # this will not work will it?  
    xmllint --schema my.xsd $@

当然,最后一条规则是正确的,因为%位于右侧:

  

$ make check

     

***没有规定制作'%。xml',xmllint'所需的目标。停止。

如何将$(XMLS)输入文件与xmllint: ...规则相关联,以便在make check上对所有xml输入文件执行程序xmllint

1 个答案:

答案 0 :(得分:2)

.PHONY: all check

# The files to be tested
XMLS:=$(wildcard *.xml)

# Turning the filenames into *test* names
XMLTESTS:=$(patsubst %.xml,%.test,$(XMLS))

# "make check" should run all tests
check: $(XMLTESTS)

# Each test depends on the XML file
# Now we have a pattern on both sides of the generic rule
%.test: %.xml
    xmllint --schema my.xsd $<

请注意,对于某些(对我而言)未知原因,在声明后添加.PHONY并向其添加$(XMLTESTS)会导致&#34;目标无需执行任何操作&#39;所有& #39;&#34 ;.我不明白为什么。

编辑: .PHONY:不适用于隐式规则和模式规则。