静态模式的规则失败

时间:2014-08-23 11:48:22

标签: makefile gnu-make

我有一个makefile,可以从一个BibTex文件中为不同的作者创建HTML发布列表。导出使用bibtex2html完成,就像一个魅力。但我坚持规则命名。我希望makefile尽可能通用,只有在新同事开始或有人完成博士学位时才能调整结果列表。

工作流程如下:

  1. bib.bib
  2. results中所有作者的出版物提取到单独的文件中:`bib2bib -c'作者:" $ *"' bib.bib'
  3. 现在每个作者都有文件,例如bib-Author1.bib,bib-Author2.bib,...
  4. 将文件转换为html:bibtex2html -d -r -o bib-$@.html bib-$@.bib
  5. 现在有一个名为bib-Author1.html,bib-Author2.html,....
  6. 的文件

    这是我遇到的当前makefile:

    objects = bib-*.bib
    results = Author1 Author2
    
    .PHONY : clean cleanall all $(results)
    .INTERMEDIATE : bib-*.bib
    
    all : $(results)
    
    $(results) : % : bib-%.html
    
    bib-%.bib :
      TMPDIR=. bib2bib -c 'author : "$*"' bib.bib
    
    bib-%.html : %.html : %.bib
      TMPDIR=. bibtex2html -d -r -o bib-$@.html bib-$@.bib
    
    #Left the clean and cleanall targets out to shorten the code snippet
    

    现在我用简单的make调用这个makefile,它执行所有目标。这将调用$(result)目标,该目标为结果中的每个作者调用bib - %。html目标。 这就出现了问题:调用时,使用错误混合隐式和静态模式规则来停止。

    我想要做的是将规则名称与静态模式%.html一起使用,并将其转换为先决条件%.bib。但显然,我做错了什么。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

在这个makefile中有几个错误 - 或者至少是奇怪的。你的问题并不完全清楚,所以有些猜测是必要的。

首先,尝试使用简单诊断命令的规则,以使序列正确。我想这就是你想要的:

bib-%.bib :
    @echo trying to build $@

bib-%.html : bib-%.bib
    @echo trying to build $@ after $<

然后完成一条规则并验证它是否符合您的要求:

bib-%.bib :
    TMPDIR=. bibtex2html-1.96-osx-x86_64/bib2bib -c 'author : "$*"' -s '$$date' bib.bib

bib-%.html : bib-%.bib
    @echo trying to build $@ after $<

然后另一个。您在html规则中使用自动变量很奇怪,我怀疑这更接近您的意图:

bib-%.bib :
    TMPDIR=. bibtex2html-1.96-osx-x86_64/bib2bib -c 'author : "$*"' -s '$$date' bib.bib

bib-%.html : bib-%.bib
    TMPDIR=. bibtex2html-1.96-osx-x86_64/bibtex2html -d -r --nodoc --nobibsource --no-header --no-footer -o $@ $<