【发布时间】:2019-05-23 21:18:09
【问题描述】:
使用 GNU make,我正在尝试解决类似于 make recipe execute twice 的问题 — 即让 Makefile 配方运行两次。然而,就我而言,配方在.SECONDEXPANSION 目标下运行,并且将使用不同的参数调用两次不同的运行,以从同一输入文件生成不同版本的输出文件。也就是说,对于输入文件foo,这个示例Makefile 应该可以通过make foo.pdf 或make foo.expanded.pdf 调用来构建一个.pdf 文件,或者make all 来构建两个.pdf 文件:
.PHONY: all
all: foo.pdf foo.expanded.pdf
.SECONDEXPANSION:
%.expanded.pdf %.pdf: %
@echo building $(basename $@)
在该答案中给出的两个解决方案中,第一个是不合适的,因为它总是运行规则两次;我希望它在用户请求时运行两次。
第二个解决方案在概念上是我正在寻找并在上面的示例 Makefile 中实现的,只有一个小问题它不起作用:尽管all 目标将两个 .pdf 文件都列为依赖项,运行make all 时只构建一个。
有没有办法告诉 GNU make 在 .SECONDEXPANSION 下使用相同的规则构建两个不同的文件?
编辑:在问题描述中澄清了相同的输入文件用于构建输出文件的两个版本,并修改了示例 Makefile 以包含此依赖项。
编辑:我想要一个尽可能可扩展的解决方案;也就是说,如果输入文件名包含点,它应该可以工作,指定额外的输出文件 foo.reduced.pdf 应该只需要适当地调整目标和配方等。这限制了执行依赖于文件名的字符串手术示例(例如,如果输入文件可能是 foo 或 foo.bar,则将规则更改为 %.pdf: $$(firstword $$(subst ., ,$$*)) 失败)。
【问题讨论】: