有了明确的目标,我可以结合几个规则,比如
foo.o bar.o: $(SOURCES)
cc $< -o $@
这相当于
foo.o: $(SOURCES)
cc $< -o $@
bar.o: $(SOURCES)
cc $< -o $@
但我想使用模式规则。
我有几个 troff 文档(man
, README
),我想生成.html
和.ascii
文件。
天真的方法是
GROFF := groff
DOCS := man README
DOC_FILES = $(foreach doc,$(DOCS),$(doc).html $(doc).ascii)
CALL_GROFF = $(GROFF) -T$(subst $*.,,$@) -mman $< > $@
%.html %.ascii: %.doc
$(CALL_GROFF)
.DEFAULT: all
all: $(DOC_FILES)
.PHONY: clean
clean:
rm $(DOC_FILES)
但它不起作用,因为make
相信所有文件都是用一个命令创建的(很像&
现代make:https ://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html )
显然我可以
GROFF := groff
DOCS := man README
DOC_FILES = $(foreach doc,$(DOCS),$(doc).html $(doc).ascii)
CALL_GROFF = $(GROFF) -T$(subst $*.,,$@) -mman $< > $@
%.ascii: %.doc
$(CALL_GROFF)
%.html: %.doc
$(CALL_GROFF)
.DEFAULT: all
all: $(DOC_FILES)
.PHONY: clean
clean:
rm $(DOC_FILES)
但它是一种复制粘贴。
可以用 GNU make 解决吗?