GNU make中定义双向规则如何避免Circular dependency dropped报错
循环依赖报错原因
你定义的两条通用模式规则形成了闭环:%.tex 依赖 %.md,而 %.md 又反过来依赖 %.tex。当目录下同时存在同名的md和tex文件时,GNU Make在推导依赖关系时会识别出循环,因此抛出该错误并丢弃其中一条依赖规则。
解决方案
方案1:使用静态模式规则限定匹配范围(推荐)
静态模式规则只会对显式指定的目标文件生效,不会像通用模式规则那样全局匹配所有同后缀文件,从根源避免形成循环依赖链:
# 声明要处理的文件列表 MD_FILES = $(wildcard *.md) TEX_FROM_MD = $(patsubst %.md,%.tex,$(MD_FILES)) TEX_FILES = $(wildcard *.tex) MD_FROM_TEX = $(patsubst %.tex,%.md,$(TEX_FILES)) # 伪目标定义 .PHONY: md-to-tex tex-to-md clean # 转换所有Markdown为LaTeX md-to-tex: $(TEX_FROM_MD) $(TEX_FROM_MD): %.tex: %.md pandoc --from markdown --to latex --output $@ $< # 转换所有LaTeX为Markdown tex-to-md: $(MD_FROM_TEX) $(MD_FROM_TEX): %.md: %.tex pandoc --from tex --to markdown --output $@ $< clean: rm -f $(TEX_FROM_MD) $(MD_FROM_TEX)
使用方式:
- 执行
make md-to-tex批量把当前目录所有md文件转为tex - 执行
make tex-to-md批量把当前目录所有tex文件转为md
方案2:添加伪目标打断依赖链
如果需要保留通用模式规则的写法,可以添加不存在的伪目标作为中间依赖,阻止Make反向推导形成闭环:
%.tex: %.md .flag_tex pandoc --from markdown --to latex --output $@ $< %.md: %.tex .flag_md pandoc --from tex --to markdown --output $@ $< .PHONY: .flag_tex .flag_md .flag_tex .flag_md: @:
内容的提问来源于stack exchange,提问作者Benjamin Higgins
相关产品推荐
相关产品推荐

