GNU make 中的双向规则,没有循环依赖错误?

Bidirectional rules in GNU make, without circular dependency error?

在定义一对双向规则时,如何避免 GNU make 的 Circular ... dependency dropped 错误?

这是基于 pandoc 的工作流程,其中输入和输出(理论上)是双射的。我可能会从 Markdown 生成 LaTeX 文件,直接更新 LaTeX,稍后希望转换回 Markdown。

如果输出文件已经存在,应该覆盖它。

%.tex: %.md
    pandoc --from markdown --to latex --output $@ $<

%.md: %.tex
    pandoc --from tex --to markdown --output $@ $<

您所能做的就是关闭一个或另一个规则,具体取决于您要构建的内容。例如:

ifeq (,$(filter %.tex,$(MAKECMDGOALS)))
%.md: %.tex
        pandoc --from tex --to markdown --output $@ $<
else
%.tex: %.md
        pandoc --from markdown --to latex --output $@ $<
endif

我意识到有一个非常简单的解决方案:只需从一个(或两个)规则中删除依赖项,在规则中处理扩展,然后使用 -B 标志进行构建。

假设有一个主要方向,一个不太重要或用于调试,则可以从不太重要的规则中删除依赖项。

make -B foo.md

%.tex: %.md
    pandoc --from markdown --to latex --output $@ $<

%.md:
    pandoc --from tex --to markdown --output $@ $(basename $@).tex