我有一个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
?
答案 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:
不适用于隐式规则和模式规则。