makefile - GNU make:一个模式规则中的多个目标
问题描述
有了明确的目标,我可以结合几个规则,比如
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 解决吗?
解决方案
推荐阅读
- regex - 301 重定向,通过正则表达式匹配 url。匹配破折号
- java - 如何比较两个不同类型的数组列表?
- azure - 如何在用户旅程中写入目录登录日志
- flutter - Flutter:提供者是 BLoC 模式的替代品吗?
- javascript - toUTCString 没有日期和时间 DD 月 yyyy
- linkedin - 从给定公司的 LinkedIn API 获取行业
- javascript - 在 Vue 挂载的钩子中加载 Twitter 时间线
- json - purescript-argonaut:解码任意键值 json
- javascript - 我应该将哪个类型的数组用于图像文件的 ArrayBuffer?
- design-patterns - 原型模式中的“Clone()”是否被视为工厂方法?