继续翻译

4.10 Multiple Targets in a Rule
===============================

A rule with multiple targets is equivalent to writing many rules, each
with one target, and all identical aside from that.  The same recipe
applies to all the targets, but its effect may vary because you can
substitute the actual target name into the recipe using `$@'.  The rule
contributes the same prerequisites to all the targets also.

   This is useful in two cases.

   * You want just prerequisites, no recipe.  For example:

          kbd.o command.o files.o: command.h

     gives an additional prerequisite to each of the three object files
     mentioned.

   * Similar recipes work for all the targets.  The recipes do not need
     to be absolutely identical, since the automatic variable `$@' can
     be used to substitute the particular target to be remade into the
     commands (*note Automatic Variables::).  For example:

          bigoutput littleoutput : text.g
                  generate text.g -$(subst output,,$@) > $@
     
     is equivalent to

          bigoutput : text.g
                  generate text.g -big > bigoutput
          littleoutput : text.g
                  generate text.g -little > littleoutput

     Here we assume the hypothetical program `generate' makes two types
     of output, one if given `-big' and one if given `-little'.  *Note
     Functions for String Substitution and Analysis: Text Functions,
     for an explanation of the `subst' function.

   Suppose you would like to vary the prerequisites according to the
target, much as the variable `$@' allows you to vary the recipe.  You
cannot do this with multiple targets in an ordinary rule, but you can
do it with a "static pattern rule".  *Note Static Pattern Rules: Static
Pattern.

4.10 一个规则中的多个目的
===============================

和写多个规则,每个规则一个目的的做法比较起来,带有多个目的规则更加便利。同样的片段作用于所有的目的,但是其作用范围可能会变化,因为你可以在片段中通过 $@来替换世纪的目的名。规则也会把同样的前提条件作用于所有的目的。

这在两种情况下有用。

*你只需要 前提条件,不需要片段。例如:

kdo.o command.o files.o: command.h

对这三个目标文件,给出了一个额外的前提条件。

*为所有目的工作的同样的片段。片段不需要绝对唯一,因为自动变量 $@能够替换特定的目的,来重新建立指令(*note Automatic Variables::),例如:

bigoutput littleoutput : text.g
  generate text.g -$(subst output,,$@) > $@

等价于:

bigoutput : text.g
  generate text.g -big > bigoutput

littleoutput : text.g
  generate text.g -little > littleoutput

在此书,我们假定假想的程序 generate 生成两个类型的输出,一个是给出 big 选项的时候,一个是给出little选项的时候。可以参照 *Note Functions for String Substitution and Analysis: Text Functions 中对 subst 函数的解释。

设想一下你将为目的而变换前提条件。正如你用 $@的变量来对片段进行变化那样;你在一个普通的带有多个目的的规则里是不能达成的,但是你可以用 静态模式规则来做到这一点。*Note Static Pattern Rules: Static Pattern。

后文待续