如何使用Makefiles的“隐含规则链”

时间:2011-07-13 06:48:53

标签: makefile

GNU Make支持``隐式规则链'。我想要实现的是写入Makefile的一个部分来实现这个目的:

  1. 使用命令生成A到B,如:cmd1 A B
  2. 使用命令将B生成为C,如:cmd2 B C
  3. 使用命令将C生成到D中,如:cmd3 C D
  4. A,B,C和D是具有不同扩展名的四个文件(例如,表示.p,.q,.r和.t)。 B和C是我不需要的中间文件,而A是源文件,D是输出。问题是A实际上是一组非常大的文件。所以我想使用Makefile的隐式规则链来实现这一点。但我不知道如何知道中间文件B和C的文件名,如:

    %.t : %.r : %.q : %.r
            cmd1 $< ?
            cmd2 ? ??
            cmd3 ?? $@
    

    在哪里?和??是中间文件的名称。我没有找到关于如何命名这些文件的非常具体的解释。 GNU make手册页仅提供变量表示,例如$&lt;和$ @对我来说不是直接使用的。非常感谢。

1 个答案:

答案 0 :(得分:4)

您应该将规则拆分为单独的部分:

%.t: %.r.tmp
    cmd1 $< $@

%.r.tmp: %.q
    cmd2 $< $@

%.q: %.r
    cmd3 $< $@

当您创建target.t时,将为您生成中间target.r.tmp,target.q,并在最后删除它们。

修改

如果除了cmd2,cmd3以外的任何地方都没有使用中间文件* .r.tmp,*。q,我个人不想创建隐式规则。

虽然“隐式规则链”是一个很好的模式,但对于Makefile,IMO来说并不是必需的。再一次,这只是个人感觉。

%.t: %.r
    cmd1 $<       $*.r.tmp
    cmd2 $*.r.tmp $*.q
    cmd3 $*.q     $@
    rm -f $*.r.tmp $*.q