Makefile 带有静态模式的规则失败

Makefile 带有静态模式的规则失败,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile,可以用一个BibTex文件为不同的作者创建HTML发布列表。导出是使用bibtex2html完成的,工作起来很有魅力。但是我被命名规则难住了。我希望makefile尽可能通用,只在新同事开始工作或有人完成博士学位时调整结果列表 工作流程如下所示: 围嘴,围嘴是给你的 将结果中所有作者的出版物提取到单独的文件中:`bib2bib-c'作者:“$*”'bib.bib' 现在每个作者都有文件,例如bib-Author1.bib,bib-Author2.bib 将文件转换为ht

我有一个makefile,可以用一个BibTex文件为不同的作者创建HTML发布列表。导出是使用bibtex2html完成的,工作起来很有魅力。但是我被命名规则难住了。我希望makefile尽可能通用,只在新同事开始工作或有人完成博士学位时调整结果列表

工作流程如下所示:

  • 围嘴,围嘴是给你的
  • 结果中所有作者的出版物提取到单独的文件中:`bib2bib-c'作者:“$*”'bib.bib'
  • 现在每个作者都有文件,例如bib-Author1.bib,bib-Author2.bib
  • 将文件转换为html:
    bibtex2html-d-r-o bib-$@.html bib-$@.bib
  • 现在有一个名为bib-Author1.html、bib-Author2.html等的文件
  • 以下是我一直使用的当前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,它执行all目标。这将调用
    $(result)
    目标,它为result中的每个作者调用bib-%.html目标。 问题来了:调用时,使用混合了隐式和静态模式规则的错误停止


    我想在这里做的是使用静态模式%.html获取规则名称,并将其转换为先决条件%.bib。但很明显,我做错了什么。感谢您的帮助。

    此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 $<
    
    bib-%。bib:
    @echo试图建立$@
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后完成一条规则并验证它是否符合您的要求:

    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 $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-s'$$date'bib.bib
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后是另一个。您在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 $@ $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-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$@$<
    
    在这个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 $<
    
    bib-%。bib:
    @echo试图建立$@
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后完成一条规则并验证它是否符合您的要求:

    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 $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-s'$$date'bib.bib
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后是另一个。您在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 $@ $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-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$@$<
    
    在这个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 $<
    
    bib-%。bib:
    @echo试图建立$@
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后完成一条规则并验证它是否符合您的要求:

    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 $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-s'$$date'bib.bib
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后是另一个。您在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 $@ $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-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$@$<
    
    在这个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 $<
    
    bib-%。bib:
    @echo试图建立$@
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后完成一条规则并验证它是否符合您的要求:

    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 $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-s'$$date'bib.bib
    bib-%.html:bib-%.bib
    @echo试图在之后生成$@个$<
    
    然后是另一个。您在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 $@ $<
    
    bib-%。bib:
    TMPDIR=。bibtex2html-1.96-osx-x86_64/bib2bib-c'作者:“$*”-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$@$<
    
    只是一种预感:
    make-rR
    说了什么?在静态模式规则的所有三个部分中都不能有模式字符(
    %
    )。我并不完全清楚您试图用静态模式规则实现什么。您能否通过给出一个您希望将此静态规则应用于的一些文件名的示例进行扩展?@ReinierTorenbeek谢谢您的回复。我有以下工作流:bib.bib是给定的。从中摘录一位作者的出版物